redis 6+集群必须用redis-cli --cluster创建,旧版redis-trib.rb已废弃;需确保节点配置正确、端口互通、客户端启用集群模式,并理解slot分片与故障转移机制。

Redis 6+ 集群模式必须用 redis-cli --cluster 创建,旧版 redis-trib.rb 已废弃
Redis 5 开始把集群管理逻辑内置进 redis-cli,6.x/7.x 完全移除了 redis-trib.rb。如果你照着老教程执行 ./redis-trib.rb create,会直接报错 command not found 或提示 “deprecated”。
正确做法是确保每个节点已启动(配置含 cluster-enabled yes、cluster-config-file、cluster-node-timeout),再用:
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
-
--cluster-replicas 1表示每个主节点配 1 个从节点,6 节点刚好组成 3 主 3 从 - 节点 IP 和端口必须能互相 telnet 通,防火墙要放行所有集群端口(建议主端口+10000,如 7000 → 17000)
- 若提示
Node XXX is not empty,说明该节点的cluster-config-file对应文件(如nodes-7000.conf)残留旧集群信息,需手动删掉再重启服务
客户端必须启用集群模式,直连单节点会报 MOVED 或 ASK 错误
普通 Redis 客户端(比如 redis-cli 不加参数、Python 的 redis.Redis())默认走单机协议。连接集群任意节点后执行 SET key value,大概率收到类似 MOVED 12345 127.0.0.1:7001 的响应——这不是报错,而是集群在告诉你:“这个 key 应该去 7001 节点查”。
解决方式取决于你用的客户端:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
redis-cli -c:加-c参数启用集群模式,它会自动重定向并维护 slot 映射缓存 - Python
redis-py:必须用redis.RedisCluster()(不是redis.Redis()),且初始化时传入全部节点,例如:from redis.cluster import RedisCluster<br>rc = RedisCluster(startup_nodes=[{"host": "127.0.0.1", "port": "7000"}], decode_responses=True) - Java Lettuce:用
RedisClusterClient,不能用RedisClient
数据分片靠哈希槽(slot),不是靠 key 名字或前缀
Redis 集群固定 16384 个哈希槽,每个 key 通过 CRC16(key) % 16384 算出所属 slot,再由集群分配到某个主节点。这意味着:
- 没有“按 user_id 分片”或“按前缀路由”的配置项——分片逻辑完全由 slot 决定,不可自定义
- 想让多个 key 落在同一节点?只能用
{...}标记 hash tag,例如SET user:{123}:profile ...和SET user:{123}:settings ...,大括号内内容相同,CRC16 结果就一样 - 扩容时需用
redis-cli --cluster reshard手动迁移 slot,过程会阻塞对应 slot 的读写;缩容前必须先del或dump数据,再forget节点,否则集群状态会卡在fail
高可用依赖故障转移机制,但 failover 不是瞬时的,且有前提条件
当主节点失联,集群会在 cluster-node-timeout(默认 15s)后标记为 fail,然后触发从节点晋升。但这不是无条件发生的:
- 从节点必须和主节点数据基本同步(
master_repl_offset差距不能太大),否则拒绝晋升 - 集群中至少有 N/2+1 个主节点在线(即多数派),否则无法发起投票,整个集群会拒绝写入(
CLUSTERDOWN) - 手动触发 failover 可用
redis-cli -c -p 7000 cluster failover,但仅限当前节点是从节点且其主节点健康;强制模式加TAKEOVER参数,慎用 - 注意:哨兵(Sentinel)和集群(Cluster)是两套独立高可用方案,别混用。集群自身不依赖哨兵,加了反而干扰
真正容易被忽略的是运维细节:节点间通信走的不是 client-port(如 7000),而是 client-port + 10000(即 17000),这个端口必须开放,否则 cluster nodes 看到的节点状态永远是 connected 假象,实际无法交换心跳。










