一、基本定义

  • 虚拟槽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可以用来帮助缓存的刷新

最新文章

  1. MySql免安装版安装配置,附MySQL服务无法启动解决方案
  2. AFNetworking 3.1
  3. 从零开始学习jQuery (一) 开天辟地入门篇
  4. MVC小系列(二)【Razor 模板引擎】
  5. Team Foundation Server操作说明
  6. linux安装LNMP的资源
  7. Django之强大的Form功能
  8. 1.3 正则表达式和python语言-1.3.4使用 match()方法匹配字符串
  9. MySQL 8.0.13 下载安装教程
  10. 设计模式-行为型模式,python访问者模式
  11. MySQL的查询语句
  12. linux查看RAID信息
  13. 通过SSH秘钥登录线上MySQL数据库(基于Navicat)
  14. 基础004_V7-DSP Slice
  15. TPM、read counts、RPKM/FPKM你选对了吗?
  16. git 查看和撤销
  17. input文本框与图片的对齐
  18. github pages+hexo自建博客
  19. HDU 5336 XYZ and Drops
  20. 很让人受教的提高php代码质量的方法

热门文章

  1. Generator函数执行器-co函数库源码解析
  2. 22.python中的面向对象和类的基本语法
  3. php版本CKEditor 4和CKFinder安装及配置
  4. BZOJ.4516.[SDOI2016]生成魔咒(后缀数组 RMQ)
  5. hdu 5828 Rikka with Sequence 线段树
  6. Kernel 4.9的BBR拥塞控制算法与锐速
  7. 使用POI操作PPT文档(插入文本、图片)转
  8. ROS知识(23)——行为树Behavio Tree原理
  9. Hadoop系列之(二):Hadoop集群部署
  10. 为什么不要在 JavaScript 中使用位操作符?