redis 集群如何保证不丢失数据?

数据什么时候会丢失?
1 异步复制同步丢失
2 集群产生脑裂数据丢失
一 异步复制丢失
对于Redis主节点与从节点之间的数据复制,是异步复制的,当客户端发送写请求给master节点的时候,客户端会返回OK,然后同步到各个slave节点中。
如果此时master还没来得及同步给slave节点时发生宕机,那么master内存中的数据会丢失;
要是master中开启持久化设置数据可不可以保证不丢失呢?答案是否定的。在master 发生宕机后,sentinel集群检测到master发生故障,重新选举新的master,如果旧的master在故障恢复后重启,那么此时它需要同步新master的数据,此时新的master的数据是空的(假设这段时间中没有数据写入)。那么旧master中的数据就会被刷新掉,此时数据还是会丢失
二 集群产生脑裂
什么是脑裂:
redis的集群脑裂是指因为网络问题,导致redis master节点跟redis slave节点和sentinel集群处于不同的网络分区,此时因为sentinel集群无法感知到master的存在,所以将slave节点提升为master节点。此时存在两个不同的master节点,就像一个大脑分裂成了两个。
集群脑裂问题中,如果客户端还在基于原来的master节点继续写入数据,那么新的master节点将无法同步这些数据,当网络问题解决之后,sentinel集群将原先的master节点降为slave节点,此时再从新的master中同步数据,将会造成大量的数据丢失
什么是分区:
一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了(因为检测网络延迟和失败是很困难的),整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。这就叫分区
三 如何最大限度地减少数据丢失
redis 配置文件中 有两个参数
min-replicas-to-write 1
min-replicas-max-lag 10
第一个参数标明连接到master的最少replicas数量
#redis提供了可以让master停止写入的方式,如果配置了min-replicas-to-write,健康的slave的个数小于N,master就禁止写入。master最少得有多少个健康的slave存活才能执行写命令。这个配置虽然不能保证N个slave都一定能接收到master的写操作,但是能避免没有足够健康的slave的时候,master不能写入来避免数据丢失。设置为0是关闭该功能。
第二个参数标明replicas连接到master的最大延迟时间 单位是秒 延迟小于min-replicas-max-lag秒的slave才认为是健康的slave
假设连接到master的slave数量小于第一个参数,且ping的延迟时间小于等于第二个参数,那么master就会拒绝写央求,配备了这两个参数之后,假设发生集群脑裂,原先的master节点接收到客户端的写入央求会拒绝,就可以减少数据同步之后的数据丢掉
原文链接:https://blog.csdn.net/LO_YUN/java/article/details/97131426

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注