1.redis一致性(容灾)
原面试题:redis集群数据一致性如何保证,如果挂了一台机会怎样?可以从故障检测和从节点选举说起。
故障检测:
-
集群中每个节点都会定期的向集群中的其他节点发送PING信息。
-
如果在一定时间内,发送ping的节点A没有收到某节点B的pong回应,那么A将B标识为pfail。
A在后续发送ping时,会带上B的pfail信息,通知给其他节点。
如果B被标记为pfail的个数大于集群主节点个数的一半(N/2 + 1)时,B会被标记为fail,A向整个集群广播,该节点已经下线。 其他节点收到广播,标记B为fail。(又是过半原则) -
从节点选举
每个从节点,根据自己对master复制数据的offset(偏移量),来设置一个选举时间,offset越大的从节点,选举时间越靠前,优先进行选举。
所有的Master开始slave选举投票,给要进行选举的slave进行投票,如果大部分master node(N/2 +1)都投票给了某个从节点,那么选举通过,那个从节点可以切换成master。 RedisCluster失效的判定: 1、集群中半数以上的主节点都宕机(无法投票) 2、宕机的主节点的从节点也宕机了(slot槽分配不连续)
当slave 收到过半的master 同意时,会成为新的master。此时会以最新的Epoch 通过PONG 消息广播 自己成为master,让Cluster 的其他节点尽快的更新拓扑结构(node.conf)。
2.mysql数据一致性
‘mysql主从复制,并不能保证数据的实时一致性,你可以通过修改my.conf文件,启用mysql主从复制中的半同步复制和异步复制,来减少数据的延迟。
可以通过shardingjdbc或者shardingproxy来实现数据一致性(或者减少延迟),shardingjdbc的特性如下:
- 提供一主多从的读写分离配置。仅支持单主库,可以支持独立使用,也可以配合分库分表使 用
- 独立使用读写分离,支持SQL透传。不需要SQL改写流程
- 同一线程且同一数据库连接内,能保证数据一致性。如果有写入操作,后续的读操作均从主 库读取。
- 基于Hint的强制主库路由。可以强制路由走主库查询实时数据,避免主从同步数据延迟。