《Redis Cluster 集群部署实战》
在单机内存不够或需要高可用时,Redis Cluster 是官方推荐的分布式方案。本文基于 Redis 5.x 搭建一个 6 节点的三主三从集群,并包含扩容、状态检查与常见故障处理。
1 前置:确认 Redis 版本
Redis Cluster 命令在 5.x 已非常稳定,建议先确认版本:
redis-server --version
# Redis server v=5.0.5 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=...
redis-cli --version
# redis-cli 5.0.5
2 准备集群节点配置文件(6 份)
集群至少需要 3 个主节点;副本数 --cluster-replicas 1 时至少需要 6 个节点(3 主 3 从)。
test -d /etc/redis/cluster || mkdir -p /etc/redis/cluster
以 6303 为例,另写 5 份,分别监听 6304-6308:
port 6303
dir /mnt/data/redis-cluster
dbfilename redis-cluster-6303.rdb
pidfile /var/run/redis/redis-cluster-6303.pid
logfile /var/log/redis/redis-cluster-6303.log
# 集群自身维护节点拓扑的配置文件(不是启动 redis 时指定的配置文件)
cluster-config-file cluster-6303-node.conf
bind 127.0.0.1
tcp-backlog 65535
tcp-keepalive 300
daemonize yes
supervised no
cluster-enabled yes
cluster-node-timeout 2000
cluster-slave-validity-factor 0
cluster-migration-barrier 1
cluster-require-full-coverage no
把 6 份配置命名为 6303.conf ... 6308.conf 放到同一目录。
3 启动六个实例
pids=$(pidof /usr/local/bin/redis-server)
if [ -n "$pids" ]; then
echo "$pids are running."
exit 1
fi
for port in 6303 6304 6305 6306 6307 6308
do
/usr/local/bin/redis-server "${port}.conf"
done
4 创建集群
redis-cli --cluster create 127.0.0.1:6303 127.0.0.1:6304 127.0.0.1:6305 \
127.0.0.1:6306 127.0.0.1:6307 127.0.0.1:6308 --cluster-replicas 1
5 检查集群状态
redis-cli --cluster check 127.0.0.1:6305
>>> Performing Cluster Check (using node 127.0.0.1:6305)
M: <id> 127.0.0.1:6305
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: <id> 127.0.0.1:6306
slots: (0 slots) slave
replicates <master-id>
[OK] All nodes agree about slots configuration.
[OK] All 16384 slots covered.
- 每个 master 拥有约 5461 个 slot(共 16384 个)。
- 出现
[OK] All 16384 slots covered.表示集群健康。
6 新增 slave 节点
# 将新节点 6309 作为 slave 加入,并自动挂到合适的 master 上
redis-cli --cluster add-node 127.0.0.1:6309 127.0.0.1:6310 --cluster-slave
# 输出提示把新节点配置为某个 master 的副本
>>> Configure node as replica of <master_id>
[OK] New node added correctly.
7 集群概要信息
redis-cli --cluster info 127.0.0.1:6305
127.0.0.1:6305 -> 0 keys | 5461 slots | 1 slaves.
192.168.1.2:6305 -> 0 keys | 5461 slots | 1 slaves.
192.168.1.3:6305 -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
8 查看详细集群状态
redis-cli -h 127.0.0.1 -p 6305 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
官方命令参考:https://redis.io/commands/cluster-info
9 列出集群中的所有 key
#!/bin/bash
# 逐节点扫描(集群节点之间 key 分布在不同 slot,需要遍历所有 master)
for port in 6305 6306 6307
do
for key in $(redis-cli -p "$port" keys "*")
do
echo "key is $key"
value=$(redis-cli -p "$port" get "$key")
echo "value is $value"
done
done
生产环境请用 scan 代替 keys *,避免阻塞。
10 往集群中写数据
集群模式下客户端必须使用 -c 才能自动处理 MOVED 重定向:
redis-cli -c -p 6305 set 'rate:123:192.168.1.4' 9577756933 EX 60
11 查看节点拓扑
redis-cli -c -p 6305 cluster nodes
<id1> 127.0.0.1:6305@16305 myself,master - 0 0 1 connected 0-5460
<id2> 127.0.0.1:6307@16307 master - 0 0 3 connected 10923-16383
<id3> 127.0.0.1:6306@16306 master - 0 0 2 connected 5461-10922
12 常见问题
12.1 [Err] Not all 16384 slots are covered
部分节点挂掉导致 slot 归属缺失,cluster check 报错 [ERR] Not all 16384 slots are covered by nodes.
解决办法:清理数据后重建,或补充缺失节点。
# 删除集群相关配置文件与数据
rm -rf /mnt/data/redis-cluster/*
# 重启 redis
for port in 6305 6306 6307
do
/usr/local/bin/redis-server "${port}.conf"
done
# 只有三个节点时副本因子数为 0
redis-cli --cluster create 127.0.0.1:6305 127.0.0.1:6306 127.0.0.1:6307
13 踩坑与建议
- 所有节点配置文件中的
cluster-config-file不要重名,否则集群元数据会互相覆盖。 cluster-node-timeout要结合网络环境设定,过小容易误判节点故障。- 客户端(如 Java/Lettuce)请按官方推荐方式配置集群连接,普通模式连不上会自动重定向失败的 key。
阅读 —
·
全站 —