GreatSQL社区

搜索

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

558 21 2024-8-12 10:41
全部回复(21)
yejr 2024-8-13 15:44:48
lingoYS 发表于 2024-8-13 10:54
对了,说到这,我正好顺便建议一下叶哥,可以在官网和git的文档中,增加 -e TZ="Asia/Shanghai" 参数,这 ...

建议已采纳,已更新到 GreatSQL-Docker 仓库中,并将您加到致谢列表中 :)
lingoYS 2024-8-13 18:08:05
yejr 发表于 2024-8-13 15:44
建议已采纳,已更新到 GreatSQL-Docker 仓库中,并将您加到致谢列表中 :)

不客气
lingoYS 2024-8-13 18:09:47
yejr 发表于 2024-8-13 15:03
GreatSQL Docker镜像的确不支持在Docker中使用VIP功能。原因如下:
1. 在Docker中,无法用systemd方式来启 ...

我下午就是在研究这个问题,确实如叶哥所言,
我自己单独基于CentOS 7.8 构建了一个docker容器,然后用二进制的方式安装,一步步过来确实是可以的。但是我确实也多么希望官方的镜像也支持啊
yejr 2024-8-13 19:13:13
lingoYS 发表于 2024-8-13 18:09
我下午就是在研究这个问题,确实如叶哥所言,
我自己单独基于CentOS 7.8 构建了一个docker容器,然后用二 ...

这么做存在安全风险,有需要的话可以自己构建哈 :)
lingoYS 2024-8-13 21:16:33
yejr 发表于 2024-8-13 15:03
GreatSQL Docker镜像的确不支持在Docker中使用VIP功能。原因如下:
1. 在Docker中,无法用systemd方式来启 ...

其实这里面一个配置的关键就是:
# 修改my.cnf
user = root

之前的问题就是这一步一直没有做,我知道做了这一步一定能解决权限问题。
我就是在想systemd服务定义文件中,有下面的定义:
[Service]
User=mysql
Group=mysql

这也就是说,我用root用户登录到主机,然后systemctl start mysqld的时候,他数据库其实内部是用的mysql用户,同样,到docker容器,创建的时候,不指定用户,应该就是root,而且我看了gitee官方的镜像对应的Dockerfile,也没有刻意指定用户。所以就纳闷了,理论上docker容器和宿主机服务器都应该一样啊,怎么容器就不行了,而且我看了容器里mysqld文件的属主默认就是root,实在不知道原因,其实到现在也没想明白。
lingoYS 2024-8-13 21:20:05
lingoYS 发表于 2024-8-13 21:16
其实这里面一个配置的关键就是:
# 修改my.cnf
user = root

ac36f55d-73c7-438e-a8de-48fd7653cce6.png 我就盯着这句话理解了好久
lingoYS 2024-8-13 21:24:29
lingoYS 发表于 2024-8-13 21:20
我就盯着这句话理解了好久

最后再补充下,my.cnf文件中,设置了user=root之后,确实能绑定VIP了,但是我看日志还有有下面的内容:
[ERROR] [MY-000000] [Server] Plugin greatdb_ha reported: 'try to bind vip : 172.19.0.10 failed'
相比之前,只是少了下面一行:
SIOCSIFADDR: Operation not permitted   
yejr 2024-8-14 08:26:58
lingoYS 发表于 2024-8-13 21:24
最后再补充下,my.cnf文件中,设置了user=root之后,确实能绑定VIP了,但是我看日志还有有下面的内容:
[ ...

https://greatsql.cn/docs/8.0.32- ... %BD%BF%E7%94%A8-vip  这里已经提供了实现的思路
yejr 2024-8-14 09:08:20
lingoYS 发表于 2024-8-13 21:16
其实这里面一个配置的关键就是:
# 修改my.cnf
user = root

GreatSQL启动时的用户是在 /etc/my.cnf 里指定的,不是在 Dockerfile 里指定的
mysqld 进程文件属主是 root 没用,还得是启动时运行的那个用户是 root 才行,也就是必须保证 my.cnf 里指定了 user=root 或者启动mysqld时加上 --user=root 参数。
lingoYS 2024-8-14 10:33:02
本帖最后由 lingoYS 于 2024-8-14 10:58 编辑
yejr 发表于 2024-8-14 09:08
GreatSQL启动时的用户是在 /etc/my.cnf 里指定的,不是在 Dockerfile 里指定的
mysqld 进程文件属主是 ro ...

叶老师,对技术的研究方面,我算是一个比较顶真的性格
对您这个回复我个人还是有点疑义的。

我结合以下几点以及我的测试结论来说:
1、首先有几点共识:
(1)systemd管理服务的情况分析:
对于rpm安装的方式,一般安装和systemctl操作服务都是用的root用户,操作VIP都没啥问题。
此时查看 /etc/systemd/system/multi-user.target.wants/mysqld.service 文件,有如下内容:
  1. [Service]
  2. User=mysql
  3. Group=mysql
  4. ......
  5. # 增加这行以保证MGR VIP功能可用
  6. AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW
复制代码
mysqld.service 文件中的User和Group参数定义了MySQL服务进程将以哪个用户和组来运行,这里显然是mysql用户而不是root用户来启动的mysqld进程,实际 情况我用ps -ef | grep mysql 查看到的mysqld进程的启动用户就是mysql,查看my.cnf中默认并没有主动配置user=root的选项,而咱们都知道数据库systemctl启动环境和当前登录shell的操作用户是root。

(2)关于my.cnf中的user选项
通常情况下,MySQL的默认配置文件中的[mysqld]部分的user参数会被默认设置为mysql用户,这是为了确保MySQL服务在一个安全的环境下运行。
对于如下配置:
  1. [mysqld]
  2. user=mysql
复制代码
这里 user=mysql 表示mysqld进程将以mysql用户的身份运行,也是官方推荐的安全方式,如果换成root,一旦数据库被攻击,那黑客有可能通过数据库去对系统做更深层次的攻击。

(3)关于Dockerfile中的USER指令Dockerfile中的USER指令,是指的使用 USER 指定用户后,Dockerfile 中后续的命令 RUN、CMD、ENTRYPOINT 都将使用该用户的身份来运行。
这一点其实很关键,这就是我查看官方镜像对应的Dockerfile的原因。


2、我的实验过程:
为了搞清楚VIP的支持性,与系统shell当前登录的操作用户、以及启动mysqld服务的用户,这三者之间的关系,我做了实验。
前面回复中也提到,我基于CentOS7.8的镜像,增加了privileged选项,启动一个容器,然后root身份登录进去操作,参考了贵司官网的手册 https://greatsql.cn/docs/8.0.32- ... anolis-install.html (这个是龙蜥系统的安装,因为我也在研究国产化的东西,文章里面有手动启动mysqld服务的步骤),以二进制的方式安装,这其中创建了mysql(非shell登录的)用户:
  1. /sbin/groupadd mysql
  2. /sbin/useradd -g mysql mysql -d /dev/null -s /sbin/nologin
复制代码
然后就是常规的配置操作(my.cnf没有主动配置user=root),同时没有使用systemd的机制,想手动启动mysqld数据库服务来验证VIP的配置和支持情况(这么做其实是因为GreatSQL的镜像也没有使用systemd)。此时,mysqld属主是root,并且用setcap设置了CAP_NET_ADMIN,CAP_NET_RAW权限。

先初始化:
  1. mysqld --defaults-file=/etc/my.cnf --initialize-insecure --user=mysql
复制代码
然后用下面命令启动:
  1. mysqld --defaults-file=/etc/my.cnf &
复制代码
报错:Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!
因为当前登录容器的用户是root,用root直接启动mysqld被认为不安全。

所以接下来,我改用下面的命令操作(此时在容器中我还是root用户的shell):
  1. sudo -u mysql /usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64/bin/mysqld --defaults-file=/etc/my.cnf &
复制代码
也就是指定用mysql这个系统用户来运行,就可以了。
这种情况下,我测试启动MGR之后,是支持VIP特性的。

所以开始我就一直搞不明白,为啥官方的镜像不支持,他不就是通过根路径下的 greatsql-init.sh 脚本来直接启动mysqld服务的么,而且启动之后,进程属主是mysql用户,我就是在做类比。

基于官方镜像,要支持VIP,只要修改my.cnf中的 user=root 固然能解决问题,但是这样有安全风险,而且这种下mysqld文件都压根犯不着去设置CAP_NET_ADMIN,CAP_NET_RAW权限,所以这个页面https://greatsql.cn/docs/8.0.32-26/5-enhance/5-2-ha-mgr-vip.html中最后一节“$ 在 Docker 容器中使用 VIP”说到的提权操作我感觉都不必要了。所以我的强迫症来了。

叶哥,不知道我这么描述说清楚了没有。


合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

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