在 Docker 容器中使用 GreatSQL VIP

GreatSQL Docker 镜像不支持在 Docker 中使用 VIP 功能。原因如下:

  1. 在 Docker 中,无法用 systemd 方式来启动 GreatSQL。

  2. 在打包时,也没有将 mysqld 程序文件属主改为 root,并加上 setcap 提权。

因此,想要在 Docker 中使用 GreatSQL VIP 的话,需要自行处理。下面介绍如何在 Docker 容器中使用 GreatSQL 绑定 VIP 功能。

如果想要在 Docker 中使用 GreatSQL VIP,可以采用以下方式实现:

  1. 创建一个全新容器,并加上 --privileged 参数。

  2. 安装 GreatSQL 软件包(二进制包或 RPM 包都行)。

  3. 修改 mysqld 程序文件属主为 root,并利用 setcap 给 mysqld 程序文件加上提权属性。

  4. 正确配置相关参数。

正常地,在 Docker 容器中是无法执行绑定 VIP 等影响操作系统层的操作,以避免发生安全风险,这就需要先行提权。

想要在 Docker 容器中使用 VIP,在创建容器时,需要先加上 --privileged 参数,例如:

$ docker run -itd --privileged --hostname t1 --name t1 centos:8 bash

进入容器,并查看初始 IP 信息:

[root@t1 /]# 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

接下来,安装 GreatSQL,这里采用 RPM 包方式,具体过程不赘述。

执行提权操作并确认:

[root@t1 /]# setcap CAP_NET_ADMIN,CAP_NET_RAW+ep /usr/sbin/mysqld
[root@t1 /]# chown root:root /usr/sbin/mysqld

[root@t1 /]# getcap /usr/sbin/mysqld
/usr/sbin/mysqld = cap_net_admin,cap_net_raw+ep

[root@t1 /]# ls -la /usr/sbin/mysqld
-rwxr-xr-x 1 root root 67858088 Jul 30 08:18 /usr/sbin/mysqld

修改 /etc/my.cnf 配置文件(只展示部分相关内容):

[mysqld]
...
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
...

在已经完成 GreatSQL 数据初始化操作之后,启动 GreatSQL 服务进程(确认是以 root 身份运行):

[root@t1 /]# /usr/sbin/mysqld &

[root@t1 /]# ps -ef | grep mysqld
root        1518       1  1 07:02 ?        00:00:23 /usr/sbin/mysqld

进入 GreatSQL 查看 VIP 绑定/运行状态:

[root@GreatSQL][(none)]> SHOW GLOBAL VARIABLES LIKE 'greatdb_ha%';
+--------------------------------------------------+---------------------------------------------------+
| Variable_name                                    | Value                                             |
+--------------------------------------------------+---------------------------------------------------+
| greatdb_ha_enable_mgr_vip                        | ON                                                |
| greatdb_ha_force_change_mgr_vip                  | OFF                                               |
| greatdb_ha_gateway_address                       |                                                   |
| greatdb_ha_mgr_exit_primary_kill_connection_mode | OFF                                               |
| greatdb_ha_mgr_read_vip_floating_type            | TO_ANOTHER_SECONDARY                              |
| greatdb_ha_mgr_read_vip_ips                      |                                                   |
| greatdb_ha_mgr_vip_broad                         | 255.255.255.255                                   |
| greatdb_ha_mgr_vip_ip                            | 172.17.0.40                                       |
| greatdb_ha_mgr_vip_mask                          | 255.255.0.0                                       |
| greatdb_ha_mgr_vip_nic                           | eth0                                              |
| greatdb_ha_port                                  | 33062                                             |
| greatdb_ha_send_arp_packge_times                 | 5                                                 |
| greatdb_ha_vip_tope                              | bcd374fc-593c-11ef-a05e-0242ac110004::172.17.0.40 |
+--------------------------------------------------+---------------------------------------------------+
13 rows in set (0.00 sec)

查看 VIP 绑定状态:

[root@t1 /]# 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 是否可连通:

$ ping 172.17.0.40
PING 172.17.0.40 (172.17.0.40) 56(84) bytes of data.
64 bytes from 172.17.0.40: icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from 172.17.0.40: icmp_seq=2 ttl=64 time=0.032 ms
...

可以看到,已经正确绑定 VIP 并且可连通。

Enjoy GreatSQL :)


文章推荐:

想看更多技术好文,点个“在看”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值