突破Java面试(23-8) – Redis哨兵主备切换的数据丢失问题
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哨兵主备切换的数据丢失问题