目录
[Redis Cluster集群模式](#Redis Cluster集群模式)
Redis Cluster集群模式
1、介绍
redis3.0版本推出的Redis Cluster 集群模式,每个节点都可以保存数据和整个集群状态,每个节点都和其他所有节点连接。Cluster 一般由多个节点组成,节点数量至少为 6 个才能保证组成完整高可用的集群,其中三个为主节点,三个为从节点。三个主节点会分配槽,处理客户端的命令请求,而从节点可用在主节点故障后,顶替主节点。
2、架构设计
- Redis 集群是一种分布式架构,数据被分片存储在多个节点上。
- 每个节点可以同时处理读写请求,这样可以有效分担负载。
- 数据通过哈希槽进行分片,整个集群最多支持 16384 个哈希槽。每个键在写入时会通过哈希函数计算出其对应的哈希槽,进而确定存储在哪个节点上。
图片来源:最通俗易懂的 Redis 架构模式详解 - 墨天轮
3、集群模式实操
3.1、环境准备
Redis集群需要至少3个主节点和3个从节点组成,这样在主节点出现故障时,可以通过从节点提供持久化数据访问,保证系统的可用性。所以我们这里准备三台Linux服务器,6个节点来做这个实验。
|--------------|------|
| 10.211.55.52 | 6379 |
| | 6380 |
| 10.211.55.53 | 6379 |
| | 6380 |
| 10.211.55.54 | 6379 |
| | 6380 |
三台均需下载安装redis
bash
精简版
[root@iycms ~]# wget http://download.redis.io/releases/redis-7.2.6.tar.gz
[root@iycms /]# tar -zxvf /root/redis-7.2.6.tar.gz -C /usr/
[root@iycms /]# cd /usr/redis-7.2.6/
[root@iycms redis-7.2.6]# make
创建配置文件存放目录、数据存放目录(所有服务器均需要)
bash
mkdir -p /usr/redis-7.2.6/redis_63{79,80}/conf
mkdir -p /var/redis/63{79,80}/{pid,log}
编写集群配置文件(所有服务器均需,注意端口号修改)
bash
vim /usr/redis-7.2.6/redis_6379/conf/redis.conf
#录入以下信息
#快速修改::%s/6379/6380/g
#绑定端口
port 6379
#绑定地址
bind 0.0.0.0
#守护模式启动
daemonize yes
#pid存放地址
pidfile /var/redis/6379/run/redis_6379.pid
#log存放地址
logfile /var/redis/6379/log/redis_6379.log
数据存储目录
dir /var/redis/6379
#是否以集群模式启动
cluster-enabled yes
#生成的集群配置文件名
cluster-config-file nodes-6379.conf
#超时时间,超过即下线
cluster-node-timeout 5000
#AOF模式
appendonly yes
#关闭保护模式
protected-mode no
3.2、启动集群
每台服务器执行
bash
[root@master ~]# /usr/redis-7.2.6/src/redis-server /usr/redis-7.2.6/redis_6379/conf/redis.conf
[root@master ~]# /usr/redis-7.2.6/src/redis-server /usr/redis-7.2.6/redis_6380/conf/redis.conf
启动查看进程可以看到cluster
bash
[root@master ~]# ps -ef | grep redis
root 8833 1 0 13:09 ? 00:00:00 /usr/redis-7.2.6/src/redis-server 0.0.0.0:6379 [cluster]
root 8840 1 0 13:09 ? 00:00:00 /usr/redis-7.2.6/src/redis-server 0.0.0.0:6380 [cluster]
root 8848 8466 0 13:10 pts/1 00:00:00 grep --color=auto redis
查看集群配置文件
bash
[root@master ~]# vim /var/redis/6379/nodes-6379.conf
a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9 :0@0,,tls-port=0,shard-id=3e19853b240c5212b80b60093d61c05e4944dc81 myself,master - 0 0 0 connected
vars currentEpoch 0 lastVoteEpoch 0
#a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9:0@0代表唯一标识符。
#connected表示节点已经成功加入集群
3.3、加入集群
查看集群所有节点cluster nodes
bash
[root@master ~]# /usr/redis-7.2.6/src/redis-cli
127.0.0.1:6379> cluster nodes
a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9 :6379@16379 myself,master - 0 0 0 connected
很明显现在各个节点虽然启动了,但是没有加入到同一集群,现在我们需要创建并加入集群
bash
[root@master ~]# /usr/redis-7.2.6/src/redis-cli --cluster create 10.211.55.52:6379 10.211.55.52:6380 10.211.55.53:6379 10.211.55.53:6380 10.211.55.54:6379 10.211.55.54:6380 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 10.211.55.53:6380 to 10.211.55.52:6379
Adding replica 10.211.55.54:6380 to 10.211.55.53:6379
Adding replica 10.211.55.52:6380 to 10.211.55.54:6379
M: a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9 10.211.55.52:6379
slots:[0-5460] (5461 slots) master
S: 80c0cb2658770e28900e0f331001f3e6aa4b8f46 10.211.55.52:6380
replicates c7a60dbe6b19408bcd2fe4025d692217ac056727
M: 58614a8515f84090c6ba38d9755148b985c136cb 10.211.55.53:6379
slots:[5461-10922] (5462 slots) master
S: a5bffa3f5c7a47fae9d3436614d0ba6a91692447 10.211.55.53:6380
replicates a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9
M: c7a60dbe6b19408bcd2fe4025d692217ac056727 10.211.55.54:6379
slots:[10923-16383] (5461 slots) master
S: d7110c436b1f345a07cb85a59050298576172820 10.211.55.54:6380
replicates 58614a8515f84090c6ba38d9755148b985c136cb
Can I set the above configuration? (type 'yes' to accept):
#填入yes
--cluster-replicas 1选项告诉 Redis 每个主节点应该有一个从节点。
在这里从节点的分配不是静态的。在集群运行过程中,如果主节点出现故障,其从节点可能会被提升为主节点
3.3.1、查看下集群的所有节点及其他信息
哈希槽、主从关系
127.0.0.1:6379> cluster nodes
a5bffa3f5c7a47fae9d3436614d0ba6a91692447 10.211.55.53:6380@16380 slave a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9 0 1734374444589 1 connected
a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9 10.211.55.52:6379@16379 master - 0 1734374445631 1 connected 0-5460
c7a60dbe6b19408bcd2fe4025d692217ac056727 10.211.55.54:6379@16379 master - 0 1734374445000 5 connected 10923-16383
d7110c436b1f345a07cb85a59050298576172820 10.211.55.54:6380@16380 slave 58614a8515f84090c6ba38d9755148b985c136cb 0 1734374445525 3 connected
80c0cb2658770e28900e0f331001f3e6aa4b8f46 10.211.55.52:6380@16380 slave c7a60dbe6b19408bcd2fe4025d692217ac056727 0 1734374444896 5 connected
58614a8515f84090c6ba38d9755148b985c136cb 10.211.55.53:6379@16379 myself,master - 0 1734374444000 3 connected 5461-10922
3.3.2、查询哈希槽分配
[root@master ~]# /usr/redis-7.2.6/src/redis-cli -c -h 10.211.55.52 -p 6379 cluster slots
1) 1) (integer) 0
2) (integer) 5460
3) 1) "10.211.55.52"
2) (integer) 6379
3) "a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9"
4) (empty array)
4) 1) "10.211.55.53"
2) (integer) 6380
3) "a5bffa3f5c7a47fae9d3436614d0ba6a91692447"
4) (empty array)
2) 1) (integer) 5461
2) (integer) 10922
3) 1) "10.211.55.53"
2) (integer) 6379
3) "58614a8515f84090c6ba38d9755148b985c136cb"
4) (empty array)
4) 1) "10.211.55.54"
2) (integer) 6380
3) "d7110c436b1f345a07cb85a59050298576172820"
4) (empty array)
3) 1) (integer) 10923
2) (integer) 16383
3) 1) "10.211.55.54"
2) (integer) 6379
3) "c7a60dbe6b19408bcd2fe4025d692217ac056727"
4) (empty array)
4) 1) "10.211.55.52"
2) (integer) 6380
3) "80c0cb2658770e28900e0f331001f3e6aa4b8f46"
4) (empty array)
3.4、向集群加入数据并查询
注意:写数据的时候要注意连接到正确的地址,否则会提示
(error) MOVED 5798 10.211.55.53:6379
这是MOVED重定向
加上参数-c即可处理(-c无所谓你的Redis是否是集群模式)
/usr/redis-7.2.6/src/redis-cli -c -h 127.0.0.1 -p 6379
[root@master ~]# /usr/redis-7.2.6/src/redis-cli -c -h 127.0.0.1 -p 6379
127.0.0.1:6379> set name zhangjj
-> Redirected to slot [5798] located at 10.211.55.53:6379
OK
3.4.1、查看录入的数据
/usr/redis-7.2.6/src/redis-cli -c -h 10.211.55.54 -p 6379 get name
[root@master ~]# /usr/redis-7.2.6/src/redis-cli -c -h 10.211.55.54 -p 6379 get name
"zhangjj"
[root@master ~]# /usr/redis-7.2.6/src/redis-cli -c -h 10.211.55.53 -p 6379 get name
"zhangjj"
4、故障转移
已知10.211.55.52:6379是10.211.55.53:6380的主节点。现杀掉52的6379
[root@master ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:16379 0.0.0.0:* LISTEN 9047/redis-server 0
tcp 0 0 0.0.0.0:16380 0.0.0.0:* LISTEN 9040/redis-server 0
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 793/cupsd
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 9047/redis-server 0
tcp 0 0 0.0.0.0:6380 0.0.0.0:* LISTEN 9040/redis-server 0
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 794/sshd: /usr/sbin
tcp6 0 0 ::1:631 :::* LISTEN 793/cupsd
tcp6 0 0 :::22 :::* LISTEN 794/sshd: /usr/sbin
[root@master ~]# kill -9 9047
查看变化
10.211.55.53:6380自动升为主节点
[root@master ~]# /usr/redis-7.2.6/src/redis-cli -c -p 6380
127.0.0.1:6380> cluster nodes
c7a60dbe6b19408bcd2fe4025d692217ac056727 10.211.55.54:6379@16379 master - 0 1734376636144 5 connected 10923-16383
58614a8515f84090c6ba38d9755148b985c136cb 10.211.55.53:6379@16379 master - 0 1734376635721 3 connected 5461-10922
a5bffa3f5c7a47fae9d3436614d0ba6a91692447 10.211.55.53:6380@16380 master - 0 1734376634660 7 connected 0-5460
80c0cb2658770e28900e0f331001f3e6aa4b8f46 10.211.55.52:6380@16380 myself,slave c7a60dbe6b19408bcd2fe4025d692217ac056727 0 1734376624000 5 connected
a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9 10.211.55.52:6379@16379 master,fail - 1734376579470 1734376577355 1 disconnected
d7110c436b1f345a07cb85a59050298576172820 10.211.55.54:6380@16380 slave 58614a8515f84090c6ba38d9755148b985c136cb 0 1734376636778 3 connected
再次重启10.211.55.52:6379查看变化
10.211.55.52:6379成为了10.211.55.53:6380的从节点
[root@master ~]# /usr/redis-7.2.6/src/redis-server /usr/redis-7.2.6/redis_6379/conf/redis.conf
[root@master ~]# /usr/redis-7.2.6/src/redis-cli -c -p 6380
127.0.0.1:6380> cluster nodes
c7a60dbe6b19408bcd2fe4025d692217ac056727 10.211.55.54:6379@16379 master - 0 1734376823031 5 connected 10923-16383
58614a8515f84090c6ba38d9755148b985c136cb 10.211.55.53:6379@16379 master - 0 1734376823450 3 connected 5461-10922
a5bffa3f5c7a47fae9d3436614d0ba6a91692447 10.211.55.53:6380@16380 master - 0 1734376822512 7 connected 0-5460
80c0cb2658770e28900e0f331001f3e6aa4b8f46 10.211.55.52:6380@16380 myself,slave c7a60dbe6b19408bcd2fe4025d692217ac056727 0 1734376818000 5 connected
a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9 10.211.55.52:6379@16379 slave a5bffa3f5c7a47fae9d3436614d0ba6a91692447 0 1734376822926 7 connected
d7110c436b1f345a07cb85a59050298576172820 10.211.55.54:6380@16380 slave 58614a8515f84090c6ba38d9755148b985c136cb 0 1734376822410 3 connected
5、常用命令
命令 | 描述 | 案例 |
---|---|---|
create | 创建Redis集群 | redis-cli --cluster create 10.211.55.52:7000 10.211.55.52:7001 10.211.55.53:7002 --cluster-replicas 1 (创建包含三个主节点和三个从节点的集群) |
check | 检查Redis集群状态 | redis-cli --cluster check 10.211.55.52:7000 (检查集群中所有节点的槽位分配和状态) |
info | 查看Redis集群的简易信息 | redis-cli --cluster info 10.211.55.52:7000 (查看集群的节点数、槽位分配等基本信息) |
fix | 修复Redis集群中的槽位分配问题 | redis-cli --cluster fix 10.211.55.52:7000 --cluster-search-multiple-owners (修复被多个节点拥有的槽位问题) |
reshard | 在Redis集群中迁移槽位 | redis-cli --cluster reshard 10.211.55.52:7000 --cluster-from 10.211.55.52:7001 --cluster-to 10.211.55.53:7002 --cluster-slots 100 (从节点7001迁移100个槽位到节点7002) |
rebalance | 平衡Redis集群中的槽位分配 | redis-cli --cluster rebalance 10.211.55.52:7000 --cluster-threshold 1.5 (根据权重和阈值条件平衡集群中的槽位分配) |
add-node | 向Redis集群中添加新节点 | redis-cli --cluster add-node 10.211.55.53:7003 10.211.55.52:7000 --cluster-slave --cluster-master-id <master-node-id> (将新节点7003作为从节点添加到集群,并指定其主节点ID) |
del-node | 从Redis集群中删除节点 | redis-cli --cluster del-node 10.211.55.52:7000 <node-id> (从集群中删除指定ID的节点,注意从节点可以直接删除,有槽位分配的主节点不能直接删除) |
set-timeout | 设置Redis集群的cluster-node-timeout时间 | redis-cli --cluster set-timeout 10.211.55.52:7000 5000 (将集群的节点超时时间设置为5000毫秒) |
call | 在Redis集群的所有节点上执行命令 | redis-cli --cluster call 10.211.55.52:7000 FLUSHALL (在所有节点上执行FLUSHALL命令,清空所有节点的数据) |
至此验证测试完成。