Redis集群的那些谜

2023-11-05

下列问题是我在搭建Redis集群之前与实验过程发出的疑问

随着我Redis集群的成功搭建,疑问也一个一个解开

Redis集群搭建参考资料

Redis-Cluster参考资料

Redis集群的数据互通吗?

先说结论互通的;往Redis集群里存放一个数据时,他会以Hash Slot哈希槽的方式将数据存放在不同的结点,取出对应Key时,再连接到该结点去取出。

  • 以集群模式随机连接至一个Redis结点,此结点中无数据:

    root@hadoop102:~/myredis# ./redis-cli -c -h 192.168.150.102 -p 7002
    192.168.150.102:7002> keys *
    (empty list or set)
    
  • 随机Set多个值,发现客户端居然在结点间不停地切换:

    192.168.150.102:7002> set helloWorld OKOK
    -> Redirected to slot [519] located at 192.168.150.102:7001
    OK
    192.168.150.102:7001> set OKOK hahaha
    -> Redirected to slot [13171] located at 192.168.150.104:7001
    OK
    192.168.150.104:7001> set XIXIXI OKOKOK
    -> Redirected to slot [10749] located at 192.168.150.103:7001
    OK
    
  • 在某一个结点上,查看结点上的Key,并get一个曾经set过的,但是并不存放此结点的Key,发现连接到了该结点,并成功取出了。

    192.168.150.102:7001> keys *
    1) "hello"
    2) "helloWorld"
    192.168.150.102:7001> get OKOK
    -> Redirected to slot [13171] located at 192.168.150.104:7001
    "hahaha"
    



为什么在集群模式下SetGet总是会出现Redirected to slot字样,并跳转到目的主机?

因为Redis集群采用了Hash Slot的模式,每个结点都存放一段不同的分片

Redis集群中有16384个hash slots,为了计算给定的key应该在哪个hash slot上,我们简单地用这个key的CRC16值来对16384取模。(即:key的CRC16 % 16384)

为什么要使用Hash Slots而不是一致性哈希算法?

  • Hash Slots继承并增强一致性哈希的容错性,扩展性,以及平衡性。 Redis在此种算法下,可以当缓存,也能当存储数据库!

因为将hash slots从一个节点移动到另一个节点并不需要停止其它的操作,添加、删除节点以及更改节点所维护的hash slots的百分比都不需要任何停机时间。也就是说,移动hash slots是并行的,移动hash slots不会影响其它操作。

集群模式下,不同数据存放在不同的结点,那怎么该结点宕机了怎么办?

结论
  • 启动Master-Slave模式,为每一个Master配备Slave
  • Master宕机后,Slave内有Master的备份数据,将代替Master工作,不至于集群的数据丢失
  • 当集群中的其中一组MasterSlave都不可用的情况下,,Hash-Slots的分片数据丢失,集群不可用
实战演示
  • Redis-Cluster模式中,验证MasterSlave数据是否一致:

    • 数据连接到集群中的一台Master查看其Slave信息:命令info

      # Replication
      role:master
      connected_slaves:2
      slave0:ip=192.168.150.102,port=7003,state=online,offset=4873,lag=1
      slave1:ip=192.168.150.104,port=7003,state=online,offset=4873,lag=1
      
    • 查看Master数据,并连接到其中一个Slave查看数据:

      192.168.150.103:7001> keys *
      1) "test"
      2) "OKO"
      3) "XIXIXI"
      192.168.150.103:7001>
      root@hadoop102:~/myredis# ./redis-cli -c -h 192.168.150.102 -p 7003
      192.168.150.102:7003> keys *
      1) "XIXIXI"
      2) "OKO"
      4) "test"
      
    • 人为宕掉Master后马上在Slave上查看状态:down宕机状态

      # Replication
      role:slave
      master_host:192.168.150.103
      master_port:7001
      master_link_status:down
      
    • 过了几秒后再次查看:有了新的Master

      # Replication
      role:slave
      master_host:192.168.150.104
      master_port:7003
      master_link_status:up
      
    • 其实此结点也可能成为结点,条件如下:

      • 竞选Master结点条件优先级:
        • 配置文件中的优先级,高的优先
        • 结点的数据偏移量,高的优先
        • 集群启动时的run_id, 小的优先
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis集群的那些谜 的相关文章

  • 如何打印整个字符串池?

    我想打印包含文字的整个字符串池String使用添加的对象intern 就在垃圾收集之前 JDK有没有隐式的方法来进行这样的操作 我们如何检查字符串池 EDIT The comment suggests that there may be a
  • 将链接对象转换为流或集合

    我想迭代堆栈跟踪 堆栈跟踪由可抛出对象组成 其 getCause 返回下一个可抛出对象 最后一次调用 getCause 返回 null 示例 a gt b gt null 我尝试使用 Stream iterable 这会导致 NullPoi
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • MI设备中即使应用程序被杀死,如何运行后台服务

    您好 我正在使用 alaram 管理器运行后台服务 它工作正常 但对于某些 mi 设备 后台服务无法工作 我使用了服务 但它无法工作 如何在 mi 中运行我的后台服务 MI UI有自己的安全选项 所以你需要的不仅仅是上面提到的粘性服务 你需
  • 为什么单个 Redis 实例不是线程安全的?

    https github com xetorthio jedis wiki Getting started https github com xetorthio jedis wiki Getting started 在多线程环境中使用Jed
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • Java 变量的作用域

    我不明白为什么这段代码的输出是10 package uno public class A int x 10 A int x 12 new B public static void main String args int x 11 new
  • 服务器到 Firebase HTTP POST 结果为响应消息 200

    使用 Java 代码 向下滚动查看 我使用 FCM 向我的 Android 发送通知消息 当提供正确的服务器密钥令牌时 我收到如下所示的响应消息 之后从 FCM 收到以下响应消息 Response 200 Success Message m
  • 所有junit测试后的清理

    在我的项目中 我必须在所有测试之前进行一些存储库设置 这是使用一些棘手的静态规则来完成的 然而 在所有测试之后我不知道如何进行清理 我不想保留一些神奇的静态数字来引用所有测试方法的数量 我应该一直维护它 最受赞赏的方法是添加一些侦听器 该侦
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • 如何在java中使jpeg无损?

    有没有人可以告诉我如何使用编写 jpeg 文件losslessjava中的压缩 我使用下面的代码读取字节来编辑字节 WritableRaster raster image getRaster DataBufferByte buffer Da
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • 阻止 OSX 变音符号为所有用户禁用 Java 中的 KeyBindings?

    注 我知道这个问题 https stackoverflow com questions 40335285 java keybinds stop working after holding down a key用户必须输入终端命令才能解决此问
  • 来自客户端的超时 Web 服务调用

    我正在使用 RestEasy 客户端调用网络服务 一项要求是 如果调用运行时间超过 5 秒 则中止 超时调用 我如何使用 RestEasy 客户端实现这一目标 我只看到服务器端超时 即如果在一定时间内未完成请求 Rest Easy 网络服务
  • Spock模拟inputStream导致无限循环

    我有一个代码 gridFSFile inputStream bytes 当我尝试这样测试时 given def inputStream Mock InputStream def gridFSDBFile Mock GridFSDBFile
  • Path2D 上的鼠标指针检测

    我构建了一个Path2D http docs oracle com javase 7 docs api java awt geom Path2D html表示由直线组成的未闭合形状 我希望能够检测何时单击鼠标并且鼠标指针靠近路径 在几个像素
  • 如何将实例变量传递到 Quartz 作业中?

    我想知道如何在 Quartz 中外部传递实例变量 下面是我想写的伪代码 如何将 externalInstance 传递到此作业中 public class SimpleJob implements Job Override public v
  • 没有适用于机器人的 Laravel 会话

    我在大型 Laravel 项目和 Redis 存储方面遇到问题 我们将会话存储在 Redis 中 我们已经有 28GB 的 RAM 然而 它的运行速度仍然相对较快 达到了极限 因为我们有来自搜索引擎机器人的大量点击 每天超过 250 000
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr
  • 尝试使用带有有效购买令牌的 Java Google Play Developer API v3 检索应用内购买信息时出现错误请求(无效值)

    当使用 Java Google Play Developer API 版本 3 并请求有效购买令牌的购买信息时 我收到以下异常 API 调用返回 400 Bad Request 响应以及以下消息 code 400 errors domain

随机推荐

  • 计算字符串长度函数大全

    字符串的长度通常是指字符串中包含字符的数目 但有的时候人们需要的是 字符串所占字节的数目 常见的获取字符串长度的方法包括如下几种 1 使用sizeof获取字符串长度 sizeof的含义很明确 它用以获取 字符数组的字节数 当然包括结束符 0
  • 攻防世界之disabled_button(web简单)

    老师今天上课讲了前端知识 然后给了大家一个不能按的按钮 小宁惊奇地发现这个按钮按不下去 到底怎么才能按下去呢 打开可以看到一个按钮 但是无法点击 按f12 打开代码 这里是可以互动的 找到按钮位置 删除属性 disabled 按下回车 确认
  • SQL Server附加数据库错误5123,另一个进程正在调用

    情况一 在使用sql server附加数据库时 出现了 首先 我想讲一个故事 我想拿自己的银行卡 取出父亲银埋在家中30米地下的钱 这两个对象的位置是同一个吗 显然不是 出现此报错的原因是 我在自己的机器上登录远程服务器数据库 然后检索远程
  • redis 三. hash应用场景及底层分析

    Hash 类型 一 简单命令示例 二 java 操作示例 三 使用场景 四 底层分析 ziplist 压缩列表 ziplist内部entry详解 ziplist内存分配与连锁更新 ziplist 小总结 hashtable 字典 一 简单命
  • vue面试题:说说vue操作真实dom性能瓶颈

    vue面试题 说说vue操作真实dom性能瓶颈 下面一起来看看吧 vue性能瓶颈的几种情况 一次渲染大量的数据的时候 存在大量数据并且都是复杂类型的时候 会导致vue对数据的劫持时间和渲染时间变长 js 连续执行时间过长 会导致页面长时间无
  • nodejs之Buffer(缓冲区)

    参考 http www runoob com nodejs nodejs buffer html JavaScript 语言自身只有字符串数据类型 没有二进制数据类型 但在处理像TCP流或文件流时 必须使用到二进制数据 因此在 Node j
  • 这是一篇用来刷题群测试博客

    这是一篇用来刷题群测试博客 这是一篇用来刷题群测试博客
  • 研究ELF文件的工具objdump&readelf

    NAME objdump display information from object files SYNOPSIS objdump a archive headers b bfdname target bfdname C demangl
  • warning: #223-D: function “strlen“ declared implicitly

    问题描述 在使用Keil5编译C文件时报错 warning 223 D function strlen declared implicitly 问题解决 在主函数中加入 extern size t strlen const char
  • continue与break --- 循环控制的两大巨头

    目录 前言 break continue 总结 前言 continue与break都是用于循环语句的 帮助我们更好的控制循环流程 我们以while循环为例 来深度解析continue与break语句 这是while语句的基本结构 结合con
  • FastDFS安全注意事项

    FastDFS安全注意事项 本篇文章转载于 FastDFS 作者 余庆 大佬的 FastDFS分享与交流 公众号 对于互联网应用 FastDFS 的标准使用姿势 通过 FastDFS API 进行文件上传等更新操作 storage serv
  • Jmeter(二十八) - 从入门到精通 - Jmeter Http协议录制脚本工具-Badboy1(详解教程)

    1 简介 在使用jmeter自动录制脚本时会产生很多无用的请求 所以推荐使用badboy录制脚本之后保存为jmx文件 在jmeter中打开使用 因此宏哥在这里介绍一下Badboy这款工具 本来打算不做介绍了 原因是因为这款工具已经不在维护和
  • python-selenium-弹窗的处理

    切换到弹窗视角 alert driver switch to alert 点击弹窗中的确认 alert accept 点击弹窗中的取消 alert dismiss 获取弹出框的信息内容 alert text 当遇到弹窗时 1 切换到弹窗视角
  • Android Socket详细使用攻略

    前言 Socket的使用在 Android网络编程中非常重要 今天我将带大家全面了解 Socket 及 其使用方法 目录 1 网络基础 1 1 计算机网络分层 计算机网络分为五层 物理层 数据链路层 网络层 运输层 应用层 其中 网络层 负
  • C语言第一次作业练习

    以下程序教材基于 谭浩强C程序设计 第四版 第1题 参照例1 3 在Visual C 6 0环境中继续完成教材P 15 习题6 此程序于2017年3月1日12 48编写 目的 当用户在命令窗口输入a b c三个值 输出 其中最大者 incl
  • windows10下配置android-studio-ide

    前言 android studio ide配置对于新手来说可能有一点点麻烦 这里详细记录一下 希望对新手有所帮助 大佬请忽略哈 下载 android studio ide官网下载地址 谷歌官网的这个地址目前对天朝开放 android stu
  • C#判断字符串中有没有字母,正则表达式、IsLetter

    要判断字符串中是否包含字母 可以使用正则表达式或者循环遍历字符串的方式 方法一 使用正则表达式 using System Text RegularExpressions string input Hello123 bool contains
  • 单例模式、工厂模式,观察者模式

    单例模式 Singleton 限制了类的实例化次数只能一次 从经典意义来将 单例模式 在实例不存在的时候 可以通过一个方法创建一个类来实现创建类的新实例 如果实例已经存在 他会简单返回该对象的引用 单例模式不同于静态类 可以推迟它们的初始化
  • csharp:Dapper Sample

    You can find Dapper on Google Code here http code google com p dapper dot net and the GitHub distro here https github co
  • Redis集群的那些谜

    下列问题是我在搭建Redis集群之前与实验过程发出的疑问 随着我Redis集群的成功搭建 疑问也一个一个解开 Redis集群搭建参考资料 Redis Cluster参考资料 Redis集群的数据互通吗 先说结论 互通的 往Redis集群里存