目录
环境的配置
系统配置
新建6台虚拟机,改名为mysql-master1,mysql-master2,mysql-slave1,mysql-slave2,mysql-delay1,mysql-delay2,并完成mysql的安装部署
在/etc/hosts下加入各机器的域名
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.109.167 mysql-master1
192.168.109.164 mysql-slave1
192.168.109.169 mysql-delay1
192.168.109.163 mysql-master2
192.168.109.165 mysql-slave2
192.168.109.168 mysql-delay2
建立免密通道方便文件的传输
##在6台机器上均建立密钥对
ssh-keygen -t rsa
##将master1和master2的公钥相互交换(除了第一次连接时输入yes和用户密码其他均回车跳过即可)
#在master1上
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@mysql-master2
#在master2上
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@mysql-master1
##master与2个备库之间再互相交换
#slave和delay上
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@mysql-master1
#master上
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@mysql-slave1
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@mysql-delay1
效果如下:
MySQL配置
在/etc/my.cnf中开启二进制日志和GTID并创建server_id
#在[mysqld]下加入
server_id=1 #server_id为唯一标识不能冲突
log_bin #开启二进制日志
gitd-mode=ON #开启gtid模式
enforce-gtid-consistency=ON #设置gtid强制同步
log_slave_updates=ON #将复制操作也写入本地二进制日志
全备并保持各个数据库一致性
导出master1的所有数据(master2当然也可以,只要最终所有库数据一致即可)
mysqldump -uroot -p'123456' --all-databases >/backup/$(date date +%F_%H-%M-%S-mysql_all_backup).sql
master1中输入(注意输入自己的备份文件名)
scp /backup/2022-08-18_17-32-48-mysql_all_backup.sql root@mysql-slave1:/root
scp /backup/2022-08-18_17-32-48-mysql_all_backup.sql root@mysql-delay1:/root
scp /backup/2022-08-18_17-32-48-mysql_all_backup.sql root@mysql-master2:/root
然后再master2中输入(注意输入自己的备份文件名)
scp /backup/2022-08-18_17-32-48-mysql_all_backup.sql root@mysql-slave2:/root
scp /backup/2022-08-18_17-32-48-mysql_all_backup.sql root@mysql-delay2:/root
除master1中输入
mysql -uroot -p'123456' </root/2022-08-18_17-32-48-mysql_all_backup.sql
最终目的是保持各个数据库的一致性
复制账户的建立与授权
主备之间
#master2主备之间记得改用户名和准许ip
create user 'mysql_slave1'@'192.168.109.164' identified by '123456'
create user 'mysql_delay1'@'192.168.109.169' identified by '123456'
#授权
grant replication slave on *.* to 'mysql_slave1'@'192.168.109.164';
grant replication slave on *.* to 'mysql_delay1'@'192.168.109.169';
主主之间按上述操作互相建立即可
GTID集群搭建
时间同步
yum -y install chrony
systemctl enable chronyd
systemctl start chronyd
修改slave信息与master建立联系
#主主之间、主备之间都要
change master to master_host='192.168.109.167',
master_user='mysql_master2',
master_password='123456',
master_port=3306,
master_auto_position=1;
在delay上加入延迟信息
CHANGE MASTER TO MASTER_DELAY = 600;
验证
show slave status\G
关注以下参数
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
SQL_Delay: 600 #延迟备份时间,只有delay上有
复制测试
在maste2的备库和master1均复制成功:
10分钟后delay库也复制成功:
删除测试
master2和slave1:
delay:
delay库因为延迟复制十分钟之内依旧保留了link_test库,十分钟后:
读写分离
使用mysqlrouter作为中间件控制读写分离,外界对数据库集群的操作发送到mysqlrouter上再由mysqlrouter调控
在我的架构中,可以采用两台mysqlrouter改变master-salve1和master-slave2的顺序来模拟不同地区异地备份的情况下减少读写的延迟
新创建一台虚拟机下载并安装mysql-routet
wget https://dev.mysql.com/get/Downloads/MySQL-Router/mysql-router-community-8.0.30-1.el7.x86_64.rpm
rpm -ivh mysql-router-community-8.0.30-1.el7.x86_64.rpm
修改配置文件
在mysqlrouter配置文件下加入这几行(注意删除注释,否则会报错)
vim /etc/mysqlrouter/mysqlrouter.conf
[routing:read_write]
bind_address = 192.168.109.166 #mysql-router的ip地址
bind_port = 7001 #7001默认为读写端口
mode = read-write #模式为可读可写
destinations = 192.168.109.163:3306,192.168.109.167:3306 #mysql-master的ip
max_connections = 65535 #最大连接数
max_connect_error = 100 #指定允许连接不成功的最大尝试次数
client_connect_timeout = 9 #客户端连接超时时间
[routing:read_only]
bind_address = 192.168.109.166 #mysql-router的ip地址
bind_port = 7002 #7002默认为读端口
mode = read-only #模式为只读
destinations = 192.168.109.165:3306,192.168.109.164:3306 #mysql-slave的ip
max_connections = 65535
max_connect_errors = 100
重启服务并检查端口
service mysqlrouter restart
netstat -aplunt|grep mysql
tcp 0 0 192.168.109.166:7001 0.0.0.0:* LISTEN 4216/mysqlrouter
tcp 0 0 192.168.109.166:7002 0.0.0.0:* LISTEN 4216/mysqlrouter
7001,7002端口均启动成功
创建只读用户和读写用户并授权
mysqlrouter控制读写分离本质上还是通过用户的权限来管理
create user 'caohx'@'%' identified by '123456';
grant select on *.* to 'caohx'@'%';
create user 'wowchx'@'%' identified by '123456';
grant all on *.* to 'wowchx'@'%';
在Windows上使用SQLyog测试连接并测试读写分离
连接测试:
读写分离测试:
wowchx有权限
而caohx没有
至此,集群搭建完成!