首页 / Redis 入门教程 / 29. 集群搭建与运维

Redis 入门教程

29. 集群搭建与运维

本教程共 40 篇 · 第 29 篇 · 更新于 2026-08-02

Cluster集群搭建扩缩容故障转移reshard运维

29. 集群搭建与运维

第 28 章讲清了集群的概念,这一章码上学带你真正把集群跑起来,并掌握日常运维中最常用的操作:创建、查看、扩缩容、故障处理。redis-cli 自带了 --cluster 一系列子命令,绝大部分运维都能用一条命令完成,无需手动去算槽位。

本节目标

  • redis-cli --cluster create 搭建一个 3 主 3 从的集群。
  • CLUSTER INFO / CLUSTER NODES 观察集群状态。
  • 掌握在线扩容:加节点 + 重分片(reshard)。
  • 掌握在线缩容:先迁槽再删除节点。
  • 了解故障转移与常见故障处理。

准备工作:节点配置

每个集群节点本质就是一个普通 Redis 实例,只是要在 redis.conf 里打开集群开关:

port 7000
cluster-enabled yes
cluster-node-timeout 15000
cluster-config-file nodes-7000.conf
appendonly yes
  • cluster-enabled yes:以集群模式启动。
  • cluster-node-timeout 15000:节点失联超过 15 秒被认为失效(默认即 15000 毫秒)。
  • cluster-config-file:集群自动维护的节点状态文件(不要手改)。

按此模板准备 6 个实例(端口 7000~7005),分别启动:

redis-server /path/redis-7000.conf
redis-server /path/redis-7001.conf
# ... 7002 ~ 7005

创建集群

6 个节点都起来后,用一条命令把它们组成一个集群。--cluster-replicas 1 表示「每个主节点配 1 个从节点」,于是 6 个节点会被自动划分为 3 主 3 从:

redis-cli --cluster create \
  127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \
  127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
  --cluster-replicas 1

命令会打印出「谁是谁的主/从、哪些槽分给哪些主」的计划,输入 yes 确认后,16384 个槽会被平均分配到 3 个主节点上,集群随即建成。

查看集群状态

连上任意节点,查看集群整体健康度:

127.0.0.1:7000> 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_state:okcluster_slots_ok:16384 表示所有槽都已正确分配、集群可用。cluster_size:3 表示有 3 个主节点。

查看节点清单与拓扑:

127.0.0.1:7000> CLUSTER NODES

输出每行是一个节点,包含节点 ID、地址、角色(master/slave)、负责的槽范围等信息。日常排障看这一屏就够了。

也可以用 CLI 做集群体检:

redis-cli --cluster check 127.0.0.1:7000

check 会报告槽分配是否完整、是否有槽悬空、主从是否配对等。

在线扩容:加节点 + 重分片

当容量或性能不足时,可以不停机地加节点。假设新增两个实例 7006(将作为新主)、7007(作为 7006 的从)。

第一步,把新节点加入集群:

redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000

此时 7006 是个「没有槽的主节点」。第二步,把一部分槽从老节点迁移给它(reshard):

redis-cli --cluster reshard 127.0.0.1:7000

交互式询问:

  • How many slots do you want to move (from 1 to 16384)? → 输入要迁移的槽数,例如 1000
  • What is the receiving node ID? → 输入 7006 的节点 ID(新主)。
  • Source node #1: → 输入源主节点 ID,或直接 all 让系统从所有现有主节点均匀抽取。
  • 最后输入 yes 确认,迁移开始。

迁移过程是在线的:涉及槽里的键会被逐个从源节点搬到目标节点,期间对这些键的访问会走 ASK 重定向(见第 28 章),业务基本无感知。

第三步,给新主挂从节点:

redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 \
  --cluster-slave --cluster-master-id <7006的节点ID>

在线缩容:先迁槽,再删节点

缩容必须先把槽迁走,否则会留下「无主槽」导致集群不可用。步骤:

  1. reshard 把待删除主节点上的槽全部分给其它主节点(source 指定该节点,destination 选其它主)。
  2. 槽清空后,删除从节点:
redis-cli --cluster del-node 127.0.0.1:7000 <从节点ID>
  1. 再删除主节点(此时它已无槽):
redis-cli --cluster del-node 127.0.0.1:7000 <主节点ID>

顺序不能反:直接删还有槽的主节点,集群会进入 cluster_state:fail,拒绝写入。

故障转移

自动故障转移

当某个主节点宕机,集群多数派会在 cluster-node-timeout 之后把它标记为失效,并把它其中一个从节点提升为新主,接管槽。整个过程自动完成,无需哨兵(集群自带)。你可以通过 CLUSTER NODES 观察到角色变化。

手动故障转移

从节点上执行,可主动把它提升为主(常用于计划内维护,把流量切走再停机):

127.0.0.1:7004> CLUSTER FAILOVER
OK

执行后该从节点立即成为主,原主降级为从。可选的 FORCE / TAKEOVER 参数用于原主不可达的特殊场景(会跳过数据对齐校验,慎用)。

运维中的实用命令

除了搭建与扩缩容,日常还会用到下面几条命令:

  • CLUSTER SLOTS / CLUSTER SHARDS:查看「槽 → 节点」的完整映射表。客户端启动时或收到 MOVED 时会拉取它来建立本地路由缓存(CLUSTER SHARDS 是较新的推荐接口,信息更全)。
  • CLUSTER REPLICATE <master-node-id>:把一个从节点重新指向新的主节点,常用于手动调整主从配对。
  • CLUSTER FORGET <node-id>:让当前节点遗忘另一个节点(仅在节点确实已彻底下线、且你想从集群视图里移除它时使用,慎用于仍存活的节点)。
  • redis-cli --cluster rebalance:自动把槽在各主节点间重新均摊,省去手算 reshard 的源/目标。
redis-cli --cluster rebalance 127.0.0.1:7000
  • redis-cli --cluster call:向集群所有节点批量执行同一条命令,便于统一查询状态或下发配置,例如:
redis-cli --cluster call 127.0.0.1:7000 CONFIG GET cluster-node-timeout

迁移过程的可观察性

reshard 在大批量迁移时可能持续较久。你可以用 CLUSTER INFO 持续观察 cluster_slots_migrating / cluster_slots_importing 是否归零,确认迁移收尾;也可用 --cluster check 反复体检,确保没有「悬空槽」。迁移期间被迁移槽里的键会触发 ASK 重定向,业务侧只要用合规的集群客户端就能无感通过,无需停机。

提示:不要把 reshard 的「每次迁移槽数」设得过小而反复执行,也不必一次性迁移超大数量导致单次操作太久。按数据总量分批(如每批 1000~2000 槽)是较稳妥的节奏。

常见故障与处理

  • cluster_state:fail 且部分槽缺失:通常是某主节点及其从节点同时下线,导致一些槽没有任何可用副本。恢复任一相关节点即可;生产务必保证每个分片「主 + 至少 1 从」且分散在不同机器。
  • 槽分配不均、节点倾斜:用 redis-cli --cluster rebalance 127.0.0.1:7000 让系统自动把槽在各主节点间重新均摊。
  • cluster-require-full-coverage 的影响:该配置默认 yes,含义是「只要有任意一个槽没有被任何节点覆盖,整个集群就拒绝写入」。若希望部分槽不可用时不殃及全局,可设为 no(但那部分数据将不可写,需权衡)。
  • 节点 ID 与 IP 漂移:容器/云环境下 IP 可能变化,集群靠节点 ID 而非 IP 识别成员;若用动态 IP,注意 cluster-announce-ip 等 announce 配置,避免节点互认失败。

常见误区

  • 误区:集群节点数越少越好。 真正的高可用至少需要 3 主 3 从;只跑 3 个主节点无副本,任一主宕机其槽就丢失。
  • 误区:扩容/缩容要停机。 通过 add-node / reshard / del-node 可全程在线操作。
  • 误区:删节点前不用迁槽。 必须先迁空槽,否则集群进入失败状态。

小结

  • 搭建:cluster-enabled yes 起 6 节点,再用 redis-cli --cluster create ... --cluster-replicas 1
  • 观测:CLUSTER INFOCLUSTER NODES--cluster check
  • 扩容:add-node 加主 → reshard 迁槽 → add-node 加从;缩容反之,先迁槽再 del-node。
  • 故障:宕机自动转移;维护用 CLUSTER FAILOVER 手动切换。
  • 注意 cluster-require-full-coverage 与「先迁槽后删节点」的顺序。

提示:官方 redis.io 下载页另将 8.8 标注为 “Latest stable”,而 GitHub 上的最新发布 tag 为 8.10.0。redis-cli --cluster 系列运维子命令在 8.x 中稳定可用,本文以 8.10.0 为基线版本。