§ 单 VLAN 高可用
本文档主要介绍在单 VLAN 场景中,如何基于 GreatSQL + VIP 构建高可用架构。
GreatSQL 支持在单主(Single-Primary)模式下,在读写节点绑定动态 VIP,使得高可用切换更便捷。
整体架构图如下所示:

§ 启用内置 VIP 插件
- 开启新插件
plugin_load_add=greatdb_ha.so
1
或者在启动数据库实例后,执行
INSTALL PLUGIN greatdb_ha SONAME 'greatdb_ha.so';
1
§ 新增配置参数
- 配置开启内置 VIP 功能
loose-greatdb_ha_enable_mgr_vip = ON
1
- 配置 Primary 节点绑定的 VIP
loose-greatdb_ha_mgr_vip_ip = "172.17.140.250"
1
- 配置 ARP 包广播重复次数。当节点绑定浮动 IP 以后,会广播 ARP 包来更新广播域内的 ARP 缓存,此参数是广播次数,默认是 5 次,合法取值范围为 3-20
loose-greatdb_ha_send_arp_packge_times = 5
1
- 配置要绑定的网卡名,插件会将 VIP 绑定到 MGR 主(Primary)节点所在机器的指定网卡上,比如配置为 eth0,为了防止网卡原有的 IP 被覆盖,实际绑定后,会绑定在名为 eth0:0 的网卡上
loose-greatdb_ha_mgr_vip_nic = 'eth0'
1
- 配置掩码
loose-greatdb_ha_mgr_vip_mask = '255.255.255.0'
1
- 目前只支持在单主模式下才能启用内置 VIP 特性,所以还需要设置下面参数:
loose-group_replication_single_primary_mode = ON
loose-group_replication_enforce_update_everywhere_checks = OFF
1
2
2
- 参数
greatdb_ha_port已废弃不再使用,改为通过 MySQL 3306 端口进行 UDF 通信。 - 参数
greatdb_ha_mgr_vip_broad已废弃不再使用。 - 上述参数如果没有配置,或者配置格式不对时,内置 VIP 功能会失效(目前没有格式检查报错的功能)。
- 除了上述新增参数,其他 MGR 相关参数按照常规单主 MGR 配置要求即可。
- 上述参数支持在线动态修改。
上述配置说明的完整示例如下(MGR 组内每个实例都需要配置):
[mysqld]
#GreatSQL MGR vip
plugin-load-add=greatdb_ha.so
loose-greatdb_ha_enable_mgr_vip = ON
loose-greatdb_ha_mgr_vip_ip = "172.17.140.250"
loose-greatdb_ha_mgr_vip_mask = "255.255.255.0"
loose-greatdb_ha_mgr_vip_nic = "eth0"
loose-greatdb_ha_send_arp_packge_times = 5
report_host = "172.17.140.10"
report_port = 3306
#single-primary mode
loose-group_replication_single_primary_mode = ON
loose-group_replication_enforce_update_everywhere_checks = OFF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
当 MGR Primary 节点上绑定的 VIP 被手动删除或者出现异常配置导致 VIP 绑定行为不对时,可以通过在 MGR Primary 节点上执行 set global greatdb_ha_force_change_mgr_vip = on 命令去重新获取 MGR 拓扑结构,从而重新绑定 VIP,该命令执行之后,参数 greatdb_ha_force_change_mgr_vip 值仍然为 off,这个是符合预期的行为。
§ 启动说明
配置 VIP 需要相关内核权限,获取相关权限有两种方式,以下三选一即可(推荐采用方法一):
- 【推荐方法】修改 systemd 服务文件,增加 AmbientCapabilities 参数,例如:
[Unit]
Description=GreatSQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
# some limits
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=65535
# processes/threads
LimitNPROC=65535
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
User=mysql
Group=mysql
Type=notify
TimeoutSec=10
PermissionsStartOnly=true
ExecStartPre=/usr/local/GreatSQL-8.0.32-25-Linux-glibc2.28-x86_64/bin/mysqld_pre_systemd
ExecStart=/usr/local/GreatSQL-8.0.32-25-Linux-glibc2.28-x86_64/bin/mysqld $MYSQLD_OPTS
EnvironmentFile=-/etc/sysconfig/mysql
Restart=on-failure
RestartPreventExitStatus=1
Environment=MYSQLD_PARENT_PID=1
PrivateTmp=false
#增加这行以保证MGR VIP功能可用
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
然后执行 systemctl daemon-reload 重新加载 systemd 服务,启动 GreatSQL 就可以。
备注:感谢社区用户 芬达 提供的建议方法。
- 通过
setcap命令为 mysqld 二进制文件添加CAP_NET_ADMIN和CAP_NET_RAW的 capability。具体命令如下:
#执行该命令需要 sudo 权限或 root
setcap CAP_NET_ADMIN,CAP_NET_RAW+ep /usr/local/GreatSQL-8.0.32-25-Linux-glibc2.28-x86_64/bin/mysqld
1
2
2
然后将 GreatSQL 二进制包的 lib/private 子目录加载到 LD_LIBRARY_PATH 中:
$ cat /etc/ld.so.conf.d/greatsql.conf
/usr/local/GreatSQL-8.0.32-25-Linux-glibc2.28-x86_64/lib/private
1
2
3
2
3
执行 ldconfig && ldconfig -p | grep -i libpro 确认配置无误:
$ ldconfig && ldconfig -p | grep -i 'libprotobuf.so'
libprotobuf.so.3.19.4 (libc6,x86-64) => /usr/local/GreatSQL-8.0.32-25-Linux-glibc2.28-x86_64/lib/private/libprotobuf.so.3.19.4
1
2
3
2
3
之后启动 GreatSQL 即可。
- 【强烈不推荐】给 mysqld 进程的启动用户,例如是 mysql 用户,设置 root 权限。
注意
- 建议采用
systemd方式管理 GreatSQL 服务,或者对启动用户(如 mysql)开启 sudo 权限,利用 sudo 调用systemd再启动 GreatSQL 服务,这样能确保 mysqld 进程可获得内核权限,成功绑定 VIP。 - 当
setcap命令为 mysqld 二进制文件添加 capability 以后,需要保证登录系统的用户和启动 mysqld 的用户保持一致,才能确保 mysqld 进程可获得内核权限。例如:用 root 用户登录系统,然后再以普通用户(mysql)启动 mysqld 进程,setcap 无法生效,绑定 VIP 时会失败报错。
扫码关注微信公众号
