先分清 Redis 两大架构(必考)
第一种:主从 + 哨兵 例如三台服务器 搭建一主俩从+三哨兵
结构:
- 1 主 2 从 Redis 节点
- 3 个哨兵节点(每台机器 1 个)
特点:
- 所有 Redis 节点数据 100% 完全一模一样主写,从只读,全量副本。
- 哨兵负责监控、故障自动切换、主从升降级
- 数据不分片、不拆分,所有数据全部在每一台 Redis 上
- 容量受单机最大内存限制,不能扩容数据量
- 只解决高可用(主挂了自动换主),不解决海量数据存储
业内称呼:哨兵模式、主从高可用架构 不算官方定义的 Redis Cluster 分片集群
第二种:Redis Cluster 分片集群(真正的官方集群)
特点:
- 数据分片分散存储,每个节点只存一部分数据
- 可以横向扩容,存海量数据
- 自带主从 + 故障转移,不需要额外哨兵
- 槽位分配、数据迁移、多主多从分片
目录
[第二种:Redis Cluster 分片集群(真正的官方集群)](#第二种:Redis Cluster 分片集群(真正的官方集群))
[一、所有服务器通用前置准备(3 台机器全部执行)](#一、所有服务器通用前置准备(3 台机器全部执行))
[1. 安装系统编译依赖(CentOS 系统)](#1. 安装系统编译依赖(CentOS 系统))
[2. 解压编译安装 Redis](#2. 解压编译安装 Redis)
[3. 创建目录结构(配置、日志、数据、pid 文件)](#3. 创建目录结构(配置、日志、数据、pid 文件))
[4. 把源码自带配置文件复制到自定义配置目录](#4. 把源码自带配置文件复制到自定义配置目录)
[5. 防火墙放行端口(必做,否则主从、哨兵无法通信)is nor running 跳过此步骤](#5. 防火墙放行端口(必做,否则主从、哨兵无法通信)is nor running 跳过此步骤)
[7. 关闭系统自带旧 redis(防止端口冲突)](#7. 关闭系统自带旧 redis(防止端口冲突))
[二、第一步:配置 Redis 主从复制](#二、第一步:配置 Redis 主从复制)
[2.1 主节点配置(仅 10.64.100.30 操作)](#2.1 主节点配置(仅 10.64.100.30 操作))
[启动主节点 Redis](#启动主节点 Redis)
[2.2 从节点 1 配置(仅 10.64.100.31 操作)](#2.2 从节点 1 配置(仅 10.64.100.31 操作))
[启动从节点 1 Redis](#启动从节点 1 Redis)
[2.3 从节点 2 配置(仅 10.64.100.32 操作)](#2.3 从节点 2 配置(仅 10.64.100.32 操作))
[启动从节点 2 Redis](#启动从节点 2 Redis)
[2.4 验证主从复制全部成功](#2.4 验证主从复制全部成功)
[三、第二步:配置 Redis 哨兵(3 台服务器全部配置)](#三、第二步:配置 Redis 哨兵(3 台服务器全部配置))
[编辑哨兵配置文件(3 台机器全部执行)](#编辑哨兵配置文件(3 台机器全部执行))
[1. 手动关闭原主节点 redis](#1. 手动关闭原主节点 redis)
[2. 等待 3 秒,查看新主节点](#2. 等待 3 秒,查看新主节点)
[3. 原主节点恢复后的自动同步](#3. 原主节点恢复后的自动同步)
[五、配置开机自启(服务器重启后自动启动 Redis + 哨兵)](#五、配置开机自启(服务器重启后自动启动 Redis + 哨兵))
[1. 创建 redis 服务脚本](#1. 创建 redis 服务脚本)
[2. 创建哨兵服务脚本](#2. 创建哨兵服务脚本)
[3. 重载系统服务、设置开机自启](#3. 重载系统服务、设置开机自启)
[4. 后续启停统一命令(以后全部用系统命令)](#4. 后续启停统一命令(以后全部用系统命令))
[连接 Redis 主从客户端](#连接 Redis 主从客户端)
本文章介绍哨兵集群部署方式
结合你 3 台服务器固定 IP:10.64.100.30、10.64.100.31、10.64.100.32 、Redis 手动官网源码包安装 、1 主 2 从 + 3 个哨兵(每台机器一个 Redis 服务 + 一个哨兵)
整体架构规划
节点规划
|----------------|--------------------|------------------|--------------|--------------------------|
| 服务器 IP | Redis 服务角色 | Redis 端口 | 哨兵端口 | 安装目录统一规范 |
| 10.64.100.30 | 主节点 Master | 6379 | 26379 | /usr/local/redis-cluster |
| 10.64.100.31 | 从节点 Slave1 | 6379 | 26379 | /usr/local/redis-cluster |
| 10.64.100.32 | 从节点 Slave2 | 6379 | 26379 | /usr/local/redis-cluster |
架构:1 主 + 2 从复制 + 3 节点哨兵集群 ,满足高可用、自动故障切换,原主宕机恢复后自动降级为从节点。统一设定:Redis 连接密码 Redis@123456
服务器目录:
Redis版本:redis-6.2.14
压缩包位置: /home/test03-user/soft
统一安装位置:/usr/local/redis-cluster
一、所有服务器通用前置准备(3 台机器全部执行)
你已经上传了 redis 源码压缩包(一般是redis-x.x.x.tar.gz),先统一做环境依赖、解压、编译安装。
1. 安装系统编译依赖(CentOS 系统)
yum install -y gcc gcc-c++ make wget (内网不执行)
上传时智给的安装包解压(内网执行)
Unzip rpm.zip
解压后,进到解压后的文件夹,切换root执行
rpm -ivh *.rpm --nodeps --force
2. 解压编译安装 Redis
假设你上传到了 /root 目录,以 redis-7.2.6 版本为例,你替换成自己真实版本号即可
进入root目录
cd /home/test02-user /soft
解压
tar -zxvf redis-6.2.14 .tar.gz
cd redis-6.2.14
编译
make MALLOC=libc
编译完成后,安装到统一目录 /usr/local/redis-cluster
make PREFIX=/usr/local/ redis-cluster install
3. 创建目录结构(配置、日志、数据、pid 文件)
3 台机器全部执行,统一目录,方便管理
mkdir -p /usr/local/ redis-cluster/ {conf,data,log,pid}
4. 把源码自带配置文件复制到自定义配置目录
复制主redis配置
cp /home/test01-user/soft/redis-6.2.14/redis.conf /usr/local/redis-cluster/conf/redis.conf
复制哨兵配置
cp /home/test01-user/soft/redis-6.2.14/ sentinel.conf /usr/local/ redis-cluster /conf/sentinel.conf
5. 防火墙放行端口(必做,否则主从、哨兵无法通信) is nor running 跳过此步骤
sudo firewall-cmd --state
开放redis 6379、哨兵26379端口
firewall-cmd --add-port=6379/tcp --permanent
firewall-cmd --add-port=26379/tcp --permanent
firewall-cmd --reload# 查看端口是否放行
firewall-cmd --list-ports
6. 关闭SELinux ( 状态为 Disabled 不操作****)****
执行:getenforce 看状态
· Enforcing → 开启中(强制模式,会拦截)
· Permissive → 宽容模式(不拦截,基本等于关闭)
· Disabled → 完全关闭
7 . 关闭系统自带旧 redis(防止端口冲突)
systemctl status redis
systemctl stop redis
systemctl is-enabled redis
systemctl disable redis
二、第一步:配置 Redis 主从复制
严格顺序:
先配置主节点 (30) → 再配置两台从节点 (31、32)
2.1 主节点配置(仅 10.64.100.30 操作)
编辑主配置文件
Cd /usr/local/redis-cluster/conf/
vim redis.conf
把下面配置完整修改 / 替换
绑定IP,允许内网所有IP访问,不要只绑127.0.0.1
bind 0.0.0.0
关闭保护模式(内网服务器集群必须关,否则外部节点无法连接)
protected-mode no
Redis端口
port 6379
后台守护进程运行
daemonize yes
pid文件路径
pidfile /usr/local/redis-cluster/pid/redis.pid
日志配置
logfile /usr/local/redis-cluster/log/redis.log
数据持久化目录
dir /usr/local/redis-cluster/data
Redis访问密码
requirepass Redis@123456
主节点自身密码,从节点连接主节点需要此密码
masterauth Redis@123456
########### 主节点无需配置 replicaof ###########
AOF持久化(生产建议开启,防止数据丢失)
appendonly yes
appendfsync everysec
最大内存按需配置
maxmemory 2G
maxmemory-policy allkeys-lru
启动主节点 Redis
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/conf/redis.conf
验证主节点启动
Ps -ef | grep redis
连接redis,带密码
/usr/local/redis-cluster/bin/redis-cli -h 10.64.100.30 -p 6379 -a Redis@123456
进入客户端后查看主从信息
info replication
出现如下即为正常:
role:master
connected_slaves:0
按 exit 退出客户端。
2.2 从节点 1 配置(仅 10.64.100.31 操作)
编辑配置文件
vim /usr/local/redis-cluster/conf/redis.conf
完整配置,和主节点大部分相同,唯一核心区别就是 replicaof 指向主节点
bind 0.0.0.0
protected-mode no
port 6379
daemonize yes
pidfile /usr/local/redis-cluster/pid/redis.pid
logfile /usr/local/redis-cluster/log/redis.log
dir /usr/local/redis-cluster/data
密码统一
requirepass Redis@123456
masterauth Redis@123456
********** 关键:指定主节点IP端口 **********
replicaof 10.64.100.30 6379
持久化
appendonly yes
appendfsync everysec
maxmemory 2G
maxmemory-policy allkeys-lru
启动从节点 1 Redis
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
2.3 从节点 2 配置(仅 10.64.100.32 操作)
配置文件和 31 节点完全一模一样
vim /usr/local/redis-cluster/conf/redis.conf
配置内容直接照搬 31 节点:
bind 0.0.0.0
protected-mode no
port 6379
daemonize yes
pidfile /usr/local/redis-cluster/pid/redis.pid
logfile /usr/local/redis-cluster/log/redis.log
dir /usr/local/redis-cluster/data
requirepass Redis@123456
masterauth Redis@123456
指向原始主节点
replicaof 10.64.100.30 6379
appendonly yes
appendfsync everysec
maxmemory 2G
maxmemory-policy allkeys-lru
启动从节点 2 Redis
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/conf/redis.conf
2.4 验证主从复制全部成功
回到 10.64.100.30 主节点 ,执行查看:
/usr/local/redis-cluster/bin/redis-cli -h 10.64.100.30 -p 6379 -a Redis@123456
info replication
看到下面结果代表主从搭建完毕:
role:master
connected_slaves:2
slave0:ip=10.64.100.31,port=6379,status=online
slave1:ip=10.64.100.32,port=6379,status=online
两台从节点执行查看,role 均为slave即为正常。
/usr/local/redis-cluster/bin/redis-cli -h 10.64.100.31 -p 6379 -a Redis@123456
info replication

/usr/local/redis-cluster/bin/redis-cli -h 10.64.100.32 -p 6379 -a Redis@123456
info replication

三、第二步:配置 Redis 哨兵(3 台服务器全部配置)
每台机器都启动一个哨兵进程 ,哨兵配置三台完全一模一样 ,我已经写死原始主节点10.64.100.30 6379、密码、所有参数,直接复制即可。
编辑哨兵配置文件(3 台机器全部执行)
vim /usr/local/redis-cluster/conf/sentinel.conf
完整全套配置,直接全部覆盖原文件内容:
哨兵绑定所有IP
bind 0.0.0.0
哨兵端口
port 26379
后台运行
daemonize yes
protected-mode no
哨兵日志
logfile /usr/local/redis-cluster/log/sentinel.log
哨兵工作目录
dir /usr/local/redis-cluster/data
########### 哨兵核心配置 ############ 监控主节点 名字mymaster IP端口 投票数:2# 含义:至少2个哨兵判定主节点宕机,才执行故障转移
sentinel monitor mymaster 10.64.100.30 6379 2
哨兵连接Redis主节点的密码(必须配置,不然哨兵连不上)
sentinel auth-pass mymaster Redis@123456
主节点无响应超时时间(毫秒)3秒判定下线
sentinel down-after-milliseconds mymaster 3000
故障转移时,同时同步的从节点数量,1代表逐个同步,保证服务稳定
sentinel parallel-syncs mymaster 1
故障转移超时时间
sentinel failover-timeout mymaster 10000
三台机器全部启动哨兵服务
每台服务器分别执行启动命令:
/usr/local/redis-cluster/bin/redis-sentinel /usr/local/redis-cluster/conf/sentinel.conf
查看哨兵进程是否启动成功(任意一台执行)
ps -ef | grep redis
能看到 2 个进程:

即为启动成功。
查看哨兵集群状态
任意一台服务器执行连接哨兵:
/usr/local/redis-cluster/bin/redis-cli -p 26379
哨兵客户端内执行:
info sentinel
出现以下信息代表哨兵集群正常:
master0:name=mymaster,status=ok,address=10.64.100.30:6379,slaves=2,sentinels=3

sentinels=3 代表 3 个哨兵全部互相发现、集群组成成功。
四、故障转移功能完整测试(验证高可用)
模拟原始主节点(10.64.100.30)宕机,测试哨兵自动切换主节点
1. 手动关闭原主节点 redis
在 10.64.100.30 服务器执行:
查找redis进程PID
ps -ef | grep redis-server
杀死进程(替换PID)
kill -9 进程号
2. 等待 3 秒,查看新主节点
任意一台连接哨兵查看:
/usr/local/redis-cluster/bin/redis-cli -p 26379
info sentinel
你会发现 address 已经变成 31 或 32 其中一台 IP,哨兵已经自动完成选主、切换、通知所有从节点 。

3. 原主节点恢复后的自动同步
把之前宕机的 10.64.100.30 重新启动:
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/conf/redis.conf
它不需要任何手动修改配置 ,会自动检测新主节点,自动降级为新主的从节点 ,集群自动恢复完整。
五、配置开机自启(服务器重启后自动启动 Redis + 哨兵)
源码安装默认没有系统服务,3 台服务器全部配置,防止机器重启集群挂掉。
1. 创建 redis 服务脚本
vim /usr/lib/systemd/system/redis.service
写入:
Unit
Description=Redis ServerAfter=network.target
Service
Type=forking
ExecStart=/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/conf/redis.conf
ExecStop=/usr/local/redis-cluster/bin/redis-cli -a Redis@123456 shutdownPrivateTmp=true
Install
WantedBy=multi-user.target
2. 创建哨兵服务脚本
vim /usr/lib/systemd/system/redis-sentinel.service
写入:
Unit
Description=Redis Sentinel
After=network.target redis.service
Service
Type=forking
ExecStart=/usr/local/redis-cluster/bin/redis-sentinel /usr/local/redis-cluster/conf/sentinel.conf
ExecStop=/usr/local/redis-cluster/bin/redis-cli -p 26379 shutdownPrivateTmp=true
Install
WantedBy=multi-user.target
3. 重载系统服务、设置开机自启
重载systemd
systemctl daemon-reload
设置redis、哨兵开机自启
systemctl enable redis
systemctl enable redis-sentinel
4. 后续启停统一命令(以后全部用系统命令)
启动redis
systemctl start redis
停止redis
systemctl stop redis
重启redis
systemctl restart redis
查看Redis状态
systemctl status redis
启动哨兵
systemctl start redis-sentinel
停止哨兵
systemctl stop redis-sentinel
查看哨兵状态
systemctl status redis-sentinel
六、日常常用命令汇总
连接 Redis 主从客户端
/usr/local/redis/bin/redis-cli -h 10.64.100.30 -p 6379 -a Redis@123456
查看主从状态
/usr/local/redis/bin/redis-cli -h 10.64.100.30 -p 6379 -a Redis@123456 info replication
连接哨兵
/usr/local/redis/bin/redis-cli -p 26379
哨兵查看主节点信息
sentinel master mymaster
手动强制故障转移
sentinel failover mymaster
七、常见踩坑问题(你部署大概率遇到的问题提前解决)
- 哨兵连不上 Redis、认证失败 原因:必须配置 sentinel auth-pass mymaster 密码,且主从都配置masterauth、requirepass
- 主从无法同步 检查bind 0.0.0.0、protected-mode no、防火墙端口、IP 是否填写正确
- 哨兵配置文件被自动修改 属于 Redis 哨兵正常机制,哨兵会自动写入当前主节点信息,不用管 ,故障切换后配置自动更新
- make 编译报错 重新安装依赖 yum install -y gcc make 清理旧编译文件 make clean 再make
- 多进程端口占用 先全部杀掉旧进程 pkill redis 再重新启动服务