redis 主从同步
在讨论主从同步之前先说一个概念,CAP
CAP 分布式存储的理论基石
C:Consistency 一致性
A:Availability 可用性
P:Partition tolerance 分区容错性
关系图如下:
一位不愿意透露姓名的大佬说:
It states, that though its desirable to have Consistency, High-Availability and Partition-tolerance in every system, unfortunately no system can achieve all three at the same time.
即:在分布式系统的设计中,没有一种设计可以同时满足一致性,可用性,分区容错性 3个特性
小解释下:分布式系统一般是分布在不同的节点上,而且是网络分区的,这就意味着总有网络不稳定的时候,这种现象大家叫他"网络分区",万一网络波动了,我说万一哈,那两个分布式节点无法通信,主节点的修改操作无法同步到从节点,所以你需要进行二选一:1、停止对主节点的修改功能,即牺牲可用性确保一致性 2 保证系统可用,牺牲一致性
redis 主从同步
最终一致性
redis 主从同步是异步的,因此分布式的redis系统不满足一致性要求,就算主从断开连接,主节点也能正常读写,所以分布式下的redis是满足可用性的。但是,redis从节点一直在向主节点看齐,一直在努力的追赶主节点,最终会达到一直。如果出现网络分区,主从数据出现大量的不一致,单一旦网络恢复从节点便会通过各种策略追赶上主节点,因此redis保证最终一致性。
增量同步
主节点会将自己状态发生变化的指令通过字节流的方式记录到本地buffer中,然后异步将buffer中指令同步到从从节点,从节点会及时返回自己同步的偏移量。buffer是一个圆环,当主从网络长时间断开,则buffer则会被后面的数据覆盖掉,网络恢复后则会造成数据不一致。需要快照同步来弥补
快照同步
即rdb,需要住主节点执行下bigsave上将数据全部同步到磁盘上,然后同步到从节点,从节点会清除自己的存储,全量加载rdb文件。从节点同步时,主节点还在增加buffer,如果又被覆盖了,那么又需要进行一次快照同步,会造成循环。