首页 > 数据库 >redis集群的弱一致性

redis集群的弱一致性

时间:2022-11-07 00:22:54浏览次数:33  
标签:redis Z1 集群 B1 一致性 操作 节点 客户端

Redis集群不能保证强一致性。一些已经向客户端确认写成功的操作,会在某些不确定的情况下丢失。

产生写操作丢失的第一个原因,是因为主从节点之间使用了异步的方式来同步数据。

一个写操作是这样一个流程:

  • 客户端向主节点B发起写的操作
  • 主节点B回应客户端写操作成功
  • 主节点B向它的从节点B1,B2,B3同步该写操作

从上面的流程可以看出来,主节点B并没有等从节点B1,B2,B3写完之后再回复客户端这次操作的结果。所以,如果主节点B在通知客户端写操作成功之后,但同步给从节点之前,主节点B故障了,其中一个没有收到该写操作的从节点会晋升成主节点,该写操作就这样永远丢失了。

就像传统的数据库,在不涉及到分布式的情况下,它每秒写回磁盘。为了提高一致性,可以在写盘完成之后再回复客户端,但这样就要损失性能。这种方式就等于Redis集群使用同步复制的方式。

基本上,在性能和一致性(C)之间,需要一个权衡。

如果真的需要,Redis集群支持同步复制的方式,通过WAIT 指令来实现,这可以让丢失写操作的可能性降到很低。就算使用了同步复制的方式,Redis集群依然不是强一致性的,在某些复杂的情况下,比如从节点在与主节点失去连接之后被选为主节点,不一致性还是会发生。

这种不一致性发生的情况是这样的,当客户端与少数的节点(至少含有一个主节点)网络联通,但他们与其他大多数节点网络不通。比如6个节点,A,B,C是主节点,A1,B1,C1分别是他们的从节点,一个客户端称之为Z1。

当网络出问题时,他们被分成2组网络,组内网络联通,但2组之间的网络不通,假设A,C,A1,B1,C1彼此之间是联通的,另一边,B和Z1的网络是联通的。Z1可以继续往B发起写操作,B(主1)也接受Z1的写操作。当网络恢复时,如果这个时间间隔足够短,集群仍然能继续正常工作。如果时间比较长,以致B1(主2)在大多数的这边被选为主节点,那刚才Z1发给B的写操作都将丢失(多主脑裂)。

注意,Z1给B发送写操作是有一个限制的,如果时间长度达到了大多数节点那边可以选出一个新的主节点时,少数这边的所有主节点都不接受写操作。

这个时间的配置,称之为节点超时(node timeout),对集群来说非常重要,当达到了这个节点超时的时间之后,主节点被认为已经宕机,可以用它的一个从节点来代替。同样,在节点超时时,如果主节点依然不能联系到其他主节点,它将进入错误状态,不再接受写操作。

标签:redis,Z1,集群,B1,一致性,操作,节点,客户端
From: https://www.cnblogs.com/lygin/p/16864706.html

相关文章

  • redis的rdb与aof
    Redis持久化提供了多种不同级别的持久化方式:RDB持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-timesnapshot)。AOF持久化记录服务器执行的所有写操作......
  • 史上最详细Docker安装Redis (含每一步的图解)实战
    不仅教你安装,还教你删除。每一行命令都带图解,绝对能懂。大家对搭建RedisClustr(Redis集群)感兴趣的,可以看看这篇文章Docker搭建RedisCluster集群环境希望对大家有所......
  • Redis集群介绍
    什么是集群能够对外提供相同服务的多台服务器组成的集合。为什么要建立集群1.从可用性角度考虑,如果只有一台机器提供服务,一旦出现故障,那么整个服务不可用。2.从容量角......
  • OpenEuler2203 基于容器和本地文件部署Redis Cluster的过程以及简单性能测试
    背景其实文件搭建和集群搭建没有任何区别这次用先用容器搭建出来,然后测试一下性能想着再使用本地部署的方式搭建一下.两项验证容器和基于文件的搭建的性能差异部分资......
  • docker实战教程(十五):docker上安装redis
    简单版从dockerhub上拉取redis镜像到本地(指定版本为6.0.8)运行redis容器进入redis环境这样安装同样存在数据和配置文件的问题复杂版在Centos宿主机下新建目录/app......
  • MINIO搭建单机以及集群
    MINIO简介  Minio是ApacheLicensev2.0下发布的对象存储服务器。它与AmazonS3云存储服务兼容。它最适合存储非结构化数据,如照片,视频,日志文件,备份和容器/VM映像。对象......
  • pycharm操作redis
    安装在终端环境下输入:pipinstallredispycharm操作redis之普通连接#1.导入模块fromredisimportRedis#2.实例化产生链接对象conn=Redis()#连接本地的redi......
  • redis介绍和安装
    redis介绍redis是一种在内存进行存储数据的数据库,当然,它也支持将数据存储到硬盘上redis的存储方式是通过key-value的形式,value可以是很多数据类型,分别是:string(字符串)、li......
  • redis rdb与snapshot的关系
    关系RDB是Redis用来进行持久化的一种方式,在指定的时间间隔内将当前内存中的数据集快照写入磁盘,也就是Snapshot快照(数据库中所有键值对数据)。恢复时是将快照文件直接读到......
  • 使用jwt,redis,实现登录
    jwt是无状态的,不需要服务端存储登录用户信息,一次性生成token后,除非过期,不然是都可以用的。但是这样就产生了token续期、用户注销等问题。token续期怎么解决呢?1、使用......