准备工作:
物理机分别为:端口以7开头是因为用的是redis7
192.168.56.120 需要开放的端口 7000 70001 70002 17000 170001 170002
192.168.56.121 需要开放的端口 7100 71001 71002 17100 171001 171002
192.168.56.122 需要开放的端口 7200 72001 72002 17200 172001 172002
下面是端口操作命令,以7000为例
sudo ufw allow 7000/tcp
sudo ufw allow 7001/tcp
sudo ufw allow 7002/tcp
使用到的其他命令如下:
1 开启防火墙: sudo ufw enable
2 检查防火墙当前状态: sudo ufw status
若显示 Status: inactive,表示防火墙未开启;
若显示 Status: active,表示已开启(可跳过 "开启" 步骤)。
3 关闭防火墙(如需临时关闭) sudo ufw disable
4 开放指定端口
# 开放 TCP 协议的 7000 端口 sudo ufw allow 7000/tcp
# 开放 UDP 协议的端口(如需) sudo ufw allow 53/udp
5 删除规则(例如删除编号为 1 的规则) sudo ufw delete 1
6 查看已开放的端口 / 服务 sudo ufw status numbered # 带编号显示规则,方便删除
安装策略:
一次性安装9台可能不能一次成功,所以,先安装122服务器的3个,把这三个作为主节点。当这三个主节点没有问题后再将其他的6台加进来,加入成功后,配置主从关系,最后测试集群。
1 安装redis 192.168.56.120
使用的安装包为 redis-7.0.15.tar.gz
1 将安装包上传后,解压
tar -zxvf redis-7.0.15.tar.gz
cd redis-7.0.15
2 执行make 与 make install,make install 是将redis安装到哪个位置。
su make
sudo make install PREFIX=/home/frank/proTools/redis-cluster/7000
make install 之后,把bin目录添加到path环境,可以在任意路径执行命令
永久生效(添加到环境变量)
编辑环境变量配置文件(如 ~/.bashrc,仅当前用户生效)
vim ~/.bashrc
在文件末尾添加三行(替换为你的 bin 目录路径):
export PATH=$PATH:/home/frank/proTools/redis-cluster/7000/bin
export PATH=$PATH:/home/frank/proTools/redis-cluster/7001/bin
export PATH=$PATH:/home/frank/proTools/redis-cluster/7002/bin
生效配置:
source ~/.bashrc
在执行make的时候可能出现的错误如下:
报错: /bin/sh: 1: pkg-config: not found
sudo apt update # 更新软件源
sudo apt install pkg-config -y # 安装pkg-config
pkg-config --version
报错: /bin/sh: 1: cc: not found
sudo apt update # 更新软件源
sudo apt install build-essential -y # 安装编译工具链
cc --version # 或 gcc --version
报错: zmalloc.h:50:10:fatal error:jemalloc/jemalloc.h:No Such file or director
sudo apt install libjemalloc-dev
2 配置redis
redis.conf 配置文件
# 基本配置
port 7000
bind 0.0.0.0
daemonize yes
pidfile /usr/local/redis-cluster/7000/redis.pid
logfile /usr/local/redis-cluster/7000/log/redis.log
dir /usr/local/redis-cluster/7000/data/
# 持久化配置
appendonly yes
appendfilename "appendonly-7000.aof"
dbfilename dump-7000.rdb
# 集群配置
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 15000
cluster-migration-barrier 1
cluster-require-full-coverage no
# 安全配置
requirepass "store"
masterauth "store"
将配置好的redis.conf 配置文件分别拷贝到 redis-cluster/7000/bin ,redis-cluster/7001/bin,redis-cluster/7002/bin目录下。
3 制作启动service文件:
vim /etc/systemd/system/redis-7000.service
[Unit]
Description=Redis Server
After=network.target
[Service]
Type=forking
PIDFile=/home/frank/proTools/redis-cluster/7000/redis_7000.pid
ExecStart=/home/frank/proTools/redis-cluster/7000/bin/redis-server /home/frank/proTools/redis-cluster/7000/bin/redis.conf
ExecStop=/home/frank/proTools/redis-cluster/7000/bin/redis-cli shutdown
Restart=always
[Install]
WantedBy=multi-user.target
vim /etc/systemd/system/redis-7001.service
[Unit]
Description=Redis Server
After=network.target
[Service]
Type=forking
PIDFile=/home/frank/proTools/redis-cluster/7001/redis_7001.pid
ExecStart=/home/frank/proTools/redis-cluster/7001/bin/redis-server /home/frank/proTools/redis-cluster/7001/bin/redis.conf
ExecStop=/home/frank/proTools/redis-cluster/7001/bin/redis-cli shutdown
Restart=always
[Install]
WantedBy=multi-user.target
vim /etc/systemd/system/redis-7002.service
[Unit]
Description=Redis Server
After=network.target
[Service]
Type=forking
PIDFile=/home/frank/proTools/redis-cluster/7002/redis_7002.pid
ExecStart=/home/frank/proTools/redis-cluster/7002/bin/redis-server /home/frank/proTools/redis-cluster/7002/bin/redis.conf
ExecStop=/home/frank/proTools/redis-cluster/7002/bin/redis-cli shutdown
Restart=always
[Install]
WantedBy=multi-user.target
重新加载系统服务并设置:
sudo systemctl daemon-reload
sudo systemctl enable redis-7000.service
sudo systemctl start redis-7000.service
sudo systemctl daemon-reload
sudo systemctl enable redis-7001.service
sudo systemctl start redis-7001.service
sudo systemctl daemon-reload
sudo systemctl enable redis-7002.service
sudo systemctl start redis-7002.service
如果重启后因为配置文件有问题修改了,没有起效,使用下面命令
修改 redis.conf 后,必须重启节点才能加载新配置。如果只是简单停止再启动,
可能因缓存导致配置未更新。
# 先停止服务
sudo systemctl stop redis-7000.service
# 清除可能的残留进程(确保彻底停止)
sudo pkill -f redis-7000 # 按节点端口过滤进程
# 重新启动
sudo systemctl start redis-7000.service
# 确认启动状态(确保没有报错)
systemctl status redis-7000.service
4 启动redis服务
执行命令 redis-server redis.conf
然后执行 ps -ef|grep redis ,输出如下,说明服务启动成功

5 组建主节点集群
当4没有问题后清理旧集群数据(关键!)
若实例之前运行过集群,或生成过 nodes-*.conf
(集群节点文件)、dump.rdb
(数据快照),需删除这些文件,否则会导致新集群创建失败。
5.1 找到数据存储目录(dir 参数)
在 redis.conf
中查看 dir
参数(如 dir ../data/
),该目录是 nodes-*.conf
和数据文件的存储路径。
5.2 删除旧文件(3 个实例均需操作)
以 7200 实例为例,进入数据目录并删除文件:
# 进入7200的数据目录(按实际dir路径修改)
cd /home/frank/proTools/redis-cluster/7200/data/
# 删除集群节点文件和数据快照
rm -rf nodes-7200.conf dump.rdb appendonly.aof
重复上述操作,分别清理 7201 和 7202 实例的数据目录。
5.3 重启 Redis 实例(确保配置生效)
停止实例(按端口杀进程)
# 停止7000实例
kill -9 1118466 # 1118466是7000的PID(从ps -ef|grep redis中获取)
# 停止7001实例
kill -9 1129776
# 停止7002实例
kill -9 1133682
重新启动实例(带集群模式)
# 启动7000实例(按实际配置文件路径修改)
cd /home/frank/proTools/redis-cluster/7000/bin/
./redis-server redis.conf
# 启动7001实例
cd /home/frank/proTools/redis-cluster/7001/bin/
./redis-server redis.conf
# 启动7002实例
cd /home/frank/proTools/redis-cluster/7002/bin/
./redis-server redis.conf
验证实例是否正常运行
ps -ef | grep redis
# 输出应包含3个实例,且均带「[cluster]」标识
5.4 创建 Redis 集群
使用 Redis 内置的 redis-cli
工具,一键创建集群(只需执行一次,无需逐个节点操作)。
执行集群创建命令
在任意目录执行(确保 redis-cli 在环境变量中,或使用绝对路径,如 ./redis-cli):
# 核心命令:创建集群,--cluster-replicas 0 表示不配置从节点(3个主节点足够)
redis-cli --cluster create 192.168.56.120:7000 192.168.56.120:7001 192.168.56.120:7002 --cluster-replicas 0
确认集群配置
执行命令后,终端会输出 节点分配方案(3 个主节点平分 16384 个哈希槽),并提示确认:
>>> Performing hash slots allocation on 3 nodes...
Master[0] -> Slots 0-5460
Master[1] -> Slots 5461-10922
Master[2] -> Slots 10923-16383
M: xxxxxxxx 127.0.0.1:7200
slots:[0-5460] (5461 slots) master
M: yyyyyyyy 127.0.0.1:7201
slots:[5461-10922] (5462 slots) master
M: zzzzzzzz 127.0.0.1:7202
slots:[10923-16383] (5461 slots) master
Can I set the above configuration? (type 'yes' to accept):
输入 yes 确认,集群开始创建,最终输出 [OK] All 16384 slots covered 表示创建成功。
5.5 验证集群可用性
连接集群(带 -c 参数,启用集群模式)
redis-cli -c -h 192.168.56.120 -p 7000 -a store
查看集群状态
输入命令 cluster info
输出如下:
# 查看集群整体信息(重点看 cluster_state:ok)
# 输出示例(正常状态):
# cluster_state:ok
# cluster_slots_assigned:16384
# cluster_slots_ok:16384
# cluster_slots_pfail:0
# cluster_slots_fail:0
# 查看所有节点信息(角色、槽位、ID)
cluster nodes
# 输出示例(3个节点均为master,且槽位分配正确):
# yyyyyyyy 127.0.0.1:7201@17201 master - 0 1699999999 2 connected 5461-10922
# zzzzzzzz 127.0.0.1:7202@17202 master - 0 1699999998 3 connected 10923-16383
# xxxxxxxx 127.0.0.1:7200@17200 myself,master - 0 1699999997 1 connected 0-5460
5.6 测试数据读写(验证槽位跳转)
Redis 集群会根据 key 的哈希值自动路由到对应槽位的节点,测试时会看到「Redirected」提示(表示跳转成功):

6 添加从节点
前置准备
6 个从节点 192.168.56.121:7100/7101/7102 、192.168.56.122:7200/7201/7202需满足
配置文件中开启集群模式(cluster-enabled yes)
密码配置正确(requirepass store 和 masterauth store,与主节点一致)
已清理旧集群数据(nodes-*.conf、dump.rdb 等,避免冲突)
已启动(可通过 ps -ef | grep redis 确认)
步骤 1:获取主节点的「节点 ID」
# 连接主节点7000(带密码和集群模式)
redis-cli -c -h 192.168.56.120 -p 7000 -a store
# 在Redis客户端中执行,获取所有节点信息(重点看主节点的ID)
cluster nodes
输出示例(需记录 3 个主节点的 ID,格式为长字符串):
707f1f007c688b3ae594123dfeffe2ab06d10033 192.168.56.120:7001@17201 master - 0 1757087012563 2 connected 5461-10922
b080931ec28b1d44d6d6aba45f02aea40daa6aab 192.168.56.120:7002@17202 master - 0 1757087011556 3 connected 10923-16383
70dc65ab073f614c2019caca1d7dd7e14408ab66 192.168.56.120:7000@17200 myself,master - 0 1757087010000 1 connected 0-5460
步骤 2:将从节点加入集群(所有从节点均需执行)
通过 cluster meet 命令将从节点加入现有集群(连接从节点执行)。
# 1. 连接从节点7100(带密码)
redis-cli -h 192.168.56.121 -p 7100 -a store
# 2. 执行meet命令,将从节点加入集群(指定任意主节点的IP和端口即可)
cluster meet 192.168.56.120 7000
# 3. 退出当前从节点的客户端
exit
# 1. 连接从节点7101(带密码)
redis-cli -h 192.168.56.121 -p 7101 -a store
# 2. 执行meet命令,将从节点加入集群(指定任意主节点的IP和端口即可)
cluster meet 192.168.56.120 7000
# 3. 退出当前从节点的客户端
exit
# 1. 连接从节点7102(带密码)
redis-cli -h 192.168.56.121 -p 7102 -a store
# 2. 执行meet命令,将从节点加入集群(指定任意主节点的IP和端口即可)
cluster meet 192.168.56.120 7000
# 3. 退出当前从节点的客户端
exit
# 1. 连接从节点7200(带密码)
redis-cli -h 192.168.56.122 -p 7200 -a store
# 2. 执行meet命令,将从节点加入集群(指定任意主节点的IP和端口即可)
cluster meet 192.168.56.120 7000
# 3. 退出当前从节点的客户端
exit
# 1. 连接从节点7201(带密码)
redis-cli -h 192.168.56.122 -p 7201 -a store
# 2. 执行meet命令,将从节点加入集群(指定任意主节点的IP和端口即可)
cluster meet 192.168.56.120 7000
# 3. 退出当前从节点的客户端
exit
# 1. 连接从节点7202(带密码)
redis-cli -h 192.168.56.122 -p 7202 -a store
# 2. 执行meet命令,将从节点加入集群(指定任意主节点的IP和端口即可)
cluster meet 192.168.56.120 7000
# 3. 退出当前从节点的客户端
exit
步骤 3:指定从节点的主节点(分配复制关系)
|---------------------|-----------------|-----------------------------------------|
| 主节点 | 主节点 ID(步骤 1 获取) | 分配的从节点 |
| 192.168.56.120:7000 | 70dc65ab0... | 192.168.56.121:7100 192.168.56.122:7200 |
| 192.168.56.120:7001 | 707f1f007... | 192.168.56.121:7101 192.168.56.122:7201 |
| 192.168.56.120:7002 | b080931ec... | 192.168.56.121:7102 192.168.56.122:7202 |
# 1. 连接从节点7100
redis-cli -h 192.168.56.121 -p 7100 -a store
# 2. 执行复制命令(指定主节点ID,替换为步骤1获取的70dc65ab...)
cluster replicate 70dc65ab073f614c2019caca1d7dd7e14408ab66
# 3. 验证是否成功(输出中包含「slave of 70dc65ab...」)
cluster nodes
# 1. 连接从节点7101
redis-cli -h 192.168.56.121 -p 7101 -a store
# 2. 执行复制命令(指定主节点ID,替换为步骤1获取的70dc65ab...)
cluster replicate 70dc65ab073f614c2019caca1d7dd7e14408ab66
# 3. 验证是否成功(输出中包含「slave of 70dc65ab...」)
cluster nodes
# 1. 连接从节点7102
redis-cli -h 192.168.56.121 -p 7102 -a store
# 2. 执行复制命令(指定主节点ID,替换为步骤1获取的70dc65ab...)
cluster replicate 70dc65ab073f614c2019caca1d7dd7e14408ab66
# 3. 验证是否成功(输出中包含「slave of 70dc65ab...」)
cluster nodes
# 1. 连接从节点7200
redis-cli -h 192.168.56.122 -p 7200 -a store
# 2. 执行复制命令(指定主节点ID,替换为步骤1获取的70dc65ab...)
cluster replicate 70dc65ab073f614c2019caca1d7dd7e14408ab66
# 3. 验证是否成功(输出中包含「slave of 70dc65ab...」)
cluster nodes
# 1. 连接从节点7201
redis-cli -h 192.168.56.122 -p 7201 -a store
# 2. 执行复制命令(指定主节点ID,替换为步骤1获取的70dc65ab...)
cluster replicate 70dc65ab073f614c2019caca1d7dd7e14408ab66
# 3. 验证是否成功(输出中包含「slave of 70dc65ab...」)
cluster nodes
# 1. 连接从节点7202
redis-cli -h 192.168.56.122 -p 7202 -a store
# 2. 执行复制命令(指定主节点ID,替换为步骤1获取的70dc65ab...)
cluster replicate 70dc65ab073f614c2019caca1d7dd7e14408ab66
# 3. 验证是否成功(输出中包含「slave of 70dc65ab...」)
cluster nodes
步骤 4:验证集群状态
连接任意主节点,确认所有从节点已正确加入并关联主节点:
# 连接主节点7000
redis-cli -c -h 192.168.56.120 -p 7000 -a store
# 查看集群节点状态(重点检查从节点的「slave」角色和对应的主节点ID)
cluster nodes
# 查看集群整体状态(确保 cluster_state:ok)
cluster info
正常情况下,输出应包含:
3 个主节点(master 角色,带槽位范围)
6 个从节点(slave 角色,且 slave of 后显示对应主节点 ID)
cluster_state:ok 表示集群状态正常

完成后, Redis 集群将包含 3 主 6 从,具备更高的容灾能力(单个主节点故障时,其从节点可自动升级为主节点)。