基于GITD的拥有备库和延迟备库的MySQL双主热备高可用集群

目录

环境的配置

系统配置

在/etc/hosts下加入各机器的域名

建立免密通道方便文件的传输

MySQL配置

全备并保持各个数据库一致性

复制账户的建立与授权

GTID集群搭建

时间同步

修改slave信息与master建立联系

在delay上加入延迟信息

验证

复制测试

删除测试

读写分离

新创建一台虚拟机下载并安装mysql-routet

修改配置文件

重启服务并检查端口

创建只读用户和读写用户并授权

在Windows上使用SQLyog测试连接并测试读写分离

连接测试:

 读写分离测试:


环境的配置

系统配置

新建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没有

 至此,集群搭建完成!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值