Redis
redis.conf配置文件里面关于复制的描述:
# 1) Redis replication is asynchronous, but you can configure a master to
# stop accepting writes if it appears to be not connected with at least
# a given number of slaves.
# 2) Redis slaves are able to perform a partial resynchronization with the
# master if the replication link is lost for a relatively small amount of
# time. You may want to configure the replication backlog size (see the next
# sections of this file) with a sensible value depending on your needs.
# 3) Replication is automatic and does not need user intervention. After a
# network partition slaves automatically try to reconnect to masters
# and resynchronize with them.
总结一下, Redis为了追求极致性能, 主从复制是异步的, 这个没得商量, 客户端和服务端的交互过程如下:
你可能有疑问, “如果slave失联了, master还一直接受写, 岂不造成数据不一致? ”
所以Redis提供了一个可选配置项,当master和多少个slave失去联系之后, 就拒绝再接受写请求了.
即使及时止损, 数据还是可能会出现一定程度的不一致, 怎么办?
其实redis有一套非常重要的机制, 那就是当slave和master失去了联系之后, slave会自动重连并执行再同步(resynchronization), 以确保数据的最终一致性.
ZooKeeper
与Redis追求极致性能不同, ZK主从复制是同步的, 虽然是同步复制,但只要有“一半以上”的从节点复制成功就行了, 所以也不会太耗性能, 客户端和服务端的交互过程如下:
MySql
MySQL的复制比较多样化, 支持‘异步’、‘全同步’、‘半同步’.
异步参考Redis, 同步参考ZK, 其中半同步只要求有一台以上的slave复制成功就行了, 全同步要求所有slave都复制成功才行.