1. 两种数据丢失的情况
主备切换的过程,可能导致数据丢失;
### 1.1. 异步复制导致的数据丢
因为 master -> slave 的复制是异步的,所以可能有部分数据还没复制到 slave,master 就宕机了,此时这些部分数据就丢失了
### 1.2 脑裂导致的数据丢失
脑裂就是说,某个 maser 所在机器突然脱离了正常的网络,跟其他 slave 机器不能连接,但是实际上 master 还运行着,此时哨兵可能就会认为 master 宕机了,然后开启选举,将其他 slave 切换成了 master,这个时候,集群里面就会有 2 个 master,也就是所谓的脑裂,此时虽然某个 slave 被切换成了 master,但是可能 client 还没来得及切换到新的 master,还继续写向旧 master 的数据可能也丢失了,因此 master 再次恢复的时候,会被作为一个 slave 挂到新的 master 上去,自己的数据将会清空,重新从新的 master 复制数据
2. 解决异步复制和脑裂数据导致的数据丢失
# redis.conf 配置
Min-slaves-to-write 1
Min-slaves-max-lag 10
上面这两个配置可以减少异步复制和脑裂导致的数据丢失
###2.1 减少异步复制的数据丢失
有了 min-slaves-max-lag 这个配置,可以确保说,一旦 slave 复制数据和 ack 延迟太长,就认为可能 master 宕机后损失的数据太多了,那么就拒绝写请求,这样可以吧 master 宕机时由于部分数据丢失。
### 2.2 减少脑裂的数据丢失
如果一个 master 出现了脑裂,跟其他 slave 丢了连接,那么上面这两个配置可以去确保说,如果不能继续给指定数量的 slave 发送数据,而且 slave 超过 10 秒没有给自己 ack 消息,那么就直接拒绝客户端的写请求,这样脑裂活的旧 master 就不会接受 client 的新数据,也就避免了数据丢失,上面配置确保了,如果跟任何一个 slave 丢了连接,在 10 秒后发现没有 slave 给自己 ack,那么就拒绝新的写请求,因此脑裂场景下,最多丢失 10 秒的数据。
更多精彩,weixin 关注“SpringForAll 社区”
本文由博客一文多发平台 OpenWrite 发布!