基于GTID+Keepalived的半同步主从复制MySQL集群

本文详细描述了如何搭建一个MySQL集群,实现读写分离和GTID半同步主从复制,使用keepalived保证高可用,以及利用ansible进行自动化管理。包括环境准备、配置过程和最终成果,如负载均衡和主从复制测试。
摘要由CSDN通过智能技术生成

一、项目描述

搭建一个MySQL集群,这个MySQL集群能实现读写分离和半同步主从复制,同时利用keepalived来实现集群的高可用,利用ansible批量管理整个集群,确保业务的稳定。

二、项目所用核心技术

MySQL主从复制和读写分离,GTID半同步、keepalived高可用,ansible中控

三、项目环境准备

六台centOS7.9虚拟机,其中三台作为MySQL服务器,一个master服务器,两个slave服务器;两台安装keepalived的MySQLrouter服务器,一台安装ansible的集群管理服务器

附:Linux里安装MySQL

四、项目实现过程

1、规划网络拓扑图

请添加图片描述

2、所有机器关闭selinux和防火墙请添加图片描述

3、配置MySQL集群中的服务器,即在master、slave上安装半同步插件,修改配置文件,并在slave上配置master info信息

  • 在master上安装半同步插件
mysql>install plugin rpl_semi_sync_master soname 'semisync_master.so';
# 在master上设置超时时间为1秒
mysql>set global rpl_semi_sync_master_enabled = 1;
mysql>set global rpl_semi_sync_master_timeout = 1;
  • 修改master的配置文件
vim /etc/my.cnf

[mysqld]
innodb_buffer_pool_size = 1024M
character-set-server=utf8
# 开启二进制文件,设置id为1
log_bin
server_id = 1
# 设置超时时间为1秒
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
  • 修改配置后重启mysql服务
service mysqld restart
  • 在slave上安装半同步插件(注意:和master上的插件有所区别)
mysql>install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
# 设置半同步超时时间为1秒
mysql>set global rpl_semi_sync_slave_enabled=1;
  • 修改slave的配置文件
vim /etc/my.cnf

[mysqld]
# 开启二进制日志,设置slave的id(不同机器的id不同)
log_bin
server_id = 2
# 在slave上设置半同步超时时间为1秒
rpl_semi_sync_slave_enabled=1
  • 修改配置后重启mysql服务
service mysqld restart
  • 在master上新建一个授权用户,给slave复制二进制日志
mysql>grant replication slave on *.* to 'zhou'@'192.168.10.%' identified by 'zhou123#';
  • 导出master上的基础数据
mysqldump -uroot -p'San123#' --all-databases --triggers --routines --events >all_db.SQL
# 将导出的数据传给ansible
scp all_db.SQL root@192.168.10.132:/root
  • 在master和slave上执行以下语句查看是否激活半同步(master上的运行结果如下,slave上的运行结果多一行rpl_semi_sync_slave
    | ACTIVE)
root@(none) 21:20  mysql>SELECT PLUGIN_NAME, PLUGIN_STATUS
    ->        FROM INFORMATION_SCHEMA.PLUGINS
    ->        WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME          | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
+----------------------+---------------+
1 row in set (0.03 sec)
  • 给slave配置master info
mysql>stop slave;
mysql>reset slave all;
mysql>CHANGE MASTER TO MASTER_HOST='192.168.10.133',
 -> MASTER_USER='zhou',
 -> MASTER_PASSWORD='zhou123#',
 -> MASTER_PORT=3306;

mysql>start slave;
mysql>show slave status\G;
  • 显示出 Slave_IO_Running 和 Slave_SQL_Running 都为yes则表示配置成功

请添加图片描述
4、利用ansible与所有服务器建立免密通道并将master上的数据同步到slave

  • 配置ansible
yum install epel-release -y
yum install ansible -y
vim /etc/ansible/hosts
[db]
# 其他三台机器的IP
192.168.10.133	#master
192.168.10.134
192.168.10.135
[dbslaves]
# 其他两台slave的IP
192.168.10.134
192.168.10.135
  • 生成RSA密钥对,并将公钥文件复制到目标主机上的对应文件中,以实现无密码登录(复制公钥文件时需要其他服务都是开启的)
ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub root@(IP)
  • 测试免密通道是否建立成功(在一台机器上ssh其他机器)
ssh 'root@(IP)'
  • 拉取master的基础数据
scp root@192.168.10.133:/root/all_db.SQL .
  • 将拉取到的基础数据传到三台slave上
ansible -m copy -a "src=/root/all_db.SQL dest=/root" dbslaves

5、在基础数据同步后,开启GTID功能

# 在master的配置文件上添加
vim /etc/my.cnf
[mysqld]
gtid-mode=ON
enforce-gtid-consistency=ON

# 在slave的配置文件上添加
vim /etc/my.cnf
[mysqld]
gtid-mode=ON
enforce-gtid-consistency=ON
# 自动更新
log_slave_updates=ON

# 在slave上配置master info信息
mysql>reset master;
mysql>stop slave;
mysql>reset slave all;
mysql>CHANGE MASTER TO MASTER_HOST='192.168.10.133',
 -> MASTER_USER='zhou',
 -> MASTER_PASSWORD='zhou123#',
 -> MASTER_PORT=3306,
 -> master_auto_position=1;
  • 出现Slave_IO_Running 和 Slave_SQL_Running 都为yes,且Auto_Position:1则配置成功

请添加图片描述
6、在另外两台服务器上安装MySQLrouter中间件软件,修改/etc/mysqlrouter里的配置,实现读写分离

  • MySQLrouter软件:https://dev.mysql.com/get/Downloads/MySQL-Router/mysql-router-community-8.0.23-1.el7.x86_64.rpm
# 下载完成后传到机器上,并安装
rpm -ivh mysql-router-community-8.0.23-1.el7.x86_64.rpm

cd /etc/mysqlrouter/

vim mysqlrouter.conf

[logger]
level = INFO

# read-only
[routing:slaves]
# 设置地址为0.0.0.0,以便于后面的vip实现
bind_address = 0.0.0.0:7001
destinations = (slave1的IP):3306,(slave2的IP):3306
mode = read-only
connect_timeout = 1
# write and read
[routing:masters]
bind_address = 0.0.0.0:7002
destinations = (master的IP):3306
mode = read-write
connect_timeout = 2
# 启动mysqlrouter服务
service mysqlrouter restart

# 查看端口监听情况
yum install net-tools -y
netstat -anplut|grep mysql
  • 得到以下结果,则配置完成

请添加图片描述

  • 在master上创建测试账号,检测是否能完成读写分离

请添加图片描述
请添加图片描述
4、在两台MySQLrouter服务器上安装keepalived,在keepalived里配置两个实例,实现双vip,互为master和backup,提高可用性

参考keepalived配置文档:基于Keepalived的nginx高可用架构

5、测试集群能否实现主从复制
在master上面更改数据库的内容,slave上的数据也能随之变化

五、项目成果:

实现MySQL的半同步主从复制和读写分离;
实现两台MySQLrouter之间的负载均衡;
实现利用keepalived提高了集群可用性;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值