redis 7.X 集群模式(cluster )搭建
背景介绍
Redis Cluster中,Sharding采用slot(槽)的概念,一共分成16384个槽,这有点儿类pre
sharding思路。对于每个进入Redis的键值对,根据key进行散列,分配到这16384个slot中的
某一个中。使用的hash算法也比较简单,就是CRC16后16384取模。 Redis集群中的每个
node(节点)负责分摊这16384个slot中的一部分,也就是说,每个slot都对应一个node负责处
理。当动态添加或减少node节点时,需要将16384个槽做个再分配,槽中的键值也要迁移。
Redis集群,要保证16384个槽对应的node都正常工作,如果某个node发生故障,那它负责
的slots也就失效,整个集群将不能工作。
本次集群部署,三台服务器分别为192.168.0.3、192.168.0.4、192.168.0.5,三个主节点,
无从节点。
什么是slots
一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插
槽的其中一个,
集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用
于计算键 key 的 CRC16 校验和 。
集群中的每个节点负责处理一部分插槽。 举个例子, 如果一个集群可以有主节点, 其中:
节点 A 负责处理 0 号至 5460 号插槽。
节点 B 负责处理 5461 号至 10922 号插槽。
节点 C 负责处理 10923 号至 16383 号插槽。
安装
redis的编译安装参考:
redis单机安装
注意 集群模式与 单节点 以及 哨兵模式因为slot(槽) 不兼容,不能直接在原有基础上修改,需要清空原来的安装目录下
的文件信息
修改配置文件
vim redis.conf
1
bind 0.0.0.0
2 protected-mode no
3 port 6379
4 daemonize no
5 pidfile /opt/redis7/redis_6379.pid
6 logfile ""
7
8 masterauth dawenzi
9 requirepass dawenzi
10
11 cluster-enabled yes
12 #这个是redis cluster集群自动生成的文件 用于记录相关信息 可以不用修改
13 cluster-config-file nodes-6379.conf
14 cluster-node-timeout 15000
15 #集群通信端口 0是默认值 当写0的时候代表 command port + 10000
16 cluster-port 0
启动redis服务
./bin/redis-server redis.conf
加入到集群
在任意一台集群主机上执行以下命令即可
1
bin/redis-cli --cluster create 192.168.30.94:6379 192.168.30.144:6379 192.168.30.92:6379
-a dawenzi --cluster-replicas 1
2 bin/redis-cli --cluster create 192.168.30.94:6379 192.168.30.144:6379 192.168.30.92:6379
-a dawenzi
3
4 一个集群至少要有三个主节点
5 选项 --cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
6 分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。
客户端连接测试
1
dawenzi@dawenzi-Lenovo-Erazer-Z400:/opt/redis7$ ./bin/redis-cli -c -p 6379
2 127.0.0.1:6379> auth dawenzi
3 OK
4 127.0.0.1:6379>
5 127.0.0.1:6379> cluster nodes
6 65dd48e6a8f603093678269217c6f68e16582bda 192.168.30.144:6379@16379 master - 0
1676622052225 2 connected 5461-10922
7 2305aef6133d67a04bad3c235b1c13a3a33c072f 192.168.30.94:6379@16379 myself,master - 0
1676622053000 1 connected 0-5460
8 5a1e6eb75c845cd1f6c4e7ea25bdca7f0bf8160c 192.168.30.92:6379@16379 master - 0
1676622053231 3 connected 10923-16383
常用命令
1
redis-cli -c -p 6380
2 -c 采用集群策略连接,设置数据会自动切换到相应的写主
3 查看集群信息
4 cluster nodes
5 不在一个slot下的键值,是不能使用mget,mset等多键操作。
6 可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去。
7 计算key的插槽值
8 cluster keyslot <keys>
9 查看插槽的值(只能查看节点本身的值)
10 cluster countkeysinslot <slot>
11 查询集群中数据(只能查看节点本身的值)
12 cluster getkeysinslot <slot> <count>
常见错误
1
ERR SELECT is not allowed in cluster mode
2
3 redis集群版只使用db0,select命令虽然能够支持select 0。其他的db都会返回错误。
配置文件示例



redis-cluster.conf 104.03KB