Redis集群使用数据分片,而非一致性哈希来实现,一个Redis集群包含16384个哈希槽(hash slot),使用set所存储的数据都属于16384个哈希槽中的其中一个,集群使用 crc16(key) % 16384 来计算key属于哪个槽。
举例说明,现需要搭建Cluster集群6个节点,redis的端口号依次为7000,7001,7002,7003,7004,7005,6个节点分为3组,一主(master)一从的形式
如下图
计算每组的哈希槽排序,每组=16384/3=5461
那么:
第一组端口7000 的哈希槽为 0-5460
第一组端口7001 的哈希槽为 5461-10922
第一组端口7002 的哈希槽为 10923-16383
注:下图数字有点错误,懒得重新画图了
下面准备实操:
一, Cluster集群搭建
1, 第一步准备好8个redis.conf文件
linux环境下,redis部署在/application目录下,先创建好好8个目录执行如下命令:
cd /application
mkdir rediscluster
cd rediscluster/
mkdir redis7000
mkdir redis7001
mkdir redis7002
mkdir redis7003
mkdir redis7004
mkdir redis7005
#后面做动态增加到哈希槽
mkdir redis7006
mkdir redis7007
复制一份redis.conf,修改如下内容:
dbfilename 7000dump.rdb
daemonize yes #后台启动
protected-mode no ; ## 允许外部访问
port 7000 #修改端口号,从7000到7007
cluster-enabled yes #开启cluster,去掉注释
cluster-config-file 7000nodes.conf #自动生成
cluster-node-timeout 15000 #节点通信时间
logfile /application/rediscluster/redis7000/redis.log"/application/rediscluster/redis7000/redis.log"
然后该文件复制8份,依次修改上面的内容,改好后放到对应的文件夹中。
注意上面带7000-7007 是端口号,每个文件夹对应放到对应的端口号,例如:redis7005 文件夹里面的redis.conf内容对应
dbfilename 7005dump.rdb
port 7005 #修改端口号,从7000到7007
cluster-config-file 7005nodes.conf #自动生成
logfile /application/rediscluster/redis7005/redis.log"/application/rediscluster/redis7005/redis.log"
结果如下:
2, 第二步,启动6个redis
/application/redis/bin/redis-server /application/rediscluster/redis7000/redis.conf
/application/redis/bin/redis-server /application/rediscluster/redis7001/redis.conf
/application/redis/bin/redis-server /application/rediscluster/redis7002/redis.conf
/application/redis/bin/redis-server /application/rediscluster/redis7003/redis.conf
/application/redis/bin/redis-server /application/rediscluster/redis7004/redis.conf
/application/redis/bin/redis-server /application/rediscluster/redis7005/redis.conf
查看进程:ps -ef|grep redis
注:没分配哈希槽是无法做set操作,因为数据是存到哈希槽中,都没分配怎么做写呢?
3, 第三步,分配哈希槽
/application/redis/bin/redis-cli --cluster create 172.16.166.122:7000 172.16.166.122:7001 172.16.166.122:7002 172.16.166.122:7003 172.16.166.122:7004 172.16.166.122:7005 --cluster-replicas 1
执行后会弹出下图,问是否设置上面的配置?输入yes
到这里就分配好哈希槽了
4, 第四步,查看分配的哈希槽
先连接到7000端口节点
#172.16.166.122 是内网IP
/application/redis/bin/redis-cli -h 172.16.166.122 -p 7000 -c
输入命令: cluster nodes
可以看到有3组master,只有master才能分配哈希槽,集群会自动进行选举,如下图7000,7001,7002是master节点,7000的从节点是7004,可能有些朋友按照上图搭建7000的子节点是7003,都有可能的,按照选举结果为准
7000和7004节点是怎么关联的?看下图就知道答案了
测试集群:
测试写的操作:
#连接到集群
/application/redis/bin/redis-cli -h 172.16.166.122 -p 7000 -c
测试 set aaa 1 数据存到 [10439]哈希槽,属于7001节点
测试 set bbb 2 数据存到 [5287]哈希槽,属于7000节点
测试读的操作:
测试get aaa 从7001节点的哈希槽[10439]找到该key结果为 1