首页 > 数据库 >Redis主从集群切换数据丢失问题如何应对?

Redis主从集群切换数据丢失问题如何应对?

时间:2022-10-24 20:12:35浏览次数:77  
标签:slave min Redis 集群 丢失 master 数据 主从

一、数据丢失的情况

 

  • 异步复制同步丢失
  • 集群产生脑裂数据丢失

1.异步复制丢失

对于Redis主节点与从节点之间的数据复制,是异步复制的,当客户端发送写请求给master节点的时候,客户端会返回OK,然后同步到各个slave节点中。

如果此时master还没来得及同步给slave节点时发生宕机,那么master内存中的数据会丢失;

要是master中开启持久化设置数据可不可以保证不丢失呢?答案是否定的。在master 发生宕机后,sentinel集群检测到master发生故障,重新选举新的master,如果旧的master在故障恢复后重启,那么此时它需要同步新master的数据,此时新的master的数据是空的(假设这段时间中没有数据写入)。那么旧master中的数据就会被刷新掉,此时数据还是会丢失。

2.集群产生脑裂

首先我们需要理解集群的脑裂现象,这就好比一个人有两个大脑,那么到底受谁来控制呢?在分布式集群中,分布式协作框架zookeeper很好的解决了这个问题,通过控制半数以上的机器来解决。

那么在Redis中,集群脑裂产生数据丢失的现象是怎么样的呢?

假设我们有一个redis集群,正常情况下client会向master发送请求,然后同步到salve,sentinel集群监控着集群,在集群发生故障时进行自动故障转移。

此时,由于某种原因,比如网络原因,集群出现了分区,master与slave节点之间断开了联系,sentinel监控到一段时间没有联系认为master故障,然后重新选举,将slave切换为新的master。

但是master可能并没有发生故障,只是网络产生分区,此时client任然在旧的master上写数据,而新的master中没有数据,如果不及时发现问题进行处理可能旧的master中堆积大量数据。在发现问题之后,旧的master降为slave同步新的master数据,那么之前的数据被刷新掉,大量数据丢失。

在了解了上面的两种数据丢失场景后,我们如何保证数据可以不丢失呢?在分布式系统中,衡量一个系统的可用性,我们一般情况下会说4个9,5个9的系统达到了高可用(99.99%,99.999%,据说淘宝是5个9)。对于redis集群,我们不可能保证数据完全不丢失,只能做到使得尽量少的数据丢失。

二、如何保证尽量少的数据丢失?

在redis的配置文件中有两个参数我们可以设置:

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

min-slaves-to-write默认情况下是0,min-slaves-max-lag默认情况下是10。

以上面配置为例,这两个参数表示至少有1个salve的与master的同步复制延迟不能超过10s,一旦所有的slave复制和同步的延迟达到了10s,那么此时master就不会接受任何请求。

我们可以减小min-slaves-max-lag参数的值,这样就可以避免在发生故障时大量的数据丢失,一旦发现延迟超过了该值就不会往master中写入数据。

那么对于client,我们可以采取降级措施,将数据暂时写入本地缓存和磁盘中,在一段时间后重新写入master来保证数据不丢失;也可以将数据写入kafka消息队列,隔一段时间去消费kafka中的数据。

通过上面两个参数的设置我们尽可能的减少数据的丢失,具体的值还需要在特定的环境下进行测试设置。

标签:slave,min,Redis,集群,丢失,master,数据,主从
From: https://www.cnblogs.com/matengfei123/p/16822632.html

相关文章

  • Redis 宕机恢复,不丢数据秘诀是什么?
    3.1宕机恢复,不丢数据稳如山我是一个基于内存的数据库,名字叫Redis。我对数据读写操作的速度快到令人发指,很多程序员把我当做缓存使用系统,用于提高系统读取响应性能。然而......
  • Redis Cluster 原理说的头头是道,这些不懂就是纸上谈兵
    RedisCluster集群相关配置,使用集群方式的你必须重视和知晓。别嘴上原理说的头头是道,而集群有哪些配置?如何配置让集群快到飞起,实现真正的高可用却一头雾水,通过下面这些配置......
  • 6.4 Kafka集群之副本集
    1.简介kafka的数据是存储在日志文件中的,kafka副本集(副本因子)是指将这些日志文件复制多份从而起到数据备份的目的。kafka中的topic只是个逻辑概念,实际存储数据的是partiti......
  • 6.5 Kafka集群之Leader选举
    1.Broker选举(1).不采用多数投票方式选举的原因kafka并没有采用多数投票来选举leader的(redis和es采用的是多数投票方式来进行选举的),原因有两个,一是防止选举时选举到了数......
  • Linux安装redis7
    基础环境操作系统:centos7.9(64位)redis:7.0.5安装步骤1.安装1.1上传redis-7.0.5.tar.gz上传至服务器/opt文件夹下。1.2解压cd/opttarxzvfredis-7.0.5.tar.g......
  • CentOS 6上的redis搭建实战记录
    redis 是一个基于内存的高性能key-value数据库,数据都保存在内存中定期刷新到磁盘,以极高的读写效率而备受关注。他的特点是支持各种数据结构,stirng,hashes,list,set,和sort......
  • springboot~redis-cluster动态感应的配置
    redis-cluster是一个高可用,可分片的分布式redis集群解决方案,建议使用springboot2.3及以上版本的脚手架,如果是<2.3版本,你需要手动添加LettuceConnectionFactory来实现因为服......
  • HMZK5【Zookeeper集群】
    1ZK集群Leader选举Leader选举:Serverid:服务器ID比如有三台服务器,编号分别是1,2,3。编号越大在选择算法中的权重越大。Zxid:数据ID服务器中存放的最大数据ID.......
  • Redis exception; nested exception is io.lettuce.core.RedisException: java.io...
    在做安卓app项目,springboot写接口整合redis用RedisTemplate确实挺方便。在AndroidStudio模拟器里测试app功能,大概10几分钟后遇到请求数据失败,看接口报错了:redisCausedb......
  • 狂神说Redis学习笔记
    Redis1、NoSQL概述1.1、为什么要用Nosql1、单机MySQL的年代!90年代,一个基本的网站访问量一般不会太大,单个数据库完全足够!那个时候,更多的去使用静态网页Html~服......