GreatSQL社区

搜索

[已解决] 基于docker容器建立的MRG集群,如何实现VIP

562 21 2024-8-12 10:41
本帖最后由 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,谢谢叶哥。
全部回复(21)
lingoYS 2024-8-12 11:49:17
日志中的报错信息类似于:
2024-08-11T23:50:09.185756+08:00 0 [ERROR] [MY-000000] [Server] Plugin greatdb_ha reported: 'bind AF_INET SIOCSIFADDR Operation not permitted'
2024-08-11T23:50:09.185796+08:00 0 [ERROR] [MY-000000] [Server] Plugin greatdb_ha reported: 'try to bind vip : 172.16.0.10 failed'
yejr 2024-8-12 11:52:52
不建议在Docker里使用VIP,意义不大。

非要用的话,可以参考这位同学的做法  https://gitee.com/GreatSQL/Great ... ?from=project-issue
lingoYS 2024-8-13 09:58:34
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就报没权限,无语
yejr 2024-8-13 10:39:37
lingoYS 发表于 2024-8-13 09:58
话是这么说不错,但是处于技术的研究层面,还是想把它实现了。
这个引用的连接里说到:“感谢大佬的支持 ...

我猜应该是在启动容器时,要加上  --privileged 参数提权,不过还是再次强调仅用于实验。
lingoYS 2024-8-13 10:52:31
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:54:16
lingoYS 发表于 2024-8-13 10:52
这个我是加了的:
docker run --privileged -d \
--name mgr1  \

对了,说到这,我正好顺便建议一下叶哥,可以在官网和git的文档中,增加 -e TZ="Asia/Shanghai" 参数,这样时区就对了,否则系统时间和日志时间都晚了8小时。
yejr 2024-8-13 12:03:01
lingoYS 发表于 2024-8-13 10:54
对了,说到这,我正好顺便建议一下叶哥,可以在官网和git的文档中,增加 -e TZ="Asia/Shanghai" 参数,这 ...

谢谢建议,我自己先测试验证下 :)
yejr 2024-8-13 15:03:37
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. 正确配置相关参数。

参考过程如下所示
  1. # 创建容器
  2. docker run -itd --privileged --hostname t1 --name t1 registry.cn-beijing.aliyuncs.com/greatsql/centos bash

  3. # 在容器中查看初始ip
  4. [root@t1 GreatSQL]# ip a
  5. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  6.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  7.     inet 127.0.0.1/8 scope host lo
  8.        valid_lft forever preferred_lft forever
  9. 233: eth0@if234: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  10.     link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
  11.     inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
  12.        valid_lft forever preferred_lft forever

  13. # 修改my.cnf
  14. user = root
  15. loose-plugin_load_add = 'greatdb_ha.so'
  16. loose-greatdb_ha_enable_mgr_vip = ON
  17. loose-greatdb_ha_mgr_vip_nic = 'eth0'
  18. loose-greatdb_ha_mgr_vip_ip = '172.17.0.40'
  19. loose-greatdb_ha_mgr_vip_mask = '255.255.0.0'
  20. loose-greatdb_ha_port = 33062
  21. #loose-greatdb_ha_mgr_read_vip_ips = "172.17.0.41,172.17.0.42"
  22. loose-greatdb_ha_mgr_read_vip_floating_type = "TO_ANOTHER_SECONDARY"
  23. loose-greatdb_ha_send_arp_packge_times = 5
  24. loose-greatdb_ha_mgr_exit_primary_kill_connection_mode = OFF
  25. report_host = 172.17.0.4
  26. report_port = 3306

  27. # setcap提权及修改文件属主
  28. chown root:root /usr/sbin/mysqld
  29. setcap CAP_NET_ADMIN,CAP_NET_RAW+ep /usr/sbin/mysqld

  30. [root@t1 GreatSQL]# getcap /usr/sbin/mysqld
  31. /usr/sbin/mysqld = cap_net_admin,cap_net_raw+ep
  32. [root@t1 GreatSQL]# ls -la /usr/sbin/mysqld
  33. -rwxr-xr-x 1 root root 67858088 Jul 30 08:18 /usr/sbin/mysqld

  34. # 启动,务必确认以root身份启动
  35. /usr/sbin/mysqld &

  36. [root@t1 GreatSQL]# ps -ef | grep mysqld
  37. root        1518      15 15 07:02 pts/1    00:00:00 /usr/sbin/mysqld

  38. # 再次查看ip
  39. [root@t1 GreatSQL]# ip a
  40. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  41.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  42.     inet 127.0.0.1/8 scope host lo
  43.        valid_lft forever preferred_lft forever
  44. 233: eth0@if234: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  45.     link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
  46.     inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
  47.        valid_lft forever preferred_lft forever
  48.     inet 172.17.0.40/16 brd 172.17.255.255 scope global secondary eth0:0
  49.        valid_lft forever preferred_lft forever      
复制代码


可以看到,已经能正确绑定VIP了。

以上操作基于 GreatSQL 8.0.32-26 版本。
yejr 2024-8-13 15:34:51
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
123下一页
lingoYS

3

主题

0

博客

35

贡献

注册会员

Rank: 2

积分
65

助人为乐(铜)

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2024-11-23 16:13 , Processed in 0.022465 second(s), 20 queries , Redis On.
快速回复 返回顶部 返回列表