《Redis Cluster 集群部署实战》

《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。
阅读 — · 全站 —
🎸 我的歌单 0 首