部署高可用、负载均衡的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.io
docker 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-01
hostnamectl set-hostname node-01
#在192.168.0.202配置hostname为node-02
hostnamectl set-hostname node-02
#在192.168.0.203配置hostname为node-03
hostnamectl set-hostname node-03
#分别修改192.168.0.201、192.168.0.202、192.168.0.203的/etc/hosts文件,增加如下配置
192.168.0.201 node-01
192.168.0.202 node-02
192.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 --permanent
firewall-cmd --zone=public --add-port=13306/tcp --permanent
firewall-cmd --reload -
配置组复制参数分别在192.168.0.201、192.168.0.202、192.168.0.203中创建并编辑配置文件/opt/mysql/conf/my.cnf
mkdir -p /opt/mysql/conf
vim /opt/mysql/conf/my.cnf配置内容如下:
[mysqld]
server_id = 1
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
event_scheduler = 1
lower_case_table_names = 1
default_authentication_plugin = mysql_native_password
# 同步配置
binlog_format = ROW
binlog_checksum = NONE
log_bin = ON
relay_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 = OFF
loose-group_replication_bootstrap_group = OFF
loose-group_replication_single_primary_mode = OFF
loose-group_replication_enforce_update_everywhere_checks = ON
loose-group_replication_ssl_mode = DISABLED
loose-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/bash
mysql -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/bash
mysql -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;
-
2. 部署Keepalived
-
在部署MySQL实例的主机上配置VIP转发规则 分别在192.168.0.201、192.168.0.202、192.168.0.203中配置
ifconfig lo:0 192.168.0.200 broadcast 192.168.0.200 netmask 255.255.255.255 up
route add -host 192.168.0.200 dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce -
配置Keepalived虚拟路由和VIP
-
修改配置文件 分别在192.168.0.191和192.168.0.192上,创建并编辑配置文件/etc/keepalived/keepalived.conf 内容如下:
# 全局配置
global_defs {
router_id LVS_YDISK
}
#同步组
vrrp_sync_group VG_YDISK {
group {
VI_YDISK
}
}
#虚拟路由实例配置
vrrp_instance VI_YDISK {
# 初始状态,MASTER|BACKUP
state MASTER
# 网络接口
interface enp0s3
# 相同的ID属于同一个多播组
virtual_router_id 200
# 优先级,最高的会被选举为MASTER
priority 100
# 虚拟IP列表
virtual_ipaddress {
192.168.0.200
}
}
#虚拟服务配置,通过将此配置用来管理LVS
virtual_server 192.168.0.200 3306 {
# 检查健康检查间隔,以秒为单位
delay_loop 5
# 负载均衡模式 DR|NAT|TUN
lb_kind DR
# 负载均衡算法 rr|wrr|lc|wlc|lblc|sh|dh
lb_algo rr
# 转发协议 TCP|UDP
protocol TCP
# 真实服务配置
real_server 192.168.0.201 3306 {
# 负载权重,权重值越大,优先级越高
weight 1
# 存活检查
TCP_CHECK {
# 超时时间,以秒为单位
connect_timeout 3
}
}
real_server 192.168.0.202 3306 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
real_server 192.168.0.203 3306 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
} -
重启Keepalived 分别在192.168.0.191和192.168.0.192上重启Keepalived
systemctl restart keepalived
-
验证
-
验证MGR
-
通过虚拟IP(192.168.0.200)访问数据库服务
mysql -uroot -p123456 -h 192.168.0.200 -P3306
-
查看组复制成员状态
select * from performance_schema.replication_group_members;
-
-
验证负载均衡
-
可通过ipvsadm命令查 看LVS状态
-
可通过tcpdump抓包来验证负载均衡
-