什么是MySQL主从复制
MySQL主从复制是一种常见的数据库复制技术,用于将一个MySQL数据库服务器(主节点)的数据同步复制到一个或多个其他MySQL服务器(从节点)。这样可以降低主服务的压力,实现数据的备份、负载均衡和高可用性。
题外话:MySQL术语的更新
在乔治·弗洛伊德事件后,消除种族歧视的呼声一浪高过一浪,且蔓延到了计算机软件领域,在2020年6月8月,国外微软工程师Scott Hanselman,在他的技术博客(原文https://www.hanselman.com/blog/easily-rename-your-git-default-branch-from-master-to-main)上发表文章呼吁git默认分支从master改为main,认为master、slave是一类有种族歧视的意义,掀起了一场互联网软件的改名潮。
在2020年7月1日MySQL的官方一篇文章(原文https://dev.mysql.com/blog-archive/mysql-terminology-updates/)中提到,使用MySQL复制的人都知道"master"和"slave",由于这类词语有着负面的含义,MySQL决定更改他们,将使用新的术语来替代老的术语。
MySQL主从复制的基本原理
1、主节点(source)事务写入二进制日志(binlog),然后继续处理其他事务。
2、当从节点(replica)上线后,它会与主节点(source)建立连接并请求进行数据同步。
3、主节点的binlog通过dump thread线程发送给从节点,不会等待从节点(replica)确认是否已经接收到数据。
4、从节点创建I/O thread接收主节点dump thread线程发来的binlog并写入到中继日志(relay log)。
5、从节点还会创建sql thread线程,从中继日志(relay log)中读取重放这些事件,实现数据的复制。
通过这个过程,主从复制实现了主节点数据向从节点数据的复制(默认采用的是异步复制),从而实现数据备份、故障恢复和负载均衡。从节点可以提供读操作的服务,从而分担主节点的读负载,提高整个系统的性能和可靠性。
MySQL主从复制的几种方式
传统异步复制
传统异步复制就是我们常说的基于二进制日志的复制,也是MySQL主从默认的复制方式。在异步复制中,主节点将事务写入二进制日志(binlog)后,不会等待从节点的确认,而是通过一个专门的binlog dump thread线程将binlog数据异步地发送给从节点。这样主节点的性能不会受到从节点复制速度的影响,但从节点可能存在一定的延迟,数据复制有一定的滞后性。
半同步复制
半同步复制是在MySQL5.5版本中引入的(插件的形式支持),它与异步复制的主要区别在于,主节点在将事务写入二进制日志(binlog)并执行提交(commit)操作后,会等待至少一个从节点将数据写入中继日志(Relay Log)并应用这些数据,然后再返回确认(ACK)成功。通过半同步复制可以提高数据的一致性,但是会降低主库的性能,会产生幻读。
增强半同步复制
也称为无损复制,是在半同步复制的基础上进行的改进。主节点在将事务写入二进制日志(binlog)后,就等待从节点的确认(ACK),直到至少一个(MySQL5.7引入等待从节点数量的参数:rpl_semi_sync_master_wait_for_slave_count = 1)从节点写入中继日志(Relay Log)后,并应用了这些数据,然后返回给主节点确认(ACK),通知主节点可以执行提交(commit)操作。
增强半同步复制主要解决了半同步复制中幻读的问题,并引入了一个新的参数 rpl_semi_sync_master_wait_for_slave_count 来控制等待从节点确认的数量。在配置 rpl_semi_sync_master_wait_point = AFTER_SYNC 时,主节点会等待指定数量的从节点确认后才执行提交,从而提高数据同步的可靠性和一致性。
组复制(MGR)
组复制MySQL Group Replication(MGR),如果展开来讲MGR的内容很多,我这里就简单的概括了下。
1、MGR使用Paxos协议实现了多主复制的高可用性解决方案,每个服务器都有完整的副本。
2、在MGR层拦截MySQL引擎层的Prepare操作后,通过Paxos协议广播数据包到集群中的所有节点。
3、为了提交事务,必须经过组内大多数节点(超过一半的节点,即N / 2 + 1)决议并通过,才能得以提交。这种多数派确认的机制确保了数据的一致性。
4、在提交后,每个节点会进行认证,通过认证后将事务写入其Binlog或Relay Log,并进行数据同步。
5、如果在认证过程中发现问题,节点将执行回滚操作,撤销该事务的修改。
总结:传统异步复制和增强半同步复制仍然是目前许多人在使用的MySQL复制方式,虽然MGR等新技术提供了更高的可用性和数据冗余,但传统方式和增强半同步复制,在某些场景下仍然具有优势和广泛应用。