突破Java面试(23-8) – Redis哨兵主备切换的数据丢失问题

作者 : 开心源码 本文共957个字,预计阅读时间需要3分钟 发布时间: 2022-05-13 共211人阅读

Github

1 数据丢失的两个场景

主备切换的过程,可能会导致数据丢失

1.1 异步复制

因为 master => slave的复制是异步的,所以可能有部分数据还没复制到slave,master就宕机,于是这些数据就丢失了

image

1.2 脑裂导致

脑裂,也就是说,某个master所在节点忽然脱离正常的网络,无法和其余slave机器连接,但实际上master还运行着

此时哨兵可能就会认为master宕机了,而后开启选举,将其余slave切换成了master

这个时候,集群里就会有两个master,也就是所谓的脑裂

此时尽管某个slave被切换成了master,但是可能client还没来得及切换到新的master,还继续写向旧master的数据可能也丢失了

因而旧master再次恢复时,会被作为一个slave挂到新的master上去,自己的数据会被清空,重新从新的master复制数据

image

2 数据丢失的处理方案

如下配置可以减少异步复制和脑裂导致的数据丢失

min-slaves-to-write 1min-slaves-max-lag 10

配置要求至少有1个slave,数据复制和同步的推迟不能超过10秒

一旦所有的slave,数据复制和同步的推迟都超过了10秒钟,master就不再接收任何请求!

2.1 异步复制数据丢失处理方案

min-slaves-max-lag 配置

就可确保,一旦slave复制数据和ack延时过长,就认为可能master宕机后损失的数据太多了,那么就拒绝写请求

这样即可把master宕机时因为部分数据未同步到slave导致的数据丢失降低在可控范围

image

2.2 脑裂数据丢失处理方案

若一个master出现了脑裂,跟其余slave失去连接,那么开始的两个配置可以确保

若不能继续给指定数量的slave发送数据,而且slave超过10秒没有给自己ack消息,那么就直接拒绝用户端的写请求

这样脑裂后的旧master就不会接受client的新数据,也就避免了数据丢失

上面的配置就确保了,假如跟任何一个slave丢了连接,在10秒后发现没有slave给自己ack,那么就拒绝新的写请求

因而在脑裂场景下,最多就丢失10秒的数据

image

参考

《Java工程师面试突击第1季-中华石杉老师》

欢迎关注全是硬核干货的公众号:JavaEdge

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 突破Java面试(23-8) – Redis哨兵主备切换的数据丢失问题

发表回复