部署高可用、负载均衡的MySQL集群服务
- 2022-05-09 10:12:00
- 高玉浩 原创
- 3323
实现方案
通过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中创建并编辑配置文件/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
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 \
-v /opt/mysql/log:/var/log/mysql \
-v /opt/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抓包来验证负载均衡
与我们交流和获得帮助
如果您遇到问题可以联系我们,我们和其他老用户会帮助您,不要一个人孤独的努力。
QQ群:450448657 微信 : 19963860417
发表评论
联系我们
联系人: | 高先生 |
---|---|
电话: | 19963860417 |
Email: | service@ydisk.cn |
QQ: | 480247680 |
微信: | 19963860417 |
地址: | 青岛市黄岛区井冈山路157号中南金石国际广场A座3202室 |