【Redis主从架构】Redis哨兵主备切换时数据丢失问题:异步复制,集群脑裂

9. 【Redis主从架构】Redis哨兵主备切换时数据丢失问题:异步复制,集群脑裂

  1. redis哨兵主备切换两种数据丢失的情况
  2. 解决异步复制和脑裂导致的数据丢失

1. 两种导致数据丢失的情况

1.1 异步复制导致数据丢失

因为 master -> slave的复制都是异步的,所以有可能出现master内存中的部分数据来不及复制到slave上master就宕机了,随后通过哨兵执行主备切换,导致这部分数据丢失

1

1.2 脑裂导致的数据丢失

  • 脑裂

脑裂:某个master所在的机器突然脱离了正常的网络,跟其他slave节点不能连接。但实际上master是正常运行的。但哨兵就有可能认为master宕机了,然后开始从剩下的哨兵中选举出一个哨兵执行故障转移,将salve切换成master

此时集群中就会出现两个master,也就是所谓的脑裂,此时虽然某个slave被切换成了master,但是可能client还没来得及切换到新的master,还继续往旧的master中写数据。因此旧的master再次恢复的时候,会被作为一个slave挂到新的master上去,自己的数据就会被清空,重新从master上面复制数据,导致后面那部分往旧master写入的数据就丢失了。

2

2. 解决数据丢失的问题

2.1 解决异步数据复制导致数据丢失的问题

# 要求至少一个salve,完成数据同步,才认为数据写入成功
min-slaves-to-write 1

# 配置复制和不同延迟不能超过10秒
min-slaves-max-lag 10

如果说一旦所有的slave,数据复制和同步延迟都超过了10秒master就不会接受任何请求了

上面两个配置可以减少异步复制和脑裂导致的数据丢失问题。

  • (1) 减少异步复制的数据丢失

添加了 min-slaves-max-lag 配置之后,就可以确保,一旦slave复制数据和ack延时太长,就认为可能master宕机后损失的数据过多,那么就拒绝写请求,这样就可以把master宕机时由于部分数据未同步到slave导致的数据丢失降低到可控范围

3

  • (2)减少脑裂的数据丢失

如果一个master出现了脑裂,即master跟其他slave丢失了连接,那么上面两个配置就可以确保说,不能给指定数量的slave发送数据,且slave超过10s没有给masterack消息,那么就直接拒绝客户端的写请求

这样脑裂后的旧master就不会接收client的写请求,也就避免了数据丢失

上面的配置确保了,如果个任何一个salve丢失了连接,master在10s内没有接收到slave的ack响应,那么就会拒绝新的写请求。因此在脑裂场景下,最多就丢失了10秒的数据

4

参考 石衫老师 《亿级流量教程》课程笔记

亲,觉得对你有用的话,点个赞呗!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章