← 返回首页
🔧

Redis Cluster 集群部署

📂 devops ⏱ 3 min 547 words

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

最佳实践

总结

Redis Cluster 提供了高性能的分布式解决方案。通过合理部署和管理集群,可以实现数据水平扩展和高可用性。