Redis集群---槽道原理

1.概述

在redis-cluster 存在分布式计算原则-----hash 槽,引入16384个槽道 slot.

2.槽道组成结构

位序列:16384位的二进制,以2048个元素的byte数据存储在每个节点内存里 byte[2048]

共享数组/索引数组:16384个元素的数组,元素值,指向的是一个内存的节点对象node

3.位序列

每个节点在集群创建之初都会根据槽道管理权的分配创建一个二进制数据 
1.主节点的二进制:将管理的槽道和二进制中的bit值做对应关系 
16384位的二进制定义,从左到右,位数0,1,2,…16383 对应槽道号;相当于每一个槽道号都能在这个主节点的二进制中找到一个bit与其对应,如果对应的bit是1,表示该槽道号在本节点有管理权,如果是0没有管理权.
2.从节点的二进制:因为从节点没有槽道管理权的,二进制的值0 

根据上述描述的逻辑,能从8000的二进制中判断任意一个槽道管理权是否归8000所有,他的二进制的特点 前5461位(0-5460)的bit都是1,其他剩余位都是0

如:槽道号0-5460,那么前5461位都是1,后面的都是0,2365对应到二进制是1,那么就在该节点管理,5499对应的二进制是0,不在该节点管理范围

槽道号:5461-10922,它的二进制位序列00001111.....0000

使用位序列判断所属权

  • 在8002中调用set name haha
    • 判断5798这个槽道8002没有所属权
    • 到位序列中找5798下标对应的bit-->0
    • 计算name的槽道号 name-->5798

通信的作用(为什么槽道号16384个):

集群节点内部通信时,需要封装一个通信槽道状态数据,用到了这个2进制,byte[2048]大小刚好是2KB,通信头中有一个头携带这个二进制,如果槽道16385 至少2个2KB的头才能写到当前节点想要传送出去的槽道数据

4.索引/共享数组

4.1集群的创建阶段经过两两互联通信

经过两两互联通信,每个节点中的节点信息对象,都会通信给其他所有节点,所以登录一个创建好的集群中任何一个节点,能够通过cluster nodes查看到所有节点信息.

集群的节点越多,每个节点保存的所有节点信息数据量越大.扩展上限1000个节点原因之一.理论上分片个数可以16384,每个主节点管理一个槽道.不管理槽道的主节点可以有无数个

4.2分配槽道状态

 经过集群的创建,经过节点信息的相互交互,可以进行槽道的分配,不进行槽道分配16384个槽道未分配状态,集群不可以,一旦在某个节点指定管理的某一批槽道,随着二进制的变化作为互联的数据告知其他所有节点

4.3创建数组

每个集群节点中,只要集群创建完毕都会保存一个完全一样的数组对象.他是在一开始就创建的,但是元素的赋值是在分配槽道时完成的

分配槽道时,二进制在变化,两两互联中携带相互传递,所有节点都能获取集群槽道的所有分配结果.所有节点将会对这个数组进行赋值.

元素个数16384个,下标刚好对应槽道号.对应元素的值,引用变量指向该槽道的正确管理者.

  • 数组创建所属权判断完毕之后寻找正确管理
    • 8002调用set name
    • name-->5798-->bit 0没有管理权
    • 到数组中拿到5798下标的元素引用变量--->8001详细信息包括ip port
    • 让客户端重定向到8001
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值