Redis Cluster 集群部署
Redis Cluster 集群部署
什么是 Redis Cluster
Redis Cluster 是 Redis 的分布式解决方案,通过分片(Sharding)将数据分布到多个节点,实现数据水平扩展和高可用性。
集群架构
┌─────────────────────────────────────────────────┐
│ Redis Cluster │
├─────────────────┬─────────────────┬─────────────┤
│ Master 1 │ Master 2 │ Master 3 │
│ (0-5460) │ (5461-10922) │ (10923-16383)│
│ Slave 1 │ Slave 2 │ Slave 3 │
└─────────────────┴─────────────────┴─────────────┘
创建集群
环境准备
# 创建目录
mkdir -p /opt/redis-cluster/{7001,7002,7003,7004,7005,7006}
# 复制 Redis 可执行文件
cp /usr/bin/redis-server /opt/redis-cluster/
配置文件
# 为每个节点创建配置文件
for port in 7001 7002 7003 7004 7005 7006; do
cat > /opt/redis-cluster/$port/redis.conf << EOF
port $port
cluster-enabled yes
cluster-config-file nodes-$port.conf
cluster-node-timeout 5000
appendonly yes
appendfilename "appendonly.aof"
dir /opt/redis-cluster/$port
daemonize yes
pidfile /opt/redis-cluster/$port/redis.pid
logfile /opt/redis-cluster/$port/redis.log
EOF
done
启动节点
# 启动所有节点
for port in 7001 7002 7003 7004 7005 7006; do
cd /opt/redis-cluster/$port
redis-server redis.conf
done
# 检查进程
ps aux | grep redis-server
创建集群
# 使用 redis-cli 创建集群
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
输出示例:
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:7005 to 127.0.0.1:7001
Adding replica 127.0.0.1:7006 to 127.0.0.1:7002
Adding replica 127.0.0.1:7004 to 127.0.0.1:7003
集群管理
查看集群状态
# 连接到任意节点
redis-cli -c -p 7001
# 查看集群信息
CLUSTER INFO
# 查看集群节点
CLUSTER NODES
集群操作命令
# 添加节点
redis-cli --cluster add-node new_host:port existing_host:port
# 删除节点
redis-cli --cluster del-node host:port node_id
# 重新分片
redis-cli --cluster reshard host:port
# 检查集群
redis-cli --cluster check host:port
# 修复集群
redis-cli --cluster fix host:port
数据操作
使用集群模式连接
# -c 参数启用集群模式
redis-cli -c -p 7001
# 设置键值(自动路由到正确节点)
SET mykey "hello"
GET mykey
# 使用哈希标签确保相关键在同一节点
SET user:{1000}.name "John"
SET user:{1000}.email "john@example.com"
集群特有的命令
# 获取键所在的槽位
CLUSTER KEYSLOT mykey
# 获取槽位信息
CLUSTER COUNTKEYSINSLOT 1000
# 获取槽位中的键
CLUSTER GETKEYSINSLOT 1000 10
故障处理
节点故障
# 模拟节点故障
redis-cli -p 7001 DEBUG SLEEP 10
# 查看集群状态
redis-cli -c -p 7002 CLUSTER NODES
# 手动故障转移
redis-cli -p 7005 CLUSTER FAILOVER
重建故障节点
# 停止故障节点
redis-cli -p 7001 SHUTDOWN NOSAVE
# 重新启动
redis-server /opt/redis-cluster/7001/redis.conf
# 重新加入集群
redis-cli --cluster add-node 127.0.0.1:7001 127.0.0.1:7002
# 重新分片
redis-cli --cluster reshard 127.0.0.1:7002
集群扩缩容
添加主节点
# 启动新节点
redis-server /opt/redis-cluster/7007/redis.conf
# 添加到集群
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001
# 重新分片
redis-cli --cluster reshard 127.0.0.1:7001
添加从节点
# 添加从节点
redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7007 --cluster-slave
# 或手动设置
redis-cli -p 7008 CLUSTER REPLICATE <master-node-id>
移除节点
# 移除从节点
redis-cli --cluster del-node 127.0.0.1:7001 <node-id>
# 移除主节点(需要先迁移数据)
redis-cli --cluster reshard 127.0.0.1:7001
redis-cli --cluster del-node 127.0.0.1:7001 <node-id>
监控
集群监控脚本
#!/bin/bash
# monitor_cluster.sh
NODES="7001 7002 7003 7004 7005 7006"
for port in $NODES; do
echo "=== Node $port ==="
redis-cli -p $port CLUSTER INFO | grep -E "cluster_state|cluster_slots_assigned|cluster_known_nodes"
redis-cli -p $port INFO memory | grep used_memory_human
echo ""
done
慢查询监控
# 查看慢查询日志
redis-cli -p 7001 SLOWLOG GET 10
# 清空慢查询日志
redis-cli -p 7001 SLOWLOG RESET
实践案例
部署高可用集群
# 使用 Docker Compose 部署
version: '3'
services:
redis-7001:
image: redis:7
command: redis-server --port 7001 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000
ports:
- "7001:7001"
redis-7002:
image: redis:7
command: redis-server --port 7002 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000
ports:
- "7002:7002"
redis-7003:
image: redis:7
command: redis-server --port 7003 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000
ports:
- "7003:7003"
应用配置
# Python 连接 Redis Cluster
from redis.cluster import RedisCluster
startup_nodes = [
{"host": "127.0.0.1", "port": 7001},
{"host": "127.0.0.1", "port": 7002},
{"host": "127.0.0.1", "port": 7003}
]
rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True)
# 使用
rc.set("key", "value")
print(rc.get("key"))
常见问题
集群状态异常
# 检查集群状态
redis-cli --cluster check 127.0.0.1:7001
# 修复集群
redis-cli --cluster fix 127.0.0.1:7001
# 重新平衡槽位
redis-cli --cluster rebalance 127.0.0.1:7001
节点无法加入集群
# 检查节点配置
cat /opt/redis-cluster/7001/redis.conf | grep cluster
# 重置节点
redis-cli -p 7001 CLUSTER RESET
# 重新加入
redis-cli --cluster add-node 127.0.0.1:7001 127.0.0.1:7002
最佳实践
- 至少部署 6 个节点(3 主 3 从)
- 使用哈希标签管理相关键
- 监控集群状态和节点健康
- 定期备份数据
- 设置合理的超时时间
总结
Redis Cluster 提供了高性能的分布式解决方案。通过合理部署和管理集群,可以实现数据水平扩展和高可用性。