design       

主从复制

mysql主从复制

主服务器

image-20210523104938067

首先bin-log日志文件加锁,然后读取更新的操作,读取完毕以后将锁释放掉,最后将读取的记录发送给从服务器。

  1. Sending binlog event to slave 表示Binlog dump 线程已经读取完binlog日志中更新的event,现在正在发送给从服务器。

  2. Finished reading one binlog; switching to next binlog 表示Binlog dump 线程已经读取完一个binlog日志,现在正在打开下一个binlog日志读取来发送给从服务器

  3. Master has sent all binlog to slave; waiting for binlog to be updated 这就是上面我们看到的state的值,表示Binlog dump 线程已经读取完所有的binlog日志文件,并且将其发送给了从服务器。现在处于空闲状态,正在等待读取有新的操作的binlog日志文件

  4. Waiting to finalize termination 这个状态持续的很短暂,我们几乎看不到。当线程停止的时候显示此状态

有多少个从服务器连接主服务器上就有多少个Binlog dump 线程.

从服务器

image-20210523110652298

主从复制数据一致性

异步复制: 客户端提交COMMIT之后不需要等到从库返回任何结果,而是直接将结果返回给客户端 优点:不会影响主库写的效率 缺点:可能会存在主库宕机,而binlog还没有同步到从库的情况,也就是此时的主库和从库数据出现不一致的情况。

半异步复制: MySQL5.5版本之后开始支持半同步复制的方式,在客户端提交COMMIT之后不直接将结果返回给客户端,而是等待至少有一个从库接受到了binlog .并且写入到中继日志中.再进行返回给客户端。 优点:提升了数据一致性

不足:仍然存在数据不一致性的情况,增加了网络连接的延迟

MySQL5.5 版本之后开始支持半同步复制的方式。原理是在客户端提交 COMMIT 之后不直接将结果返回给客户端,而是等待至少有一个从库接收到了 Binlog,并且写入到中继日志中,再返回给客户端。 这样做的好处就是提高了数据的一致性,当然相比于异步复制来说,至少多增加了一个网络连接的延迟,降低了主库写的效率。

在 MySQL5.7 版本中还增加了一个rpl_semi_sync_master_wait_for_slave_count参数,我们可以对应答的从库数量进行设置,默认为 1,也就是说只要有 1 个从库进行了响应,就可以返回给客户端。如果将这个参数调大,可以提升数据一致性的强度,但也会增加主库等待从库响应的时间。

MGR复制: 简称MGR ,是MySQL在5.7.17版本中推出的一种新的数据复制技术,这种复制技术是基于Paxos协议的状态机复制。Paxos协议可以解决分布式系统中出现的数据不一致的问题 优点:提供了数据强-致性.可以让MySQL应用到更多领域,比如金融 不足:对网络性能要求高,只支持InnoDB存储引擎

redis主从复制

image-20210523165012293

image-20210523160107677

主从复制数据一致性

Redis 的主从数据是异步同步的,所以分布式的 Redis 系统并不满足「一致性」要求。当客户端在 Redis 的主节点修改了数据后,立即返回,即使在主从网络断开的情况下,主节点依旧可以正常对外提供修改服务,所以 Redis 满足「可用性」。

Redis 保证「最终一致性」,从节点会努力追赶主节点,最终从节点的状态会和主节点的状态将保持一致。如果网络断开了,主从节点的数据将会出现大量不一致,一旦网络恢复,从节点会采用多种策略努力追赶上落后的数据,继续尽力保持和主节点一致。

zookeeper主从复制

主从复制数据一致性

通过zad协议2pc

参考

https://www.jianshu.com/p/8717e6259e06 https://blog.csdn.net/belongtocode/article/details/106928372

https://www.modb.pro/db/6415