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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐