Ubuntu 22 redis集群搭建

准备工作:

物理机分别为:端口以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

重复上述操作,分别清理 72017202 实例的数据目录。

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 从,具备更高的容灾能力(单个主节点故障时,其从节点可自动升级为主节点)。

相关推荐
siriuuus5 小时前
Linux 磁盘扩容及分区相关操作实践
linux·运维·服务器
会飞的小蛮猪5 小时前
Jenkins运维之路(权限分配&忘记admin密码)
java·运维·经验分享·jenkins·prometheus
To_再飞行5 小时前
K8s 存储配置资源
linux·云原生·容器·kubernetes
小猪写代码6 小时前
Ubuntu 文件权限管理
linux·ubuntu
jz_ddk6 小时前
[Linux] Linux标准块设备驱动详解:从原理到实现
linux·运维·服务器·驱动开发
维尔切6 小时前
自动化运维-ansible中对于大项目的管理
运维·自动化·ansible
Gss7776 小时前
ansible变量+管理机密
linux·运维·ansible
误入运维泥潭6 小时前
Ansible自动化运维:从入门到精通
linux·ansible·module
半梦半醒*6 小时前
ansible阶段练习题
linux·运维·自动化·ansible·负载均衡·运维开发