电话咨询
微信咨询
199 6386 0417
扫码添加客服

部署高可用、负载均衡的MySQL集群服务

2022-05-09 10:12:00
高玉浩
原创
743
摘要:悦库网盘集群化由悦库服务集群、MGR(MySQL Group Replication)集群、Ceph存储集群以及虚拟路由器 4个子模块组成,本文指导用户搭建高可用、高扩展以及负载均衡的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中创建并编辑配置文件/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室