作者公众号,欢迎一起交流。
对于MySQL数据库来说,单机环境会存在单点故障从而有数据丢失的风险,那么MySQL数据库的主从复制是否就能保证数据的可靠呢?本篇将对MySQL的复制进行分析,并详细介绍MySQL数据库的半同步复制机制。
1 复制分析
前面介绍了MySQL数据库基于位点的主从复制和基于GTID的主从复制的环境搭建,接下来将分析下MySQL的复制方式。
1.1 复制原理
如下图所示,当在主库执行事务时,对数据的修改以事件的形式写到Binlog文件,然后主库的DUMP线程读取Binlog文件中的事件,从库的I/O线程将从主库读取的复制事件存储在Relay Log中,SQL线程读取Relay Log并将其应用于从库,从而实现主从库的一致。
1.2 异步复制
如下图所示,MySQL数据库默认以异步复制的方式进行主从库的同步,即当主库执行事务并写到Binlog文件后,返回客户端事务执行成功,从库通过I/O线程获得主库从DUMP线程读取的Binlog内容,但主库并不知道从库是否已获得Binlog中的事务并进行处理,也就是说不能保证主库Binlog中的事件能够到达从库。如果主库发生crash,主库已提交的事务可能还没来得及传输到从库,这时进行主库到从库的Failover,就可能会发生数据的丢失。这就是异步复制的工作机制。
1.3 全同步复制
如下图所示,相比较于异步复制会有数据丢失的风险,那么如果在主库执行的事务在所有从库应用后再返回客户端事务执行成功,由于主库执行的事务在从库都已执行,这样即使主库发生crash,主库到从库的Failover也不会发生数据的丢失,这就是全同步复制的工作机制,但是这种方式会有一个很大的缺点,那就是完成一个事务可能会有很大的延迟。
1.4 半同步复制
如下图所示,由于异步复制可能会引起数据的丢失,而全同步复制可能会产生很大的延迟,那么半同步复制是以上两种复制的一个折中,当主库执行事务并写到Binlog文件后,主库等待至少一个从库(从库数量可配置)接收并记录Binlog事件到从库的Relaylog中,收到从库的确认后,提交事务并返回客户端事务执行成功,这就是半同步复制的工作机制,它既保证了即使主库发生crash也不会丢失数据(因为至少有一个从库获取到了主库的Binlog日志),又不会完成一个事务产生很大的延迟(因为不用等待所有从库都接收到Binlog日志并将其在从库重放)。
2 安装半同步复制
半同步复制是通过插件来实现的,因此,安装半同步复制环境,需先在主、从库安装半同步复制插件,插件安装后,便有了相关的系统变量、状态变量对半同步环境进行配置和监控。要使用半同步复制,必须满足如下要求:
- MySQL服务器支持动态加载插件,即变量have_dynamic_loading值为YES,默认支持
- 主从复制环境已经运行,即在已经运行的复制环境安装半同步复制插件并进行相应的配置
- 半同步复制只支持默认的复制通道,不能同时配置多个复制通道
实验环境若无特殊说明,MySQL数据库版本均为8.0.27
2.1 安装半同步复制插件
1)查看插件所在位置
mysql> show variables like 'plugin_dir';
+---------------+---------------