Redis Cluster 集群搭建教程

Redis Cluster 是 Redis 官方提供的分布式方案,通过数据分片将数据自动分布到多个节点上,突破单节点的内存和性能限制。与 哨兵模式 不同,Redis Cluster 既提供高可用又提供水平扩展能力。本文将在搬瓦工 VPS 上搭建一个三主三从的 Redis Cluster 集群。

一、Redis Cluster 原理

Redis Cluster 将所有数据分布在 16384 个哈希槽(Hash Slot)上。每个主节点负责一部分哈希槽,客户端通过 CRC16(key) % 16384 计算 key 所在的槽位,然后连接到对应的节点。

  • 集群至少需要 3 个主节点。
  • 每个主节点可以有一个或多个从节点用于故障切换。
  • 节点之间通过 Gossip 协议通信,端口为数据端口 + 10000(如 6379 对应 16379)。
  • 不支持跨槽位的多键操作,除非使用 Hash Tag(如 {user}.name{user}.age)。

二、环境准备

本教程在同一台搬瓦工 VPS 上使用不同端口部署 6 个 Redis 实例。生产环境建议分散到多台服务器。

# 创建目录结构
mkdir -p /data/redis-cluster/{7001,7002,7003,7004,7005,7006}

三、配置 Redis 实例

为每个实例创建配置文件。以 7001 端口为例,创建 /data/redis-cluster/7001/redis.conf

port 7001
bind 0.0.0.0
daemonize yes
pidfile /data/redis-cluster/7001/redis.pid
logfile /data/redis-cluster/7001/redis.log
dir /data/redis-cluster/7001

# 集群配置
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000

# 安全配置
requirepass ClusterPass123!
masterauth ClusterPass123!

# 持久化
appendonly yes
appendfsync everysec

# 内存
maxmemory 128mb
maxmemory-policy allkeys-lru

使用脚本批量生成配置文件:

for port in 7001 7002 7003 7004 7005 7006; do
cat > /data/redis-cluster/${port}/redis.conf << EOF
port ${port}
bind 0.0.0.0
daemonize yes
pidfile /data/redis-cluster/${port}/redis.pid
logfile /data/redis-cluster/${port}/redis.log
dir /data/redis-cluster/${port}
cluster-enabled yes
cluster-config-file nodes-${port}.conf
cluster-node-timeout 5000
requirepass ClusterPass123!
masterauth ClusterPass123!
appendonly yes
appendfsync everysec
maxmemory 128mb
maxmemory-policy allkeys-lru
EOF
done

四、启动所有实例

for port in 7001 7002 7003 7004 7005 7006; do
    redis-server /data/redis-cluster/${port}/redis.conf
done

# 验证所有实例启动
ps aux | grep redis-server
netstat -tlnp | grep -E '700[1-6]'

五、创建集群

redis-cli --cluster create \
    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 127.0.0.1:7006 \
    --cluster-replicas 1 \
    -a ClusterPass123!

--cluster-replicas 1 表示每个主节点分配 1 个从节点。Redis 会自动将 7001、7002、7003 设为主节点,7004、7005、7006 设为对应的从节点。

执行后会显示槽位分配方案,确认后输入 yes 完成创建。

六、验证集群状态

# 查看集群信息
redis-cli -p 7001 -a ClusterPass123! CLUSTER INFO

# 查看节点信息
redis-cli -p 7001 -a ClusterPass123! CLUSTER NODES

# 查看槽位分配
redis-cli --cluster check 127.0.0.1:7001 -a ClusterPass123!

关键状态:cluster_state:ok 表示集群正常,cluster_slots_assigned:16384 表示所有槽位已分配。

七、集群操作

7.1 连接集群

# 使用 -c 参数启用集群模式(自动跟随重定向)
redis-cli -c -p 7001 -a ClusterPass123!

# 写入测试
SET user:1 "Zhang Wei"
SET user:2 "Li Ming"
GET user:1

集群模式下,如果 key 不在当前节点,Redis 会返回 MOVED 重定向,-c 参数会自动处理。

7.2 Hash Tag 使用

# 使用 Hash Tag 确保相关的 key 在同一个槽位
MSET {order:1001}.info "订单详情" {order:1001}.items "商品列表" {order:1001}.payment "支付信息"
MGET {order:1001}.info {order:1001}.items {order:1001}.payment

八、集群扩容

8.1 添加主节点

# 启动新实例
mkdir -p /data/redis-cluster/7007
# 创建配置文件(同上,修改端口为 7007)
redis-server /data/redis-cluster/7007/redis.conf

# 添加到集群
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001 -a ClusterPass123!

# 分配槽位给新节点
redis-cli --cluster reshard 127.0.0.1:7001 -a ClusterPass123!

reshard 时会询问要移动多少个槽位、从哪些节点移动。建议均匀分配(16384 / 主节点数)。

8.2 添加从节点

mkdir -p /data/redis-cluster/7008
redis-server /data/redis-cluster/7008/redis.conf

redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7001 \
    --cluster-slave --cluster-master-id <7007的节点ID> \
    -a ClusterPass123!

九、集群缩容

# 先将节点的槽位迁移到其他节点
redis-cli --cluster reshard 127.0.0.1:7001 -a ClusterPass123!

# 确认节点没有槽位后删除
redis-cli --cluster del-node 127.0.0.1:7001 <节点ID> -a ClusterPass123!

十、故障切换

# 模拟主节点故障
redis-cli -p 7001 -a ClusterPass123! DEBUG sleep 30

# 查看集群状态变化
redis-cli -p 7002 -a ClusterPass123! CLUSTER NODES

# 手动触发故障切换(在从节点上执行)
redis-cli -p 7004 -a ClusterPass123! CLUSTER FAILOVER

十一、监控与维护

# 检查集群健康状态
redis-cli --cluster check 127.0.0.1:7001 -a ClusterPass123!

# 修复集群(自动迁移无主的槽位)
redis-cli --cluster fix 127.0.0.1:7001 -a ClusterPass123!

# 集群节点内存统计
for port in 7001 7002 7003 7004 7005 7006; do
    echo "=== Port $port ==="
    redis-cli -p $port -a ClusterPass123! INFO memory | grep used_memory_human
done

十二、常见问题

  • CROSSSLOT 错误:多键操作涉及不同槽位。使用 Hash Tag 或拆分为多个单键操作。
  • 集群不可用:当某个槽位没有可用节点时整个集群不可用。可设置 cluster-require-full-coverage no 使不受影响的槽位继续服务。
  • 数据迁移缓慢:reshard 大量数据时耗时较长。可调整 cluster-migration-barrier 和迁移管道参数。

总结

Redis Cluster 是 Redis 原生的分布式方案,适合数据量大、需要水平扩展的场景。在搬瓦工 VPS 上你可以灵活地从三节点扩展到更多节点。如果你的场景不需要分片,哨兵模式 更为简单。选购搬瓦工 VPS 请查看 全部方案,使用优惠码 NODESEEK2026 享受 6.77% 折扣,通过 bwh81.net 进入官网。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。