(十三)主从同步
主从同步的优点:
- 读写分离提高数据库并发处理能力
- 数据备份
- 高可用性。也就是当服务器出现故障或宕机的情况下,可以切换到从服务器上,保证服务的正常运行。
Binlog&Undolog
二进制日志(Binlog):存储的是一个又一个事件(Event),这些事件分别对应着数据库的更新操作,比如INSERT、UPDATE、DELETE
undo_logo: Undo Log保存了历史快照
1. 主从同步原理:
主从同步的原理就是基于Binlog进行数据同步的。在主从复制过程中,会基于3个线程来操作,一个主库线程,两个从库线程。
- 数据库进行更新的事件写入Binlog日志
- 主库转储并发送Binlog。当从库线程连接的时候,主库可以将二进制日志发送给从库,当读取Binlog的时候,会在Binlog上加锁,读取完成之后,再将锁释放掉。
- 从库IO线程,连接到主库,向主库发送请求更新Binlog或接受Binlog,拷贝到本地形成中继日志(Relay log)
- 从库SQL线程会读取从库中的中继日志,并且执行日志中的事件,从而将从库中的数据与主库保持同步。
2. 主从一致性
主库同步之间的网络延迟,可能会造成主从数据不一致的情况。(同步过程中会对Binlog加锁,不会造成数据不一致的情况)
异步复制
是客户端提交COMMIT之后不需要等从库返回任何结果,而是直接将结果返回给客户端。
好处:不会影响主库写的效率
坏处:但可能会存在主库宕机,而Binlog还没有同步到从库的情况,也就是此时的主库和从库数据不一致。
半同步复制
客户端提交COMMIT之后不直接将结果返回给客户端,而是等待至少有一个从库接收到了Binlog,并且写入到中继日志中,再返回给客户端。
好处就是提高了数据的一致性
坏处:相比于异步复制来说,至少多增加了一个网络连接的延迟,降低了主库写的效率。
在MySQL5.7版本中还增加了一个rpl_semi_sync_master_wait_for_slave_count
参数,我们可以对应答的从库数量进行设置,默认为1,也就是说只要有1个从库进行了响应,就可以返回给客户端。如果将这个参数调大,可以提升数据一致性的强度,但也会增加主库等待从库响应的时间。
组复制:
组复制技术,简称MGR(MySQL Group Replication)