Redis 哨兵集群部署方案

先分清 Redis 两大架构(必考)

第一种:主从 + 哨兵 例如三台服务器 搭建一主俩从+三哨兵

结构:

  • 1 主 2 从 Redis 节点
  • 3 个哨兵节点(每台机器 1 个)

特点:

  1. 所有 Redis 节点数据 100% 完全一模一样主写,从只读,全量副本。
  2. 哨兵负责监控、故障自动切换、主从升降级
  3. 数据不分片、不拆分,所有数据全部在每一台 Redis 上
  4. 容量受单机最大内存限制,不能扩容数据量
  5. 只解决高可用(主挂了自动换主),不解决海量数据存储

业内称呼:哨兵模式、主从高可用架构 不算官方定义的 Redis Cluster 分片集群

第二种:Redis Cluster 分片集群(真正的官方集群)

特点:

  1. 数据分片分散存储,每个节点只存一部分数据
  2. 可以横向扩容,存海量数据
  3. 自带主从 + 故障转移,不需要额外哨兵
  4. 槽位分配、数据迁移、多主多从分片

目录

[第二种: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.32Redis 手动官网源码包安装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

七、常见踩坑问题(你部署大概率遇到的问题提前解决)

  1. 哨兵连不上 Redis、认证失败 原因:必须配置 sentinel auth-pass mymaster 密码,且主从都配置masterauth、requirepass
  2. 主从无法同步 检查bind 0.0.0.0、protected-mode no、防火墙端口、IP 是否填写正确
  3. 哨兵配置文件被自动修改 属于 Redis 哨兵正常机制,哨兵会自动写入当前主节点信息,不用管 ,故障切换后配置自动更新
  4. make 编译报错 重新安装依赖 yum install -y gcc make 清理旧编译文件 make clean 再make
  5. 多进程端口占用 先全部杀掉旧进程 pkill redis 再重新启动服务
相关推荐
yejqvow122 小时前
Pandas 高效实现组内跨行时间戳匹配与布尔标记
jvm·数据库·python
了不起的云计算V2 小时前
从DeepSeek V4适配看国产算力的三个拐点
数据库·人工智能
rannn_1112 小时前
【Redis|原理篇2】Redis网络模型、通信协议、内存回收
java·网络·redis·后端·缓存
qq_189807032 小时前
html标签如何提升可访问性_aria-label与title区别【指南】
jvm·数据库·python
norq juox2 小时前
MySQL 导出数据
数据库·mysql·adb
qq_349317483 小时前
mysql如何设置定时自动备份脚本_编写shell脚本与cron任务
jvm·数据库·python
952363 小时前
Spring IoC&DI
java·数据库·spring
尚雷55803 小时前
从电商订单支付更新,吃透 Oracle 数据修改的底层设计哲学与全组件协同原理
数据库·oracle
2401_832365523 小时前
Chart.js 4 中基于数据实际范围的线性渐变填充方案
jvm·数据库·python