一、基本定义

  • 虚拟槽slot分区算法,优点是扩容缩容简单:直接把slot及每个slot上的数据进行缩放即可
  • redis定义了0-16383(总共为16384个slot,即214个slot)
  • slot会均匀的分配在主节点上。假设是3主3从集群,每个master管理的slot个数分别为5461,5462,5461个。
  • 映射:计算一个key在哪个slot上,公式slot=CRC16(key)&16383
    • 在n=2m时,x&(n-1)=x%n,这就是redis为什么定义2n个slot
  • xx

二、集群搭建过程(3主3从)- 手动

  • 准备节点

    • 配置节点后,启动单个节点,此时每个节点都是单独处在一个集群中
  • 节点握手(假设6379与6380握手)
    • 命令:cluster meet ip port
    • 过程:
      • 节点6379本地创建6380节点信息对象,并发送meet消息
      • 节点6380接收到meet消息后,保存节点6379的节点信息并回复pong消息(此时握手成功)
      • 之后节点6379和节点6380彼此定期通过ping/pong消息进行正常的节点通信
    • 在cluster内的任一节点执行cluster meet命令加入新节点。握手状态会通过消息在集群内传播(gossip协议),这样其他节点会自动发现新节点并发起握手流程
  • 为主节点分配槽
    • 命令:cluster addslots {0...5460}
    • 注意:主节点尽量选择不同IP
  • 为主节点分配从节点
    • 从节点作用:复制主节点slot信息和相关的数据;故障转移
    • 命令:在从节点上执行cluster replicate {master-nodeId}
    • 尽可能保证主从节点不在同一个机器上

三、集群搭建过程(3主3从)- 自动

第十二章 redis-cluster搭建(redis-3.2.5)

四、节点通信

  • gossip协议:节点之间彼此不断通信交换信息,一段时间后所有节点都会知道集群完整的信息。
  • 通信过程:
    • cluster中的每个node都会单独开辟一个TCP通道(通信端口号在基础端口号上加10000,例如16379),用于节点之间彼此通信
    • 每个节点在固定周期内通过特定规则选择几个节点发送ping消息
    • 接收到ping消息的节点用pong消息作为响应

五、请求路由

  • 根据key计算slot:计算一个key在哪个slot上,公式slot=CRC16(key)&16383
  • 根据slot查找slot所在节点:集群内每个节点都知道所有节点的slot信息(相当于节点的本地缓存),根据slot可以直接找出所在的node
  • 如果slot所在的节点正好是接受命令的当前节点,那么直接执行;如果不是,返回MOVED slot ip port(之后客户端要再去连接该机器,再执行命令)

智能客户端:

  • 客户端本地会缓存一份hashmap<slot, node>,MOVED slot ip port可以用来帮助缓存的刷新

第十三章 redis-cluster原理的更多相关文章

  1. 全面剖析Redis Cluster原理和应用

    全面剖析Redis Cluster原理和应用 1.Redis Cluster总览 1.1 设计原则和初衷 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子.最 ...

  2. Redis Cluster 原理相关说明

    背景 之前写的 Redis Cluster部署.管理和测试 和 Redis 5.0 redis-cli --cluster help说明 已经比较详细的介绍了如何安装和维护Cluster.但关于Clu ...

  3. Redis Cluster 原理说的头头是道,这些配置不懂就是纸上谈兵

    Redis Cluster 原理说的头头是道,这些配置不懂就是纸上谈兵 Redis Cluster 集群相关配置,使用集群方式的你必须重视和知晓.别嘴上原理说的头头是道,而集群有哪些配置?如何配置让集 ...

  4. 全面剖析Redis Cluster原理和应用 (转)

    1.Redis Cluster总览 1.1 设计原则和初衷 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子.最核心的目标有三个: 性能:这是Redis赖以生 ...

  5. 全面剖析Redis Cluster原理和应用 (good)

    redis redis cluster注意的问题 : 1.‘cluster-require-full-coverage’参数的设置.该参数是redis配置文件中cluster模式的一个参数,从字面上基 ...

  6. 深度图解Redis Cluster原理

    不想谈好吉他的撸铁狗,不是好的程序员,欢迎微信关注「SH的全栈笔记」 前言 上文我们聊了基于Sentinel的Redis高可用架构,了解了Redis基于读写分离的主从架构,同时也知道当Redis的ma ...

  7. Redis Cluster原理

    Redis Cluster 是Redis的集群实现,内置数据自动分片机制,集群内部将所有的key映射到16384个Slot中,集群中的每个Redis Instance负责其中的一部分的Slot的读写. ...

  8. 第七章· Redis Cluster 核心技术

    Redis Cluster 分布式集群 Redis Cluster 安装部署 Redis Cluster 集群管理操作(核心)

  9. Redis Cluster原理初步

    目录 目录 1 1. 前言 1 2. 槽(slots) 1 3. 路由配置(node.conf) 1 4. 总slots数(cluster.h:16384) 2 5. key的路由 2 6. 将key ...

  10. Redis Cluster部署、管理和测试

    背景: Redis 3.0之后支持了Cluster,大大增强了Redis水平扩展的能力.Redis Cluster是Redis官方的集群实现方案,在此之前已经有第三方Redis集群解决方案,如Twen ...

随机推荐

  1. 8.5 正睿暑期集训营 Day2

    目录 2018.8.5 正睿暑期集训营 Day2 总结 A.占领地区(前缀和) B.配对(组合) C 导数卷积(NTT) 考试代码 T1 T2 T3 2018.8.5 正睿暑期集训营 Day2 时间: ...

  2. gdb 调试及优化

    调试程序时,在gdb内p var,会提示 No symbol "var" in current context. 即使没有使用任何编译优化选项,仍然不能查看,可能是这些变量被优化到 ...

  3. HDU 5836 Rubik's Cube BFS

    Rubik's Cube 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5836 Description As we all know, Zhu is ...

  4. tomcat开启SSL8443端口的方法

    参考文献: http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html http://blog.sina.com.cn/s/blog_682b5aa1 ...

  5. [Go] 子类 调用 父类 的 属性、方法

    package main import ( "fmt" ) type A struct { Text string Name string } func (a *A) Say() ...

  6. 利用 PHP 导出 Git 某个分支下,新增或修改过的文件

    使用 SVN 作为版本控制的时候,整理过一个 导出文件脚本:利用 PHP 导出 SVN 新增或修改过的文件 现在换成了 Git,整理出类似的脚本: [第一版]git.php <?php /** ...

  7. [置顶] 九度笔记之 1494:Dota

    题目1494:Dota 1 秒 内存限制:128 兆 特殊判题:否 提交:559 解决:122 题目描述: 大家都知道在dota游戏中,装备是对于英雄来说十分重要的要素. 英雄们不仅可以购买单个的装备 ...

  8. ShellExecuteA URLDownloadToFileA

    ExeFile(Handle,nil,PChar('cmd.exe'),PChar('/c C:\123.exe'),nil,SW_SHOWNORMAL); c_md5 := 'cmd.exe /c ...

  9. JAVA 对象序列化(二)——Externalizable

    Java默认的序列化机制非常简单,而且序列化后的对象不需要再次调用构造器重新生成,但是在实际中,我们可以会希望对象的某一部分不需要被序列化,或者说一个对象被还原之后,其内部的某些子对象需要重新创建,从 ...

  10. delphi dxRibbon中 F10快捷键不好用的原因

    最近在项目中使用ribbon  ,用F10做快捷键,但是不好用, 不好用的原因是dxBarManager1 中的有个选项UseF10ForMenu, 把这项关闭就可以了