一、基本概念
MySQL 5.7前只能实现一主一从、一主多从或者多主多从的复制,如果想实现多主一从的复制,只好使用MariaDB,但是MariaDB又与官方的MySQL版本不兼容的,在MySQL 5.7版本可以实现多主一从的复制了
在 MySQL 集群中,有多种架构方式,包括一主一从、一主多从、多主多从、多主一从,以及其他一些变种。每种架构方式都有其特点和适用场景。
-
一主一从(Master-Slave):
-
主服务器将写操作记录到二进制日志(binlog)。
-
从服务器连接到主服务器,通过复制进程将主服务器的 binlog 应用到从服务器上。
-
读写比例不平衡,读操作较多的场景。
-
提高读性能,通过从服务器分担读负载。
-
数据备份,从服务器可以用于数据备份。
-
一个主服务器处理写操作,一个或多个从服务器用于处理读操作。
-
适用于读操作比写操作多的场景。
-
主从复制是异步的,主服务器的数据会被异步地同步到从服务器。
一主多从(Master-MultiSlave):
-
与一主一从相似,主服务器将写操作记录到 binlog,多个从服务器连接到主服务器进行复制。
-
读操作非常频繁,写操作较少的场景。
-
分布式读取,通过多个从服务器分担读负载。
-
数据备份,多个从服务器可以用于数据备份。
-
一个主服务器处理写操作,多个从服务器用于处理读操作。
-
适用于高读取、低写入的场景。
-
主从复制是异步的,主服务器的数据会被异步地同步到多个从服务器。
多主多从(Master-Master,Circular Replication):
-
每个主服务器都记录自己的 binlog,并通过异步复制将 binlog 同步到其他主服务器。
-
需要高可用性,任何一个主服务器故障时可以切换到其他主服务器。
-
读写负载均衡,可以在多个主服务器之间分担读写负载。
-
多个主服务器,每个主服务器都可以处理读和写操作。
-
数据可以在多个主服务器之间双向同步。
-
适用于高可用性和负载均衡的需求。
多主一从(Master-Fanout):
特点:
-
多个主服务器并行记录写操作到各自的 binlog,从服务器连接到其中一个主服务器进行复制。
-
写入频繁,需要水平扩展写性能。
-
读操作较少,可以通过单个从服务器满足读请求。
-
数据备份,从服务器用于备份数据。
-
多个主服务器处理写操作,一个从服务器用于处理读操作。
-
适用于写操作非常频繁,但读操作相对较少的场景。
-
读写分离,多个主服务器并行处理写操作,一个从服务器负责读操作。
主要用于简单部署和测试。但在生产环境中,这种方式可能会导致数据不一致和冲突。仅用于测试和开发环境。不建议在生产环境中使用。
其他方式:
分片(Sharding):
-
提供基于 Paxos 算法的多主同步复制。
-
可以实现高可用性和负载均衡。
Galera Cluster:
-
基于同步复制的集群方案,提供多主同步复制。
-
所有节点之间都是对等的,任何一个节点都可以处理写操作。
MySQL Group Replication:
-
将数据按照某个规则划分成多个片段,每个片段存储在独立的数据库节点上。
-
适用于大规模数据集,可以水平扩展。
每种架构方式都有其优点和适用场景,选择合适的架构取决于应用程序的需求,例如读写比例、数据量、可用性要求等。
二、具体实现
1、将主节点的数据同步到从节点
可以用navicat手动将表从任一master主机同步过来
2、配置my.cnf
server-id=133
gtid_mode=ON
enforce-gtid-consistency=ON
master_info_repository=table
relay_log_info_repository=table
3、配置多源复制
# 复制master1
mysql> change master to
master_host='192.168.51.131',
master_port=3306,
master_user='root',
master_password='123456',
master_auto_position=1
FOR CHANNEL 'm-131';
# 复制master2
mysql> change master to
master_host='192.168.51.132',
master_port=3306,
master_user='root',
master_password='123456',
master_auto_position=1
FOR CHANNEL 'm-132';
和普通复制不同的是需要增加 FOR CHANNEL ‘xxx’ 语句指定不同的频道复制。由于是多源复制必须指定参数 master_info_repository=table
4、配置跳过的GTID集合
#master节点 :
mysql> flush logs;
mysql> show global variables like 'gtid_executed' \G
#slave节点:
mysql> reset master;
Query OK, 0 rows affected (0.00 sec)
mysql> set global gtid_purged='2b095e9d-5d7a-11ed-9a6a-000c296534b2:1-13,e1186686-5e58-11ed-855c-000c29920730:1-4';
Query OK, 0 rows affected (0.00 sec)
#启动节点
mysql> start slave for channel 'm-131';
#查看某一频道的复制状态
mysql> show slave status for channel 'm-131' \G
#启动节点
mysql> start slave for channel 'm-132';
mysql> show slave status for channel 'm-132' \G
配置完成,数据成功同步过来:
版权声明:本文内容来自CSDN:不吃小龙虾哦,遵循CC 4.0 BY-SA版权协议上原文接及本声明。
本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
原文链接:https://blog.csdn.net/shuo_house/article/details/127727769
如有涉及到侵权,请联系,将立即予以删除处理。
在此特别鸣谢原作者的创作。
此篇文章的所有版权归原作者所有,与本公众号无关,商业转载建议请联系原作者,非商业转载请注明出处。