Skip to content

Redis Cluster 安装

Redis Cluster 是 Redis 提供的分布式解决方案,支持自动分片和高可用。本文档将详细介绍 Redis Cluster 的安装步骤和最佳实践。

Redis Cluster 基本概念

架构设计

Redis Cluster 采用去中心化的架构,主要特点包括:

  • 数据自动分片到多个节点
  • 支持自动故障转移
  • 无中心节点,所有节点平等
  • 支持水平扩展

节点类型

Redis Cluster 中的节点分为两种类型:

  • 主节点(Master):负责处理读写请求,存储数据
  • 从节点(Slave):负责复制主节点的数据,提供冗余和故障转移支持

分片机制

Redis Cluster 使用哈希槽(Hash Slot)进行数据分片:

  • 整个集群共有 16384 个哈希槽
  • 每个键通过 CRC16(key) % 16384 计算哈希槽
  • 每个主节点负责一部分哈希槽
  • 从节点复制主节点的所有哈希槽

故障转移

Redis Cluster 自动故障转移过程:

  1. 从节点定期向主节点发送 PING 命令
  2. 如果主节点在规定时间内没有响应,从节点标记主节点为疑似下线(PFAIL)
  3. 从节点向其他节点传播主节点的疑似下线状态
  4. 如果超过半数节点标记主节点为疑似下线,主节点被标记为下线(FAIL)
  5. 从节点选举产生新的主节点
  6. 新的主节点接管原主节点的哈希槽
  7. 集群恢复正常

安装前准备

系统要求

  • 操作系统:Linux(推荐 CentOS 7+ 或 Ubuntu 18.04+)
  • CPU:至少 2 核
  • 内存:每个节点至少 2GB
  • 磁盘:至少 20GB 可用空间
  • 网络:所有节点之间网络互通,关闭防火墙或开放必要端口

软件依赖

  • GCC:版本 4.8 及以上
  • Make:版本 3.81 及以上
  • tcl:版本 8.5 及以上(用于运行 Redis 测试)
  • openssl:版本 1.0.2 及以上(可选,用于 SSL/TLS 支持)

节点规划

Redis Cluster 至少需要 3 个主节点,建议配置为 3 主 3 从的结构,共 6 个节点。

示例节点规划:

节点角色IP 地址端口数据目录
主节点 1192.168.1.1017001/data/redis/7001
主节点 2192.168.1.1027002/data/redis/7002
主节点 3192.168.1.1037003/data/redis/7003
从节点 1192.168.1.1017004/data/redis/7004
从节点 2192.168.1.1027005/data/redis/7005
从节点 3192.168.1.1037006/data/redis/7006

环境准备

  1. 关闭防火墙(或开放必要端口)
bash
# CentOS 7
firewall-cmd --zone=public --add-port=7001-7006/tcp --permanent
firewall-cmd --reload

# Ubuntu
iptables -A INPUT -p tcp --dport 7001:7006 -j ACCEPT
iptables-save > /etc/iptables/rules.v4
  1. 关闭 SELinux(或配置适当的策略)
bash
# 临时关闭
setenforce 0

# 永久关闭
vi /etc/selinux/config
# 将 SELINUX=enforcing 改为 SELINUX=disabled
  1. 安装依赖
bash
# CentOS 7
yum install -y gcc make tcl openssl-devel

# Ubuntu
apt update
apt install -y gcc make tcl libssl-dev
  1. 创建数据目录
bash
mkdir -p /data/redis/7001 /data/redis/7002 /data/redis/7003
mkdir -p /data/redis/7004 /data/redis/7005 /data/redis/7006
chown -R redis:redis /data/redis

安装 Redis

下载 Redis

bash
# 下载 Redis 6.2.6(稳定版)
wget https://download.redis.io/releases/redis-6.2.6.tar.gz

tar xzf redis-6.2.6.tar.gz
cd redis-6.2.6

编译安装

bash
# 编译
make

# 安装
sudo make install PREFIX=/usr/local/redis

# 创建软链接
ln -s /usr/local/redis/bin/redis-cli /usr/bin/redis-cli
ln -s /usr/local/redis/bin/redis-server /usr/bin/redis-server

验证安装

bash
redis-server --version
redis-cli --version

配置 Redis Cluster

创建配置文件

为每个节点创建配置文件,以 7001 节点为例:

bash
vi /data/redis/7001/redis.conf

配置内容:

txt
# 绑定地址
bind 0.0.0.0

# 端口
port 7001

# 以守护进程方式运行
daemonize yes

# 进程 PID 文件
pidfile /var/run/redis_7001.pid

# 日志文件
logfile /data/redis/7001/redis.log

# 数据目录
dir /data/redis/7001

# 启用集群模式
cluster-enabled yes

# 集群配置文件
cluster-config-file nodes-7001.conf

# 集群节点超时时间(毫秒)
cluster-node-timeout 15000

# 启用 AOF 持久化
appendonly yes

# AOF 文件名
appendfilename "appendonly.aof"

# AOF 重写策略
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 密码(可选,建议设置)
# requirepass your_strong_password
# masterauth your_strong_password

按照同样的方式创建其他节点的配置文件,修改端口号和目录路径即可。

启动节点

bash
# 启动所有节点
redis-server /data/redis/7001/redis.conf
redis-server /data/redis/7002/redis.conf
redis-server /data/redis/7003/redis.conf
redis-server /data/redis/7004/redis.conf
redis-server /data/redis/7005/redis.conf
redis-server /data/redis/7006/redis.conf

验证节点启动

bash
# 查看节点进程
ps -ef | grep redis-server

# 查看节点日志
cat /data/redis/7001/redis.log

创建 Redis Cluster

使用 redis-cli 创建集群

Redis 5.0+ 提供了 --cluster 选项用于创建集群:

bash
redis-cli --cluster create \
192.168.1.101:7001 \
192.168.1.102:7002 \
192.168.1.103:7003 \
192.168.1.101:7004 \
192.168.1.102:7005 \
192.168.1.103:7006 \
--cluster-replicas 1

参数说明:

  • --cluster create:创建集群
  • --cluster-replicas 1:每个主节点分配 1 个从节点

确认集群创建

执行命令后,会显示集群的配置方案,输入 yes 确认:

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0-5460
Master[1] -> Slots 5461-10922
Master[2] -> Slots 10923-16383
Adding replica 192.168.1.102:7005 to 192.168.1.101:7001
Adding replica 192.168.1.103:7006 to 192.168.1.102:7002
Adding replica 192.168.1.101:7004 to 192.168.1.103:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2 192.168.1.101:7001
   slots:[0-5460] (5461 slots) master
M: b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3 192.168.1.102:7002
   slots:[5461-10922] (5462 slots) master
M: c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 192.168.1.103:7003
   slots:[10923-16383] (5461 slots) master
S: d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5 192.168.1.101:7004
   replicates c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4
S: e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6 192.168.1.102:7005
   replicates a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2
S: f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1 192.168.1.103:7006
   replicates b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3
Can I set the above configuration? (type 'yes' to accept): yes

验证集群创建

bash
# 连接集群
redis-cli -c -h 192.168.1.101 -p 7001

# 查看集群信息
192.168.1.101:7001> CLUSTER INFO

# 查看集群节点
192.168.1.101:7001> CLUSTER NODES

集群测试

基本功能测试

bash
# 连接集群
redis-cli -c -h 192.168.1.101 -p 7001

# 设置键值对
192.168.1.101:7001> SET key1 value1
OK

# 获取键值对
192.168.1.101:7001> GET key1
"value1"

# 查看键所在的槽
192.168.1.101:7001> CLUSTER KEYSLOT key1
(integer) 9189

# 查看槽对应的节点
192.168.1.101:7001> CLUSTER SLOTS

故障转移测试

  1. 模拟主节点故障
bash
# 查看当前主从关系
redis-cli -c -h 192.168.1.101 -p 7001 CLUSTER NODES

# 停止一个主节点
redis-cli -c -h 192.168.1.101 -p 7001 SHUTDOWN

# 查看故障转移情况
redis-cli -c -h 192.168.1.102 -p 7002 CLUSTER NODES
  1. 恢复主节点
bash
# 启动刚才停止的主节点
redis-server /data/redis/7001/redis.conf

# 查看节点状态,此时该节点会成为从节点
redis-cli -c -h 192.168.1.102 -p 7002 CLUSTER NODES

集群管理

添加节点

添加主节点

bash
# 启动新的 Redis 节点
redis-server /data/redis/7007/redis.conf

# 将新节点添加到集群
redis-cli --cluster add-node 192.168.1.101:7007 192.168.1.101:7001

# 重新分配哈希槽
redis-cli --cluster reshard 192.168.1.101:7001

添加从节点

bash
# 启动新的 Redis 节点
redis-server /data/redis/7008/redis.conf

# 将新节点添加为从节点
redis-cli --cluster add-node --cluster-slave --cluster-master-id <master-node-id> 192.168.1.101:7008 192.168.1.101:7001

删除节点

bash
# 删除从节点
redis-cli --cluster del-node 192.168.1.101:7001 <slave-node-id>

# 删除主节点(需要先迁移其哈希槽)
# 1. 迁移哈希槽
redis-cli --cluster reshard 192.168.1.101:7001
# 2. 删除节点
redis-cli --cluster del-node 192.168.1.101:7001 <master-node-id>

查看集群状态

bash
# 查看集群信息
redis-cli -c -h 192.168.1.101 -p 7001 CLUSTER INFO

# 查看集群节点
redis-cli -c -h 192.168.1.101 -p 7001 CLUSTER NODES

# 查看集群健康状态
redis-cli --cluster check 192.168.1.101:7001

常见问题(FAQ)

Q1: 创建集群时提示 "Node is not empty" 错误

A1: 这是因为节点的数据目录中已经存在数据或集群配置文件。解决方案:

bash
# 停止节点
redis-cli -c -h 192.168.1.101 -p 7001 SHUTDOWN

# 清空数据目录
rm -rf /data/redis/7001/*

# 重新启动节点
redis-server /data/redis/7001/redis.conf

Q2: 集群节点无法通信

A2: 检查以下几点:

  1. 防火墙:确保所有节点之间的端口(包括集群总线端口,通常是端口号+10000)都已开放
  2. 绑定地址:确保配置文件中的 bind 选项设置正确,或设置为 0.0.0.0
  3. 密码:如果设置了密码,确保所有节点的 requirepassmasterauth 配置一致
  4. 网络连通性:使用 ping 命令测试节点之间的网络连通性

Q3: 故障转移后,原主节点重新加入集群成为从节点,如何恢复为主节点?

A3: 可以使用 CLUSTER FAILOVER 命令手动触发故障转移:

bash
# 连接到原主节点(现在是从节点)
redis-cli -c -h 192.168.1.101 -p 7001

# 执行手动故障转移
192.168.1.101:7001> CLUSTER FAILOVER

Q4: 如何查看集群中每个节点的内存使用情况?

A4: 使用以下命令:

bash
# 查看所有节点的内存使用情况
for port in {7001..7006}; do \
  echo "Node 192.168.1.101:$port:"; \
  redis-cli -c -h 192.168.1.101 -p $port INFO memory | grep used_memory_human; \
done

Q5: 集群扩容后,如何重新分配哈希槽?

A5: 使用 redis-cli --cluster reshard 命令重新分配哈希槽:

bash
redis-cli --cluster reshard 192.168.1.101:7001

执行命令后,按照提示输入:

  1. 要迁移的哈希槽数量
  2. 接收哈希槽的目标节点 ID
  3. 输入 all 表示从所有其他主节点迁移哈希槽,或输入具体的节点 ID 表示从特定节点迁移
  4. 输入 done 完成配置

Q6: Redis Cluster 支持多少个节点?

A6: Redis Cluster 理论上支持最多 1000 个节点,但推荐的节点数量在 3-100 之间。节点数量过多会增加集群的复杂度和网络开销。

最佳实践

  1. 硬件规划

    • 主节点和从节点应部署在不同的物理机器上,避免单点故障
    • 根据数据量和访问量规划节点数量和硬件配置
    • 建议使用 SSD 存储,提高性能
  2. 配置优化

    • 设置合理的密码,确保集群安全
    • 启用 AOF 持久化,提高数据安全性
    • 调整 cluster-node-timeout 参数,根据实际情况设置
    • 配置适当的内存淘汰策略
  3. 监控与告警

    • 监控集群状态、节点健康、内存使用、CPU 使用率等指标
    • 设置告警阈值,及时发现并处理异常情况
    • 推荐使用 Prometheus + Grafana 进行监控
  4. 备份与恢复

    • 定期备份集群数据
    • 测试备份的恢复流程
    • 考虑使用 Redis 内置的备份命令或第三方工具
  5. 版本升级

    • 定期升级 Redis 版本,获取新功能和安全修复
    • 升级前进行充分测试
    • 按照官方文档的升级步骤进行操作
  6. 客户端配置

    • 使用支持 Redis Cluster 的客户端库
    • 配置合理的连接池参数
    • 实现重试机制,处理节点故障和连接异常
  7. 容量规划

    • 根据业务增长规划集群容量
    • 预留足够的资源,避免频繁扩容
    • 考虑数据分片和水平扩展
  8. 安全设置

    • 限制集群的访问 IP
    • 启用 SSL/TLS 加密通信
    • 定期审计集群配置和权限