1. 集群架构概述

Redis Cluster 采用无中心架构,通过分片(Sharding)将数据分布到多个节点,每个分片由一个主节点(Master)和至少一个从节点(Slave)组成,实现高可用和负载均衡。本例部署3个主节点 + 3个从节点,共6个节点,保障集群的高可用性和数据冗余。

关键特性

  • 数据分片:使用哈希槽(Hash Slot)机制,将数据划分为16384个槽,分配给不同主节点。
  • 故障自动转移:当主节点宕机时,其对应的从节点会自动晋升为主节点。
  • 客户端重定向:客户端可访问任意节点,若 key 不属于当前节点,会返回重定向信息。

2. 环境准备与节点规划

2.1 服务器与端口规划

节点类型 IP地址 端口范围 示例端口
3主3从 192.168.184.122 16379–16384 16379(主)、16382(从)

注意

  • 若跨服务器部署,需确保网络互通,并开放节点端口(如16379)和集群总线端口(节点端口 + 10000,如26379)。
  • 集群总线用于节点间通信、故障检测和故障转移,需在防火墙中放行。

2.2 依赖安装

确保所有节点已安装相同版本的 Redis(建议 5.0 及以上版本)。

# 安装编译工具
yum install -y gcc tcl
# 下载并编译 Redis(以 7.0.4 为例)
wget https://download.redis.io/releases/redis-7.0.4.tar.gz
tar -xzf redis-7.0.4.tar.gz
cd redis-7.0.4 && make && make install

3. 节点配置

每个节点需独立配置,以下以端口 16379 为例,其他节点需修改 port、文件路径及端口相关参数。

3.1 配置文件示例(redis-16379.conf)

# 网络绑定地址(改为实际内网 IP 或 0.0.0.0 允许所有连接)
bind 0.0.0.0
# 监听端口
port 16379
# 后台运行模式
daemonize yes
# 启用集群模式
cluster-enabled yes
# 集群节点配置文件(自动生成,保存集群状态)
cluster-config-file "node01/nodes.conf"
# 节点超时时间(毫秒)
cluster-node-timeout 15000
# 进程 ID 存储路径
pidfile "node01/redis.pid"
# 日志级别
loglevel warning
# 日志文件路径
logfile "node01/redis.log"
# 数据持久化目录
dir "node01"
# 关闭 AOF 持久化(根据需求可改为 yes)
appendonly no
# 实例访问密码
requirepass snest123
# 主节点密码(用于从节点同步认证)
masterauth snest123

3.2 目录结构准备

为每个节点创建数据、日志、配置文件目录:

# 以节点 16379 为例
mkdir -p node01

3.3 启动所有节点

# 逐个启动节点
redis-server redis-16379.conf
redis-server redis-16380.conf
... # 其他节点同理

# 验证进程是否启动
ps -ef | grep redis-server

4. 创建集群

使用 redis-cli --cluster create 命令自动分配槽和主从关系。

redis-cli -p 16379 --cluster create \
192.168.184.122:16379 192.168.184.122:16380 192.168.184.122:16381 \
192.168.184.122:16382 192.168.184.122:16383 192.168.184.122:16384 \
--cluster-replicas 1 -a snest123
参数说明
  • --cluster-replicas 1:每个主节点配置1个从节点。
  • -a snest123:使用密码认证。

输出示例

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460        主节点0 分配槽信息
Master[1] -> Slots 5461 - 10922    主节点1 分配槽信息
Master[2] -> Slots 10923 - 16383   主节点2 分配槽信息
Adding replica 192.168.184.122:16383 to 192.168.184.122:16379
Adding replica 192.168.184.122:16384 to 192.168.184.122:16380
Adding replica 192.168.184.122:16382 to 192.168.184.122:16381
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: a2bb98c2eb817466caac4f32e31b9945ffb32e64 192.168.184.122:16379
   slots:[0-5460] (5461 slots) master
M: 588eb4717da5a33c6cc6302c76862af49ec9cea8 192.168.184.122:16380
   slots:[5461-10922],[11228] (5462 slots) master
M: 2e57e54f805625b9f3785ce313dcb08f02c7b4bd 192.168.184.122:16381
   slots:[10923-16383] (5461 slots) master
S: f75d2cd89d65f2c2e733bbe154bf7cdcc6c21163 192.168.184.122:16382  slave信息
   replicates a2bb98c2eb817466caac4f32e31b9945ffb32e64
S: e8a85ee21c18b4511d69f2262397951b083301ab 192.168.184.122:16383
   replicates 588eb4717da5a33c6cc6302c76862af49ec9cea8
S: 0fda6e296d09b16de637dc23f90642c89665f4cc 192.168.184.122:16384
   replicates 2e57e54f805625b9f3785ce313dcb08f02c7b4bd
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
58816:M 04 Nov 2025 10:07:56.326 * configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH
60985:M 04 Nov 2025 10:07:56.327 * configEpoch set to 2 via CLUSTER SET-CONFIG-EPOCH
61519:M 04 Nov 2025 10:07:56.327 * configEpoch set to 3 via CLUSTER SET-CONFIG-EPOCH
44101:M 04 Nov 2025 10:07:56.328 * configEpoch set to 4 via CLUSTER SET-CONFIG-EPOCH
45300:M 04 Nov 2025 10:07:56.329 * configEpoch set to 5 via CLUSTER SET-CONFIG-EPOCH
48035:M 04 Nov 2025 10:07:56.329 * configEpoch set to 6 via CLUSTER SET-CONFIG-EPOCH
>>> Sending CLUSTER MEET messages to join the cluster

输入 yes 确认配置后,集群自动完成节点握手和槽分配。

5. 集群验证

5.1 检查节点状态

# 查看节点列表和角色
redis-cli -p 16379 -a snest123 cluster nodes

2c485565af665ad70c0f7a75030263543d4a92ef 192.168.184.122:16382@26382,,shard-id=375d91dfb257fcdb791e533932aee1e8db37691c slave c6c396d94430d113454b4d2ffb760e06ed2c016c 0 1762226356828 2 connected
c6c396d94430d113454b4d2ffb760e06ed2c016c 192.168.184.122:16380@26380,,shard-id=375d91dfb257fcdb791e533932aee1e8db37691c master - 0 1762226356000 2 connected 5461-10922
ae772e2508ce4c7ce111d8f380c04afdc2cbca62 192.168.184.122:16379@26379,,shard-id=bdcffed9f55bd814b0c8ac7eda43c26f34a933fb myself,master - 0 1762226355000 1 connected 0-5460
f9e124c4519f56208824db695547bbe7b99896dd 192.168.184.122:16383@26383,,shard-id=9896905ec818477b8b2d657d6cf2c1fbf571f9ad slave 2d358d3756882e035476753c6d52e36103968b20 0 1762226356526 3 connected
9afdcb87be5b4e485562411d65b9c32a83e504f0 192.168.184.122:16384@26384,,shard-id=bdcffed9f55bd814b0c8ac7eda43c26f34a933fb slave ae772e2508ce4c7ce111d8f380c04afdc2cbca62 0 1762226356526 1 connected
2d358d3756882e035476753c6d52e36103968b20 192.168.184.122:16381@26381,,shard-id=9896905ec818477b8b2d657d6cf2c1fbf571f9ad master - 0 1762226355823 3 connected 10923-16383


---

redis-cli -p 16379 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
cluster_stats_messages_ping_sent:6756
cluster_stats_messages_pong_sent:6687
cluster_stats_messages_sent:13443
cluster_stats_messages_ping_received:6682
cluster_stats_messages_pong_received:6756
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:13443
total_cluster_links_buffer_limit_exceeded:

5.2 检查集群健康度

redis-cli -p 16379 -a snest123 cluster info
关键指标
  • cluster_state:ok:集群状态正常。
  • cluster_slots_assigned:16384:所有槽已分配。
  • cluster_known_nodes:6:识别到6个节点。

5.3 数据读写测试

# 连接集群(-c 参数启用集群模式)
redis-cli -c -p 16380 -a snest123
127.0.0.1:16380> set key1 value1
-> Redirected to slot [9189] located at 192.168.184.122:16380
OK
192.168.184.122:16380> get key1
"value1"

6. 关键注意事项

  1. 密钥哈希标签
    若需确保多个 key 分配到同一槽(如 Lua 脚本、事务、pipeline等),需使用哈希标签(例如 {user1000}.profile{user1000}.history 会被分配到同一槽)。

  2. 客户端兼容性
    客户端需支持集群模式(如 Jedis、Lettuce),并能处理 MOVED/ASK 重定向错误。

  3. 备份与监控
    • 定期持久化 RDB/AOF 数据。
    • 监控集群状态:cluster info、节点延迟、内存使用。
  4. 故障模拟测试
    可手动关闭主节点,验证从节点是否自动晋升(通过 cluster nodes 观察角色变化)。

7. 常见问题

  • 集群创建失败:检查防火墙、密码一致性、总线端口是否开放。
  • 节点无法加入集群:确认所有节点已启动,且 cluster-config-file 可写入。
  • 槽未完全分配:执行 redis-cli --cluster fix <host:port> -a <password> 修复。