Redis Cluster 集群搭建和扩容
bash
下载并编译安装
cd /usr/local/src 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 make && make install
创建配置和数据目录(以节点1为例,其他节点调整端口和路径)
mkdir -p /etc/redis/cluster mkdir -p /var/lib/redis/6379
### 单节点配置
为每个节点创建独立的配置文件。以 `192.168.56.101` 上的端口 `6379` 为例,创建 `/etc/redis/cluster/6379.conf`:
```ini
port 6379
bind 192.168.56.101
daemonize yes
pidfile /var/run/redis_6379.pid
logfile /var/log/redis_6379.log
dir /var/lib/redis/6379
# 集群配置
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
# 持久化
appendonly yes
appendfilename "appendonly.aof"
其他节点同理,修改 port、bind、pidfile、logfile、dir 和 cluster-config-file 中的端口号。在两台机器上共创建 6 个配置文件。
启动所有节点
在两台机器上分别启动各自的 Redis 实例:
# 在 192.168.56.101 上
redis-server /etc/redis/cluster/6379.conf
redis-server /etc/redis/cluster/6380.conf
redis-server /etc/redis/cluster/6381.conf
# 在 192.168.56.102 上
redis-server /etc/redis/cluster/6379.conf
redis-server /etc/redis/cluster/6380.conf
redis-server /etc/redis/cluster/6381.conf
验证启动状态:
ps -ef | grep redis
每个节点日志应出现 Cluster mode enabled 字样。
创建 Cluster
使用 redis-cli 的集群创建命令,将一个节点作为种子节点即可自动发现其他成员。
redis-cli --cluster create \
192.168.56.101:6379 \
192.168.56.101:6380 \
192.168.56.101:6381 \
192.168.56.102:6379 \
192.168.56.102:6380 \
192.168.56.102:6381 \
--cluster-replicas 1
参数说明:
--cluster create:创建集群--cluster-replicas 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 ... to ...
...
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
验证集群状态
连接任意节点检查集群信息:
redis-cli -h 192.168.56.101 -p 6379 cluster nodes
输出会列出所有节点的 ID、地址、角色(master/slave)、槽位范围等。
测试数据读写与重定向:
redis-cli -h 192.168.56.101 -p 6379
> set key1 hello
(error) MOVED 9189 192.168.56.101:6380 # 键被分配到其他节点
# 使用 -c 参数开启集群模式自动重定向
redis-cli -h 192.168.56.101 -p 6379 -c
> set key1 hello
-> Redirected to slot [9189] located at 192.168.56.101:6380
OK
> get key1
"hello"
看到 MOVED 重定向以及自动跳转则说明集群工作正常。
Redis Cluster 扩容
当业务增长需要更多存储容量或更高吞吐时,可以向运行中的集群添加新节点。
添加新节点
假设我们要新增一对主从节点:
- 新主节点:192.168.56.103:6379
- 新从节点:192.168.56.103:6380
1. 准备新节点
在新机器(192.168.56.103)上安装 Redis,创建配置,启动两个实例(配置与之前相同,注意端口和 cluster-enabled yes)。
2. 添加新主节点到集群
redis-cli --cluster add-node 192.168.56.103:6379 192.168.56.101:6379
- 第一个地址是要添加的新节点
- 第二个地址是集群中任意一个已存在的节点
执行后检查集群节点,发现新节点已加入但尚未分配槽位,也没有负责的哈希槽。
3. 重新分配哈希槽
需要将部分槽位迁移到新主节点,实现数据均匀分布。
redis-cli --cluster reshard 192.168.56.101:6379
交互式选择:
How many slots do you want to move?:输入要迁移的槽位数。总槽位 16384,现有 3 主,新增后共 4 主,所以迁移约 4096 个槽。What is the receiving node ID?:输入新主节点的 ID(可通过cluster nodes查看)。Source node:输入all让集群自动从所有现有主节点均匀抽取槽位,或者逐一指定。
然后确认执行计划,输入 yes 开始在线迁移。迁移过程中集群正常对外服务。
4. 添加从节点
为新主节点分配从节点,提升高可用性:
redis-cli --cluster add-node 192.168.56.103:6380 192.168.56.101:6379 \
--cluster-slave --cluster-master-id <新主节点ID>
--cluster-slave:指定添加的节点为从节点--cluster-master-id:指定要跟随的主节点 ID
验证扩容结果
redis-cli -h 192.168.56.101 -p 6379 cluster nodes
redis-cli -h 192.168.56.101 -p 6379 cluster slots