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 进入官网。