一、实现原理
- 当从库IO线程接受到主库传递来的二进制日志(Binlog)并将之保存为从库的中继日志(relay log),然后从库SQL线程将中继日志(relay log)的事件重做到从库上,实现主从数据同步。
- 如果SQL线程发现该事件的server_id与当前从库的server_id相同,则会丢弃该事件,因此如果两台MySQL如何互为主从,不会导致相同的事件被重复执行。
二、设计目标
在一套MySQL复制群集中,通过双主或多主架构,解决一主多从架构的单点故障,减少主从切换的故障处理时间,增加MySQL群集的高可用性。
三、设计架构图
四、双主架构的优缺点
4.1 优点
- 主主模式能将读写请求分摊到两个主节点,有效提升服务器使用率;
- 主节点发生故障后,能快速进行主从切换;
- 当故障节点恢复后,故障节点能通过复制进行数据恢复(应用其他节点数据)和数据同步(将未同步数据发生给其他节点)。
4.2 缺点
- 当主节点上MySQL实例发生故障后,可能会存在部分数据(Binlog)未同步到另外的主节点,导致数据丢失(直到故障节点恢复);
- 主主模式下,很容易因数据访问控制不当导致数据冲突;
- 为提高系统高可用性,双主架构会被扩展成双主多从结构,同样存在主节点发生故障后多个从库选主和恢复复制的问题。
五、集群搭建
5.1 服务器准备
两台已安装MySQL服务器,可参考:https://blog.csdn.net/weixin_41668084/article/details/111630605
序号 | 系统 | 内存 | CPU | IP地址 |
---|---|---|---|---|
1 | CentOS | 4G | 4 | 192.168.61.40 |
2 | CentOS | 4G | 4 | 192.168.61.41 |
5.2 集群配置
5.2.1 主机-1配置
#任意自然数,保证两台MySQL主机不重复
server-id=1
#开启二进制日志
log-bin=mysql-bin
#步进值auto_imcrement。一般有n台主MySQL就填n
auto_increment_increment=2
#起始值。一般填第n台主MySQL。此时为第一台主MySQL
auto_increment_offset=1
#忽略同步的mysql库,可不设置
binlog-ignore=mysql
binlog-ignore=information_schema
#要同步的数据库,默认所有库
replicate-do-db=author
5.2.2 主机-2配置
#任意自然数,保证两台MySQL主机不重复
server-id=2
#开启二进制日志
log-bin=mysql-bin
#步进值auto_imcrement。一般有n台主MySQL就填n
auto_increment_increment=2
#起始值。一般填第n台主MySQL。
auto_increment_offset=2
#忽略同步的mysql库,可不设置
binlog-ignore=mysql
binlog-ignore=information_schema
#要同步的数据库,默认所有库
replicate-do-db=author
5.2.3 登录MySQL,创建相互授权账户
# 40主机,创建授权41主机的账户
mysql> grant replication slave on *.* to '账户'@'192.168.40' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
# 41主机,创建授权40主机的账户
mysql> grant replication slave on *.* to '账户'@'192.168.39' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
5.2.4 重启服务
systemctl restart mysqld
5.2.5 登录MySQL,查看主机状态
mysql>SHOW MASTER STATUS;
5.2.6 相互设置同步的日志节点
change master to master_host='主服务器ip地址',
master_port=3306,master_user='链接主服务器账户',
master_password='链接主服务器角色账户密码',
master_log_file='主服务器file参数',
master_log_pos=主服务器positon参数
5.2.7 启动slave服务,查看状态
# 启动slave服务
start slave;
# 查看slave状态
show slave status\G
配置成功。
以上,请参考!