基于docker容器建立的MRG集群,如何实现VIP
本帖最后由 lingoYS 于 2024-8-13 19:12 编辑叶哥,你好:
问题如题。
我用最新的 registry.cn-beijing.aliyuncs.com/greatsql/greatsql:8.0.32-26 版本,建立好MGR集群之后,想顺便测试下greatdb_ha的高可用插件,实现VIP漂移功能。
但是我发现始终搞不定,参考了https://greatsql.cn/docs/8.0.32-25/5-enhance/5-2-ha-mgr-vip.html 里面的关于内核权限的配置,方法1貌似不行,容器的mysqld的进程不是基于systemd来管理的;方法2设置了不行,方法3我把mysql加到了root用户组也不行。
其中,方法2的不行,有可能是文章尾部的注意事项的第二条:”需要保证登录系统的用户和启动mysqld的用户保持一致“导致,但是我不知道怎么处理?麻烦问下容器里怎么实现VIP,谢谢叶哥。
日志中的报错信息类似于:
2024-08-11T23:50:09.185756+08:00 0 Plugin greatdb_ha reported: 'bind AF_INET SIOCSIFADDR Operation not permitted'
2024-08-11T23:50:09.185796+08:00 0 Plugin greatdb_ha reported: 'try to bind vip : 172.16.0.10 failed' 不建议在Docker里使用VIP,意义不大。
非要用的话,可以参考这位同学的做法https://gitee.com/GreatSQL/GreatSQL/issues/I9VTF8?from=project-issue yejr 发表于 2024-8-12 11:52
不建议在Docker里使用VIP,意义不大。
非要用的话,可以参考这位同学的做法https://gitee.com/GreatSQL/ ...
话是这么说不错,但是处于技术的研究层面,还是想把它实现了。
这个引用的连接里说到:“感谢大佬的支持,在容器里面setcap加上NET_ADMIN的权限就能设vip,我们在centos7.9容器里面是可以正常设置vip并开启集群的,这个欧拉里面就不行,但是我们现在因国产化替代,必须要使用欧拉的系统,大佬有没有什么处理思路”
他在容器里setcap加上NET_ADMIN的权限就能设vip,而我就是不行,试了好几次,有点搞不明白了,容器肯定是支持VIP的,我手动操作网卡都可以,但是启动MGR就报没权限,无语 lingoYS 发表于 2024-8-13 09:58
话是这么说不错,但是处于技术的研究层面,还是想把它实现了。
这个引用的连接里说到:“感谢大佬的支持 ...
我猜应该是在启动容器时,要加上--privileged 参数提权,不过还是再次强调仅用于实验。 yejr 发表于 2024-8-13 10:39
我猜应该是在启动容器时,要加上--privileged 参数提权,不过还是再次强调仅用于实验。 ...
这个我是加了的:
docker run --privileged -d \
--name mgr1\
--hostname=mgr1 \
--net=mgr-net \
--ip 172.19.0.21 \
--add-host "mgr1:172.19.0.21" \
--add-host "mgr2:172.19.0.22" \
--add-host "mgr3:172.19.0.23" \
-e TZ="Asia/Shanghai" \
-e MYSQL_ROOT_PASSWORD='Abc_123456' \
-e MYSQL_IBP=128M \
-e MYSQL_MGR_NAME='aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1' \
-e MYSQL_MGR_LOCAL='mgr1:33061' \
-e MYSQL_MGR_SEEDS='mgr1:33061,mgr2:33061,mgr3:33061' \
-e MYSQL_INIT_MGR=1 \
-e MYSQL_MGR_USER='repl' \
-e MYSQL_MGR_USER_PWD='repl@8888' \
-e MAXPERF=0 \
registry.cn-beijing.aliyuncs.com/greatsql/greatsql:8.0.32-25 lingoYS 发表于 2024-8-13 10:52
这个我是加了的:
docker run --privileged -d \
--name mgr1\
对了,说到这,我正好顺便建议一下叶哥,可以在官网和git的文档中,增加 -e TZ="Asia/Shanghai" 参数,这样时区就对了,否则系统时间和日志时间都晚了8小时。 lingoYS 发表于 2024-8-13 10:54
对了,说到这,我正好顺便建议一下叶哥,可以在官网和git的文档中,增加 -e TZ="Asia/Shanghai" 参数,这 ...
谢谢建议,我自己先测试验证下 :) lingoYS 发表于 2024-8-13 10:52
这个我是加了的:
docker run --privileged -d \
--name mgr1\
GreatSQL Docker镜像的确不支持在Docker中使用VIP功能。原因如下:
1. 在Docker中,无法用systemd方式来启动GreatSQL。
2. 在打包时,也没有将mysqld程序文件属主改为root,并加上setcap属性。
如果想要在Docker中使用GreatSQL VIP特性,可以采用以下方式实现:
1. 创建一个全新centos容器,并加上 --privileged 参数。
2. 自行安装GreatSQL软件包(二进制包或RPM包都行),利用setcap给mysqld程序文件加上提权属性。
3. 修改 mysqld 程序文件属主为 root。
4. 正确配置相关参数。
参考过程如下所示
# 创建容器
docker run -itd --privileged --hostname t1 --name t1 registry.cn-beijing.aliyuncs.com/greatsql/centos bash
# 在容器中查看初始ip
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
233: eth0@if234: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
# 修改my.cnf
user = root
loose-plugin_load_add = 'greatdb_ha.so'
loose-greatdb_ha_enable_mgr_vip = ON
loose-greatdb_ha_mgr_vip_nic = 'eth0'
loose-greatdb_ha_mgr_vip_ip = '172.17.0.40'
loose-greatdb_ha_mgr_vip_mask = '255.255.0.0'
loose-greatdb_ha_port = 33062
#loose-greatdb_ha_mgr_read_vip_ips = "172.17.0.41,172.17.0.42"
loose-greatdb_ha_mgr_read_vip_floating_type = "TO_ANOTHER_SECONDARY"
loose-greatdb_ha_send_arp_packge_times = 5
loose-greatdb_ha_mgr_exit_primary_kill_connection_mode = OFF
report_host = 172.17.0.4
report_port = 3306
# setcap提权及修改文件属主
chown root:root /usr/sbin/mysqld
setcap CAP_NET_ADMIN,CAP_NET_RAW+ep /usr/sbin/mysqld
# getcap /usr/sbin/mysqld
/usr/sbin/mysqld = cap_net_admin,cap_net_raw+ep
# ls -la /usr/sbin/mysqld
-rwxr-xr-x 1 root root 67858088 Jul 30 08:18 /usr/sbin/mysqld
# 启动,务必确认以root身份启动
/usr/sbin/mysqld &
# ps -ef | grep mysqld
root 1518 15 15 07:02 pts/1 00:00:00 /usr/sbin/mysqld
# 再次查看ip
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
233: eth0@if234: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet 172.17.0.40/16 brd 172.17.255.255 scope global secondary eth0:0
valid_lft forever preferred_lft forever
可以看到,已经能正确绑定VIP了。
以上操作基于 GreatSQL 8.0.32-26 版本。
yejr 发表于 2024-8-13 15:03
GreatSQL Docker镜像的确不支持在Docker中使用VIP功能。原因如下:
1. 在Docker中,无法用systemd方式来启 ...
GreatSQL 文档中也已更新 https://greatsql.cn/docs/8.0.32-26/5-enhance/5-2-ha-mgr-vip.html