好的,这是一份详细的 Redis 分片集群部署与使用教程。本教程将从概念讲起,逐步深入到环境准备、部署、配置、使用和管理。
![图片[1]_redis分片集群的部署和使用教程_知途无界](https://zhituwujie.com/wp-content/uploads/2025/12/d2b5ca33bd20251202101715.png)
一、Redis 分片集群核心概念
在开始之前,必须理解几个关键概念:
- 什么是分片?
- 分片是一种将数据分散存储在多个 Redis 实例(节点)上的技术。每个节点只存储一部分数据,而不是将所有数据都放在一个节点上。
- 目的:突破单机内存、CPU和网络带宽的限制,实现水平扩展,从而支持海量数据存储和高并发访问。
- 为什么需要集群模式?
- 主从复制:解决了数据冗余和高可用问题,但当单个 master 节点内存或负载达到极限时,依然无法扩展。
- 哨兵模式:解决了主从切换的高可用问题,但同样没有解决数据分片的问题。
- 集群模式:同时解决了高可用和数据分片两个问题。它是官方推荐的大规模部署方案。
- Redis Cluster 的核心架构
- 数据分片:采用 哈希槽 机制。整个数据集被逻辑上划分为 16384 个 slots。每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个 slot。
HASH_SLOT = CRC16(key) mod 16384
- 节点与槽位映射:集群中的每个 master 节点负责处理一部分哈希槽。例如,一个有 3 个 master 的集群,可以这样分配:
- Node A: slots 0 – 5460
- Node B: slots 5461 – 10922
- Node C: slots 10923 – 16383
- 高可用:每个 master 节点可以有多个 slave 节点。当 master 宕机时,其 slave 会自动升级为新的 master,继续负责原来 master 的哈希槽,保证服务不中断。
- 客户端重定向:当客户端连接到一个节点请求一个不属于该节点的 key 时,该节点会返回一个
MOVED错误,告知客户端正确的节点地址。现代客户端库通常能自动处理这个重定向。
- 数据分片:采用 哈希槽 机制。整个数据集被逻辑上划分为 16384 个 slots。每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个 slot。
二、环境准备
我们将部署一个 3主3从 的最小化生产级集群。这意味着需要 6 个 Redis 实例。
| 角色 | IP (示例) | 端口 | 配置文件路径 |
|---|---|---|---|
| Master 1 | 192.168.1.101 | 7000 | /etc/redis/cluster/7000.conf |
| Slave 1 | 192.168.1.101 | 7001 | /etc/redis/cluster/7001.conf |
| Master 2 | 192.168.1.102 | 7002 | /etc/redis/cluster/7002.conf |
| Slave 2 | 192.168.1.102 | 7003 | /etc/redis/cluster/7003.conf |
| Master 3 | 192.168.1.103 | 7004 | /etc/redis/cluster/7004.conf |
| Slave 3 | 192.168.1.103 | 7005 | /etc/redis/cluster/7005.conf |
准备工作:
- 准备至少 3 台 Linux 服务器(虚拟机或物理机均可),并关闭防火墙或开放相应端口(如
7000-7005,17000-17005)。# CentOS/Fedora 关闭防火墙(生产环境建议精细配置) systemctl stop firewalld systemctl disable firewalld # Ubuntu/Debian ufw disable - 确保服务器之间网络互通。
- 在所有服务器上安装 Redis。可以从源码编译或使用包管理器。这里以源码编译为例:
wget https://download.redis.io/releases/redis-7.2.4.tar.gz tar xzf redis-7.2.4.tar.gz cd redis-7.2.4 make && sudo make install
三、部署与配置
步骤 1:创建目录和配置文件
在每台服务器上,为不同的实例创建目录和配置文件。以 192.168.1.101 上的两个实例为例:
# 创建配置目录
sudo mkdir -p /etc/redis/cluster
sudo mkdir -p /var/lib/redis/7000
sudo mkdir -p /var/lib/redis/7001
sudo chown -R redis:redis /var/lib/redis # 假设用户为redis,请根据实际情况修改
创建 7000.conf 文件 (/etc/redis/cluster/7000.conf):
# 基础配置
port 7000
bind 192.168.1.101 # 绑定本机IP,重要!不要绑定127.0.0.1
daemonize yes
pidfile /var/run/redis_7000.pid
logfile /var/log/redis/7000.log
dir /var/lib/redis/7000
# 集群核心配置
cluster-enabled yes
cluster-config-file nodes-7000.conf # 集群自动生成和维护的文件
cluster-node-timeout 15000 # 节点超时时间,毫秒
# 安全与性能
appendonly yes # 开启AOF持久化
requirepass "your_strong_password" # 设置密码,所有节点密码需一致
masterauth "your_strong_password" # 从节点访问主节点的密码
创建 7001.conf 文件,只需修改与端口相关的部分:
port 7001
pidfile /var/run/redis_7001.pid
logfile /var/log/redis/7001.log
dir /var/lib/redis/7001
cluster-config-file nodes-7001.conf
# 其他配置(bind, cluster-enabled, requirepass等)与7000.conf相同
在其他两台服务器上重复此过程,创建对应的 7002.conf, 7003.conf, 7004.conf, 7005.conf,并确保 bind 指令指向各自的服务器 IP。
步骤 2:启动所有 Redis 实例
在每台服务器的配置目录下,分别启动各个实例。
# 在 192.168.1.101 上
redis-server /etc/redis/cluster/7000.conf
redis-server /etc/redis/cluster/7001.conf
# 在 192.168.1.102 上
redis-server /etc/redis/cluster/7002.conf
redis-server /etc/redis/cluster/7003.conf
# 在 192.168.1.103 上
redis-server /etc/redis/cluster/7004.conf
redis-server /etc/redis/cluster/7005.conf
使用 ps aux | grep redis 检查所有实例是否都已成功启动。
四、创建集群
使用 Redis 自带的 redis-cli 工具来创建集群。
方法一:使用 redis-cli --cluster create(推荐)
这是最简单的方法,一条命令即可完成集群的创建和槽位分配。
命令语法:redis-cli -a <password> --cluster create <node1_ip:port> <node2_ip:port> ... --cluster-replicas 1
-a: 指定密码。--cluster create: 创建集群命令。--cluster-replicas 1: 表示为每个 master 创建一个 slave。1代表副本数。对于 6 个节点,--cluster-replicas 1会自动配置为 3主3从。
执行命令(在一台服务器上执行即可):
redis-cli -a your_strong_password --cluster create \
192.168.1.101:7000 \
192.168.1.101:7001 \
192.168.1.102:7002 \
192.168.1.102:7003 \
192.168.1.103:7004 \
192.168.1.103:7005 \
--cluster-replicas 1
执行过程:
- 命令行会打印出拟定的 master-slave 关系和槽位分配方案。
- 它会询问你是否接受这个配置:
Can I set the above configuration? (type 'yes' to accept): - 输入
yes确认。 - 工具将开始分配槽位,并将 slave 关联到对应的 master。成功后你会看到
[OK] All 16384 slots covered。
方法二:手动分配槽位(了解原理)
此方法用于特殊场景,手动将指定范围的槽位分配给特定节点。过程繁琐,一般不推荐新手使用。大致步骤为:
- 用
redis-cli --cluster add-node逐个添加空节点。 - 用
redis-cli --cluster reshard进行槽位迁移。
五、验证与使用集群
1. 基本连接与信息查看
使用 redis-cli 连接集群,必须加上 -c 参数,表示以集群模式工作,否则无法进行自动重定向。
# 连接到集群中任意节点
redis-cli -c -h 192.168.1.101 -p 7000 -a your_strong_password
# 查看集群信息
127.0.0.1:7000> CLUSTER INFO
# 重点关注 cluster_state:ok 表示集群正常
# 查看集群节点信息
127.0.0.1:7000> CLUSTER NODES
# 输出会列出所有节点,包括它们的ID、角色(master/slave)、负责的槽位、连接状态等。
2. 读写数据测试
# 设置一个key
127.0.0.1:7000> SET foo bar
-> Redirected to slot [12182] located at 192.168.1.103:7004 # 自动重定向到了负责这个slot的节点
OK
# 获取这个key
127.0.0.1:7004> GET foo
"bar"
# 再设置一个key,可能就在当前节点
127.0.0.1:7004> SET hello world
OK
# 可以看到,foo和hello被存储在了不同的节点上,实现了分片。
3. 使用应用程序客户端
大多数现代编程语言的 Redis 客户端都支持集群。你需要使用集群专用客户端,而不是普通的单节点客户端。
- Java: JedisCluster, Lettuce
- Python: redis-py-cluster (注意:新版本redis-py也内置了集群支持)
- Go: go-redis/v9
Python 示例 (使用 redis-py):
from redis.cluster import RedisCluster
# 定义集群节点起始点,客户端会自动发现所有节点
startup_nodes = [
{"host": "192.168.1.101", "port": "7000"},
{"host": "192.168.1.102", "port": "7002"},
{"host": "192.168.1.103", "port": "7004"}
]
# 创建集群客户端
rc = RedisCluster(
startup_nodes=startup_nodes,
password="your_strong_password",
decode_responses=True # 自动解码返回值为字符串
)
# 像使用普通Redis一样操作
rc.set("name", "redis_cluster")
print(rc.get("name")) # 输出: redis_cluster
六、集群管理常用操作
1. 添加新主节点
# 1. 在新机器上启动一个空的Redis实例(如端口7006)
redis-server /path/to/new/7006.conf
# 2. 将新节点加入集群(作为master)
redis-cli -a your_strong_password --cluster add-node 192.168.1.104:7006 192.168.1.101:7000
# 第一个IP是新节点,第二个IP是集群中任意一个现有节点
# 3. 为新节点分配槽位(resharding)
redis-cli -a your_strong_password --cluster reshard 192.168.1.101:7000
执行 reshard 后,根据提示输入要迁移的槽位数量、接收节点的 ID,以及从哪些节点迁移(输入 all 表示从所有现有master平均迁移)。
2. 添加从节点
# 启动一个新的空实例(如端口7007)
redis-server /path/to/new/7007.conf
# 将其添加为某个master的slave
# 先通过 CLUSTER NODES 找到目标master的Node ID
redis-cli -a your_strong_password --cluster add-node 192.168.1.104:7007 192.168.1.101:7000 --cluster-slave --cluster-master-id <target_master_node_id>
3. 删除节点
注意: 只能删除没有负责任何槽位的节点(纯slave节点)或已清空所有槽位的master节点。
# 删除一个节点(通过Node ID)
redis-cli -a your_strong_password --cluster del-node 192.168.1.101:7000 <node_id_to_remove>
4. 故障模拟与恢复
手动停止一个 master 节点(如 kill 掉进程),等待 cluster-node-timeout(我们设为15秒)后,观察集群状态:
redis-cli -c -p 7000 cluster nodes | grep myself
如果原来的 slave 节点状态变为 master,则表示故障转移成功,集群依然可用。重新启动被停止的旧 master,它会自动作为新 master 的 slave 重新加入集群。
七、注意事项与最佳实践
- 奇数个Master节点:生产环境建议使用奇数个 master 节点(如 3, 5, 7),便于故障选举。
- 密码一致性:所有节点的
requirepass和masterauth必须设置为相同的强密码。 - 网络与防火墙:确保所有节点之间的
TCP 端口(如7000)和 集群总线端口(通常是客户端端口 + 10000,如17000)是互通的。 - 数据备份:集群模式下的备份需要在每个 master 节点上单独进行(如使用
BGSAVE),或者使用redis-cli --cluster backup命令。 - 避免大Key和热Key:大Key会导致迁移缓慢,热Key会使单个节点压力过大。在设计数据结构时应尽量避免。
- 监控:使用 Prometheus + Grafana 等工具对集群的每个节点进行监控,关注内存、CPU、连接数、命中率等指标。
通过以上步骤,你应该能够成功部署并管理一个基本的 Redis 分片集群。在实际生产环境中,还需要根据具体业务负载进行更细致的调优。

























暂无评论内容