Redis的主从同步

CAP原理
  • C:consistent 一致性
  • A:availability 可用性
  • P:partition tolerance 分区容忍性

分布式系统的节点往往都是分布在不同的机器上进行网络隔离开的,这意味着必然会有网络断开的风险,这个网络断开的场景专业词汇叫做

网络分区

在网络分区发生时,两个分布式节点之间无法进行通信,我们对一个节点进行修改的操作将无法同步到另外一个节点,所以数据的一致性也将无法满足,因为两个分布式节点的数据不再保持一致,除非我们牺牲可用性,也就是暂停分布式节点服务,在网络分区发生时,不再提供修改数据的功能,直到网络恢复正常。 用一句话概括就是:CAP原理是当网络分区发生时,一致性和可用性两难全

最终一致性

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

Redis保证最终一致性,从节点会努力追赶主节点,最终从节点的状态会和主节点的状态保持一致,一旦网络断开,主从节点的数据将会产生大量的不一致,但是网络恢复时,从节点会采用多种策略努力追赶,继续尽力保持和主节点一致。

增量同步

Redis同步的是指令流,主节点会将那些对自己的状态产生修改性影响的指令记录在本地的内存buffer中,然后异步将buffer中的指令同步到从节点,从节点一边执行同步的指令流来达到和主节点一样的状态,一边向主节点反馈自己同步到哪里了(偏移量)。

因为内存的buffer是有限的,所以Redis的主节点不能将所有的指令都记录在buffer中,Redis的复制内存buffer是一个定长的环形数组,如果数组内容满了,就会从头覆盖前面的内容。

如果因为网络原因导致从节点无法同步指令流时,之前没有同步的指令被后面的覆盖了,从节点是无法同步被覆盖的指令。

快照同步

快照同步是一个非常消耗资源的操作,它需要先在主节点进行一次bgsave,将当前内存的数据全部快照到磁盘文件中,然后再将快照文件的内容全部传送到从节点,从节点将快照文件接收完毕后,立即执行一次全量加载,加载之前先要将当前内存的数据清空,加载完毕后通知主节点继续进行增量同步。

增加从节点

当从节点刚刚加入到集群时,它必须先进行一次快照同步,同步完成后再继续进行增量同步。

无盘复制

主节点在进行快照同步时,会进行很耗时的文件IO操作,在非SSD磁盘存储时,快照同步会对系统的负载产生较大的影响,特别是当系统正在进行AOF的fsync操作时,如果发生快照同步,fsync会推迟进行,这就严重影响主节点的服务效率

所谓的无盘复制是指主服务器直接通过套接字将快照内容发送到从节点,生成快照是一个遍历的过程,主节点会一边遍历内存,一边将序列化的内容发送到从节点,从节点还是跟以前一样将接收到的内容存储到磁盘文件,再进行一次性加载。

标签:
作者:华传财
舞台上有你,就演好角色; 舞台上没你,就静静地做观众;

已有 0 位网友参与,快来吐槽:

发表评论