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 再重新启动服务
相关推荐
SelectDB1 小时前
为什么 JSON 正在成为分析数据库新的竞争点?
数据库·json·agent
ClouGence2 小时前
开源数据库管理工具 CloudDM 4.2.0 发布,新增 GoldenDB、KingbaseES 等数据源
数据库·dba·devops
发霉的馒头2 小时前
ORA-00845: MEMORY_TARGET not supported on this system的解决方法
数据库
草莓熊Lotso4 小时前
【Redis 初阶】Set 类型深度解析:去重集合的运算能力与实战场景
linux·网络·数据库·windows·redis·tcp/ip·缓存
煎饼皮皮侠6 小时前
【设计】设计一个web版的数据库管理平台后端(之五) --借鉴mybatis
数据库·mybatis
东风破_12 小时前
danci 2:创建的单词书到底存在哪里?从 Supabase 一路理解 ORM、Drizzle 和 RLS
数据库·后端·node.js
橙子家13 小时前
OSS 文件上传的几个风险点和解决方案
数据库
2601_9620664915 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库
愤怒的苹果ext16 小时前
MySQL Shell备份恢复数据库
数据库·mysql·备份恢复·mysqlsh
数字新视界17 小时前
DCIM管理系统的技术架构与部署模式详解
数据库·物联网·数据中心·数据中心基础设施管理·dcim管理系统