数据库系列-MYSQL篇之-主从同步

1 主从同步概述

mysql主从同步,即MySQL Replication,可以实现将数据从一台数据库服务器同步到多台数据库服务器。MySQL数据库自带主从同步功能,经过配置,可以实现基于库、表结构的多种方案的主从同步。

可以对MySQL做主从架构并且进行读写分离,让主服务器(Master)处理写请求,从服务器(Slave)处理读请求,这样可以进一步提升数据库的并发处理能力,如下图所示:

image

2 主从同步作用

一般来说,优先考虑优化sql及索引等,充分发挥数据库的最大性能;其次是采用缓存的策略,比如使用redis、magodb等缓存工具,通过其高性能的优势把数据保存在内存数据库中,提升读取的效率,最后才是采取数据库主从架构,进行读写分离(因为成本高)。

2.1 读写分离

通过主从复制的方式来同步数据,之后通过读写分离的方法提升数据库并发处理能力。简单来说就是数据放在多个数据库中,其中一个是Master主库,其余的是Slave从库。当主数据库数据发生变化时,会自动将数据同步到从数据库中,程序可以设置去从库读取数据,从而实现读写分离

2.2 数据备份

主从同步属于数据热备份机制,在主库正常运行下备份,不影响提供查询服务。

2.3 高可用性

数据备份其实是冗余的机制,通过冗余的方式可以换取数据库的高可用性,当服务器出现故障、宕机等无可用的情况下,可以迅速进行故障切换,让从库当主库,保证服务正常运行。

3 主从同步原理

引入一个重要日志文件 Binlog二进制文件,它记录了数据库更新的事件,主从同步原理就是基于Binlog进行数据同步的。
主从复制基于三个线程完成,线程1:binlog dump线程,位于Master节点上;线程2:I/O线程 和SQL线程,分别都位于Slave节点上。

核心流程如下:
1 当master节点接收到一个写入请求时,这个写请求一般是增删改操作,此时会把写入请求的更新操作记录到binlog日志中。
2 master节点会把数据复制给slave节点,这个过程首先得需要每个slave节点连接到master节点,当slave节点连接到master节点上,master节点会为每一个slave节点分别创建一个binlog dump线程,用于向各个slave节点发送binlong 日志。
3 binlog dump线程会读取master节点上的binlog日志,然后将binlog 日志发送给slave节点上的I/O线程。当主库读取事件的时候,会在binlog 上加锁,读取完成后,再将锁释放掉。slave节点上的I/O线程接收到binlog 日志后,会将binlog 日志先写入本地的relaylog 中,relaylog 中保存了binlog 日志。
4 slave节点上的SQL线程会读取relaylog 中的binlog 日志,将其解析成具体的增删改操作,把这些在master节点上进行过的操作重新在slave节点上重做一遍,达到数据还原的效果,这样可以保证master节点和slave节点的数据保持一致了。

主从同步的数据内容其实是二进制日志(Binlog),它虽然叫二进制日志,实际上存储的是一个又一个的事件(Event),这些事件分别对应着数据库的更新操作,比如INSERT、UPDATE、DELETE等。

另外我们还需要注意的是,不是所有版本的MySQL都默认开启了服务器的二进制日志,在进行主从同步的时候,我们需要先检查服务器是否已经开启了二进制日志。

4 解决主从数据同步一致性

4.1 全同步复制

全同步复制,就是当主库执行完一个事务之后,要求所有的从库也都执行完该事物,才可以返回处理结果给客户端;因此,虽然全同步复制数据一致性得到保证了,但是主库完成一个事务需要等待所有从库完成,性能难免会降低。

image

4.2 异步复制

异步复制,就是当主库提交事物后,会通知binlog dump线程发送binlog 日志给从库,一旦binlog dump线程将binlog 日志发送给从库之后,不需要等到从库也同步完成事物,主库就会将处理结果返回给客户端。
主库只管自己完成事物,就将处理结果返回给客户端(此时从库不一定完成同步事物),可能导致主从数据不一致问题,比如刚在主库新增的数据,马上去从库查询就可能查询不到。而且当主库提交完事物后,如果宕机了,可能会导致binlog 日志未同步给从库,同时为了回复故障切换主从节点的话,就会出现数据丢失问题。因此,虽然异步复制性能高,但是数据一致性是最弱的。

mysql主从复制,默认采用的就是异步复制这种复制策略。
image

4.3 半同步复制

mysql5.5 版本后开始支持半同步复制方式。原理就是在客户端提交commit之后不直接将结果返回客户端,而是至少等待至少有一个从库收到binlog ,并且写到中继日志之后再返回给客户端。优点:提高数据一致性。缺点:降低主库写的效率。
mysql5.7 版本中增加了一个rpl_semi_sync_master_wait_for_slave_count参数,可以根据需要响应的从库数据库数量设置,默认为1,也就是一个从库有了响应,就返回给客户端。如果这个参数调大,就可以提高数据一致性。

image

4.4 增强半同步复制

增强半同步复制,是mysql 5.7.2后的版本对半同步复制做的一个改进,原理上几乎是一样的,主要是解决幻读的问题。
主库配置了参数 rpl_semi_sync_master_wait_point = AFTER_SYNC 后,主库在存储引擎提交事务前,必须先收到从库数据同步完成的确认信息后,才能提交事务,以此来解决幻读问题

image

posted @ 2023-05-26 11:33  laity_guan  阅读(2884)  评论(0编辑  收藏  举报