一、项目描述
搭建一个MySQL集群,这个MySQL集群能实现读写分离和半同步主从复制,同时利用keepalived来实现集群的高可用,利用ansible批量管理整个集群,确保业务的稳定。
二、项目所用核心技术
MySQL主从复制和读写分离,GTID半同步、keepalived高可用,ansible中控
三、项目环境准备
六台centOS7.9虚拟机,其中三台作为MySQL服务器,一个master服务器,两个slave服务器;两台安装keepalived的MySQLrouter服务器,一台安装ansible的集群管理服务器
四、项目实现过程
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提高了集群可用性;