部署高可用、负载均衡的MySQL集群服务
悦库网盘集群化由悦库服务集群、MGR(MySQL Group Replication)集群、Ceph存储集群以及虚拟路由器 4个子模块组成,本文指导用户搭建高可用、高扩展以及负载均衡的MySQL数据库集群的搭建,如图中红线框所示部分。

实现方案
通过MySQL组复制实现高可 用与高可扩展性,通过Keepalived配置高可用的负载均衡。
- MySQL组复制(MySQL Group Replication简称MGR)是MySQL官方提供的高可用与高可扩展的解决方案。MGR有两种配置模式:单主模式和多主模式。在单主模式下,一个节点作为可读写的主节点,其他节点作为只读的从节点,当主节点宕掉,分组会在从节点中选举出一个新的主节点。多主模式下,每个节点都作为可读写节点,但在此模式下,不支持SERIALIZABLE级别的事务隔离,对于级联外键约束也有限制。一个组(Group)至少需要3个MySQL实例。 本文中采用多主模式,每个节点均可读写,配合LVS实现负载均衡。
- Keepalived用于对MySQL组复制(MGR)集群的节点进行健康检查,通过LVS提供虚拟IP(VIP)实现MGR集群节点的负载均衡,并通过虚拟路由冗余协议(VRRP)将多个虚拟路由形成路由组,避免Keepalived的单节点故障。
环境准备
准备5台主机,分别安装Ubuntu 18操作系统
-
其中3台主机,安装Docker并拉取MySQL镜像,IP分别为192.168.0.201、192.168.0.202、192.168.0.203形成MGR集群,MySQL版本号为8.0.28
apt install -y docker.iodocker pull mysql:8.0.28 -
其中2台主机,安装Keepalived,IP分别为192.168.0.191、192.168.0.192形成虚拟路由组,并提供虚拟IP(VIP):192.168.0.200
apt install -y keepalived
部署步骤
1. 部署MySQL组复制(MGR)
-
配置hostname和域名解析
#在192.168.0.201配置hostname为node-01hostnamectl set-hostname node-01#在192.168.0.202配置hostname为node-02hostnamectl set-hostname node-02#在192.168.0.203配置hostname为node-03hostnamectl set-hostname node-03#分别修改192.168.0.201、192.168.0.202、192.168.0.203的/etc/hosts文件,增加如下配置192.168.0.201 node-01192.168.0.202 node-02192.168.0.203 node-03 -
分别为192.168.0.201、192.168.0.202、192.168.0.203开放
3306和13306端口firewall-cmd --zone=public --add-port=3306/tcp --permanentfirewall-cmd --zone=public --add-port=13306/tcp --permanentfirewall-cmd --reload -
配置组复制参数分别在192.168.0.201、192.168.0.202、192.168.0.203中创建并编辑配置文件/opt/mysql/conf/my.cnf
mkdir -p /opt/mysql/confvim /opt/mysql/conf/my.cnf配置内容如下:
[mysqld]server_id = 1gtid_mode = ONenforce_gtid_consistency = ONmaster_info_repository = TABLEevent_scheduler = 1lower_case_table_names = 1default_authentication_plugin = mysql_native_password# 同步配置binlog_format = ROWbinlog_checksum = NONElog_bin = ONrelay_log_info_repository = TABLE# 组复制配置plugin_load_add = "group_replication.so"loose-group_replication_group_name = "89c88c78-c46e-11ec-a8aa-0800271ee0d3"loose-group_replication_start_on_boot = OFFloose-group_replication_bootstrap_group = OFFloose-group_replication_single_primary_mode = OFFloose-group_replication_enforce_update_everywhere_checks = ONloose-group_replication_ssl_mode = DISABLEDloose-group_replication_local_address = "192.168.0.201:13306"loose-group_replication_group_seeds = "192.168.0.201:13306,192.168.0.202:13306,192.168.0.203:13306"loose-group_replication_ip_whitelist = "192.168.0.0/24,127.0.0.1"配置说明: 其中server_id和loose-group_replication_local_address要单独配置,其余配置项一致
配置项 值 说明 server_id 1 唯一标识MySQL实例 gtid_mode ON 开启事务的gtid enforce_gtid_consistency ON 强制gtid一致性 master_info_repository TABLE master.info使用数据表方式记录 log_bin ON 开启binlog binlog_format ROW binlog的复制模式 binlog_checksum NONE 不使用binlog校验和 relay_log_info_repository TABLE 作为从库同步事务后,记录至数据表 default_authentication_plugin mysql_native_password 配置用户账户的加密方式 plugin_load_add "group_replication.so" 加载组复制插件 loose-group_replication_group_name "89c88c78-c46e-11ec-a8aa-0800271ee0d3" UUID,分组的节点需配置一致 loose-group_replication_start_on_boot OFF 启动MySQL时不自动开启组复制 loose-group_replication_bootstrap_group OFF 关闭此MySQL实例的组引导 loose-group_replication_single_primary_mode OFF 关闭单主模式,即使用多主模式 loose-group_replication_enforce_update_everywhere_checks ON 在多主模式下,建议开启此选项,严格检查一致性 loose-group_replication_ssl_mode DISABLED 组复制节点通信禁用SSL loose-group_replication_local_address "192.168.0.201:13306" 当前MySQL实例的组复制通信地址 loose-group_replication_group_seeds "192.168.0.201:13306,192.168.0.202:13306,192.168.0.203:13306" 组复制的节点通信地址 loose-group_replication_ip_whitelist "192.168.0.0/24,127.0.0.1" 设置组复制节点通信的IP白名单,同网段可省略 -
启动mysql容器 分别在192.168.0.201、192.168.0.202、192.168.0.203上创建MySQL容器
docker run -itd \--name mysql \--net=host \--restart=always \--privileged=true \-v /opt/mysql/log:/var/log/mysql \-v /home/mysql/data:/var/lib/mysql \-v /opt/mysql/conf:/etc/mysql/conf.d \-e MYSQL_ROOT_PASSWORD=123456 \mysql:8.0.28 -
配置引导节点 在192.168.0.201上配置引导节点,用于初始化组复制的配置
-
登录mysql引导节点
docker exec -it mysql /bin/bashmysql -uroot -p123456 -
配置组复制用户,并启动组复制
-- 创建组复制用户set sql_log_bin=0;create user repl@'%' identified by '666666';grant replication slave on *.* to repl@'%';set sql_log_bin=1;flush privileges;-- 使用账户密码登录其他MySQL节点change master to master_user='repl', master_password='666666' for channel 'group_replication_recovery';-- 启动组复制set global group_replication_bootstrap_group=on;start group_replication;set global group_replication_bootstrap_group=off; -
验证
select * from performance_schema.replication_group_members;
-
-
配置其他节点 分别在192.168.0.202和192.168.0.203上配置从节点
-
登录mysql从节点
docker exec -it mysql /bin/bashmysql -uroot -p123456 -
配置组复制用户,并启用组复制
-- 创建组复制用户set sql_log_bin=0;create user repl@'%' identified by '666666';grant replication slave on *.* to repl@'%';set sql_log_bin=1;flush privileges;-- 使用账户密码登录其他MySQL节点change master to master_user='repl', master_password='666666' for channel 'group_replication_recovery';-- 启动组复制start group_replication;-- 如果启动失败,先重置一次,再启动reset master;start group_replication; -
验证
select * from performance_schema.replication_group_members;
-