集群之哈希槽搭建请阅:RedisCluster集群实现原理之哈希槽(hash slot)_huangyuewang的专栏-CSDN博客
如下图,上一章讲到搭建了3组集群,端口号依次为7000-7005,现在我们要扩容一组端口号为7006-7007
1,新增7006和7007节点
上面我们已经创建了redis7006/redis7007文件夹和redis.conf文件,接下来我们直接启动这2个节点
/application/redis/bin/redis-server /application/rediscluster/redis7006/redis.conf
/application/redis/bin/redis-server /application/rediscluster/redis7007/redis.conf
2,把7006节点增加到集群中
#最后面7000节点不是一定的,可以写7000-7005任意一节点皆可
/application/redis/bin/redis-cli --cluster add-node 172.16.166.122:7006 172.16.166.122:7000
3,扩容从节点
先查看7006在集群中的ID
/application/redis/bin/redis-cli -h 172.16.166.122 -p 7000 -c
cluster nodes
找到7006的集群ID,那么执行add-node即可
#172.16.166.122:7000 不是一定的,可以填7000-7005任意一端口
/application/redis/bin/redis-cli --cluster add-node 172.16.166.122:7007 172.16.166.122:7000 --cluster-slave --cluster-master-id beb327340e04d25fb6a0bf0b52a0440c1e170ad2
OK,到这里扩容2个节点7006和7007已经完成一半,但还没有分配哈希槽,无法进行写操作,继续往下看
4,分配哈希槽给7006
问题来了,总哈希槽是16384,平均分给3组,每组是5461,现在加多一组到集群,变成4组,平均每组 16384/4=4096,那么每组要抽取多少哈希槽给7006呢?4096/3=1365
这是道比较简单的数学题。
执行reshard进行从3组中抽取1365哈希缓存分配给7006
/application/redis/bin/redis-cli --cluster reshard 172.16.166.122:7000
执行后会弹出“您要移动多少个插槽(从 1 到 16384)” 输入上面算出来的结果4096
输入4096后会弹出接收者ID,我们输入上面找到的7006的集群ID
然后会弹出分配方式,是平均分配还是从其中一台抽取,我们使用平均分配 all
后面输入 yes即可
到这里扩容分哈希槽就完成了,接下来看分配的结果:
/application/redis/bin/redis-cli -h 172.16.166.122 -p 7000 -c
cluster nodes
下图这3段哈希槽就是那3组分配给7006的
到这里扩容完成
最关键时刻来了,测试集群,先连接到7000端口
#连接到集群
/application/redis/bin/redis-cli -h 172.16.166.122 -p 7000 -c
#查看集群节点
cluster nodes
测试写的操作:
测试 set aaa 1 数据存到 [10439]哈希槽,属于7001节点
测试 set bbb 2 数据存到 [5287]哈希槽,属于7000节点
测试 set ccc 3 数据存到 [135]哈希槽,属于7006节点
测试 set ddd 4 该key已经存在,修改不提示在哪个节点
测试 set eee 5 数据存到 [14407]哈希槽,属于7002节点
至此测试完成,集群共有4组,只有master才有写的权限,而上面测试数据分别存到7000,7001,7002,7006 master节点,测试结果通过。
看下图:
测试读的操作:
测试get aaa 从7001节点的哈希槽[10439]找到该key结果为 1
测试get ccc 从7006节点的哈希槽[135]找到该key结果为 3
测试通过。
底层原理是什么呢?怎么找到该key是否存在集群中?然后从中读取出对应的哈希槽和值呢?
通过 cluster help 查看帮助
cluster help
看下图有个 keyslot <key> 命令
输入 cluster keyslot aaa 我们看到结果是 10439 就是该key所在的哈希槽 [10439]
那么通过 cluster nodes我们可以看到[10439]属于 7001节点