# Redis 入门到精通(十)-- 哨兵(#redis哨兵的作用)
mhr18 2024-10-23 11:32 30 浏览 0 评论
# Redis 入门到精通(十)-- 哨兵
## 一、redis 哨兵:哨兵简介
### 1、哨兵
哨兵(sentinel) :是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 master 并将所有 slave 连接到新的 master。
### 2、哨兵的作用
1)监控
- 不断的检查 master 和 slave 是否正常运行。
- master 存活检测、master 与 slave 运行情况检测。
2)通知(提醒)
当被监控的服务器出现问题时,向其他(哨兵间,客户端)发送通知。
3)自动故障转移
断开 master 与 slave 连接,选取一个 slave 作为 master,将其他 slave 连接到新的 master,并告知客户端新的服务器地址。
### 3、注意事项:
- 哨兵也是一台 redis 服务器,只是不提供数据服务。
- 通常哨兵配置数量为单数。
## 二、redis 哨兵:哨兵结构搭建
### 1、配置哨兵
- 配置一拖二的主从结构。
- 配置三个哨兵(配置相同,端口不同):参看sentinel.conf。
- 启动哨兵。
```java
redis-sentinel sentinel- 端口号 .conf
```
### 2、sentinel.conf 配置文件,配置哨兵。
| 配置项 | 范例 | 说明 |
|--|--|--|
| sentinel auth-pass <服务器名称> <password> | sentinel auth-pass mymaster itcast| 连接服务器口令 |
| sentinel down-after-milliseconds <自定义服务名称><主机地址><端口><主从服务器总量> | sentinel monitor mymaster 192.168.194.131 6381 1| 设置哨兵监听的主服务器信息,最后的参数决定了最终参与选举的服务器 数量(-1)|
| sentinel down-after-milliseconds <服务名称><毫秒数(整数)>| sentinel down-after-milliseconds mymaster 3000| 指定哨兵在监控Redis服务时,判定服务器挂掉的时间周期,默认30秒 (30000),也是主从切换的启动条件之一|
| sentinel parallel-syncs <服务名称><服务器数(整数)>| sentinel parallel-syncs mymaster 1 | 指定同时进行主从的slave数量,数值越大,要求网络资源越高,要求越小,同步时间越长 |
| sentinel failover-timeout <服务名称><毫秒数(整数)>| sentinel failover-timeout mymaster 9000| 指定出现故障后,故障切换的最大超时时间,超过该值,认定切换失败,默认3分钟 |
| sentinel notification-script <服务名称><脚本路径>| | 服务器无法正常联通时,设定的执行脚本,通常调试使用。 |
| | | |
### 3、哨兵结构搭建:操作 redis 编辑 sentinel.conf 文件,配置哨兵。
(打开一个终端,作为主节点 master 窗口)
```java
# 切换到 redis 安装目录 (master窗口)
cd /usr/local/redis/redis-4.0.0/
# 查看 sentinel.conf 文件(取掉注释,取掉空格)
cat sentinel.con | grep -v "#" | grep -v "^#34;
port 26379
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
# 查看 sentinel.conf 文件(取掉注释,取掉空格)并把全部内部复制到当前目录下的conf目录的sentinel-26379.conf 文件中。
cat sentinel.con | grep -v "#" | grep -v "^#34; > ./conf/sentinel-26379.conf
# 编辑 sentinel-26379.conf 文件:
sudo vim conf/sentinel-26379.conf
# 修改内容如下:
port 26379
dir /usr/local/redis/redis-4.0.0/data
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
# 切换到 redis 安装目录下的 conf 目录 (master窗口)
cd /usr/local/redis/redis-4.0.0/conf/
# 复制 2个 sentinel-26379.conf 文件,并改名为:sentinel-26380.conf, sentinel-26379.conf 并把端口号作相应改变。
sed 's/26379/26380/g' sentinel-26379.conf > sentinel-26380.conf
sed 's/26379/26381/g' sentinel-26379.conf > sentinel-26381.conf
# 查看 sentinel-26380.conf, sentinel-26379.conf 内容:
cat sentinel-26380.conf
cat sentinel-26381.conf
# 复制 redis-6380.conf 文件内容,到 redis-6381.conf 文件,并把端口号作相应改变。
sed 's/6380/6381/g' redis-6380.conf > redis-6381.conf
# 查看 redis-6381.conf 内容:
cat redis-6381.conf
# 删除 conf 目录下的其他日志文件,只留配置文件。
rm -rf 6379*
# 切换到 redis 安装目录下的 data 目录(此目录为自己创建的目录) (master窗口)
cd /usr/local/redis/redis-4.0.0/data/
# 清除 data 目录下的所有文件。
rm -rf *
# 切换到 redis 安装目录下(master窗口)
cd /usr/local/redis/redis-4.0.0/
# 指定配置文件,启动 redis 服务(主节点master):
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-server conf/redis-6379.conf
# 模拟 master窗口6379 主节点宕机
Ctrl + C 停止 redis-server conf/redis-6379.conf 服务。
# 查看日志,观察其他服务变化。
```
### 4、打开另一终端,启动 slave-01 从节点服务
```java
# 切换到 redis 安装目录下(slave-01窗口)
cd /usr/local/redis/redis-4.0.0/
# 指定配置文件,启动 redis 服务(slave-01从节点1):
redis-server conf/redis-6380.conf
# 模拟 master窗口6379 主节点宕机
Ctrl + C 停止 redis-server conf/redis-6379.conf 服务。
# 查看日志,观察其他服务变化。
```
### 5、打开另一终端,启动 slave-02 从节点2服务
```java
# 切换到 redis 安装目录下(slave-02窗口)
cd /usr/local/redis/redis-4.0.0/
# 指定配置文件,启动 redis 服务(slave-02从节点2):
redis-server conf/redis-6381.conf
# 模拟 master窗口6379 主节点宕机
Ctrl + C 停止 redis-server conf/redis-6379.conf 服务。
# 查看日志,观察其他服务变化。
```
### 6、打开另一终端(Sentinel-01窗口),启动哨兵1服务端
```java
# 切换到 redis 安装目录下(Sentinel-01窗口)
cd /usr/local/redis/redis-4.0.0/
# 指定配置文件,启动哨兵1服务(Sentinel-01窗口):
redis-sentinel conf/sentinel-26379.conf
```
### 7、打开另一终端客户端(Sentinel-cli-01窗口),连接哨兵1服务端
```java
# 切换到 redis 安装目录下(Sentinel-cli-01窗口)
cd /usr/local/redis/redis-4.0.0/
# 连接哨兵1服务端(Sentinel-cli-01窗口):
redis-cli -p 26379
127.0.0.1:26379>
```
### 8、打开另一终端(Sentinel-02窗口),启动哨兵2服务端
```java
# 切换到 redis 安装目录下(Sentinel-02窗口)
cd /usr/local/redis/redis-4.0.0/
# 查看一下哨兵1服务端启动后的配置文件 conf/
cat conf/sentinel-26379.conf
# 内容变为:
port 26379
dir /usr/local/redis/redis-4.0.0/data
sentinel myid 0249e5c2fdde04cbe1059aa1a137b9b352f0f7f0
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
# Generated by CONFIG REWRITE
sentinel known-slave mymaster 127.0.0.1 6380
sentinel known-slave mymaster 127.0.0.1 6381
sentinel current-epoch 0
# 指定配置文件,启动哨兵2服务(Sentinel-02窗口):
redis-sentinel conf/sentinel-26380.conf
```
### 9、打开另一终端客户端(Sentinel-cli-02窗口),连接哨兵2服务端
```java
# 切换到 redis 安装目录下(Sentinel-cli-02窗口)
cd /usr/local/redis/redis-4.0.0/
# 连接哨兵1服务端(Sentinel-cli-02窗口):
redis-cli -p 26380
127.0.0.1:26380>
```
### 10、打开另一终端(Sentinel-03窗口),启动哨兵3服务端
```java
# 切换到 redis 安装目录下(Sentinel-03窗口)
cd /usr/local/redis/redis-4.0.0/
# 查看一下哨兵1 哨兵2 服务端 2 个启动后的配置文件 conf/
cat conf/sentinel-26379.conf
# 内容又会有变化:
port 26379
dir /usr/local/redis/redis-4.0.0/data
sentinel myid 0249e5c2fdde04cbe1059aa1a137b9b352f0f7f0
sentinel myid 0249e5c2fdde36cbe1059aa79137b9b352f0f733
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
# Generated by CONFIG REWRITE
sentinel known-slave mymaster 127.0.0.1 6380
sentinel known-slave mymaster 127.0.0.1 6381
sentinel current-epoch 0
# 指定配置文件,启动哨兵2服务(Sentinel-03窗口):
redis-sentinel conf/sentinel-26381.conf
```
### 11、打开另一终端客户端(Sentinel-cli-03窗口),连接哨兵3服务端
```java
# 切换到 redis 安装目录下(Sentinel-cli-03窗口)
cd /usr/local/redis/redis-4.0.0/
# 连接哨兵1服务端(Sentinel-cli-03窗口):
redis-cli -p 26381
127.0.0.1:26381>
```
### 12、打开另一终端客户端(master-cli窗口),连接 master 主节点服务端
```java
# 启动另一客户端(master-cli窗口):
# 切换到 redis 安装目录
cd /usr/local/redis/redis-4.0.0/
# 指定端口号,启动 redis 客户端:
redis-cli -p 6379
# 查看所有 key
127.0.0.1:6380> keys *
1) "name"
# 清空所有 redis 数据库
127.0.0.1:6380> flushall
OK
# 查看所有 key
127.0.0.1:6380> keys *
(empty list or set)
# 创建数据
127.0.0.1:6380> set name redis-6379
OK
# 模拟 master 窗口 6379 主节点宕机后,测试连接
127.0.0.1:6380> set name aaa
could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected>
```
### 13、打开另一终端客户端(slave-cli窗口),连接 slave 从节点服务端
```java
# 启动另一客户端(slave-cli窗口):
# 切换到 redis 安装目录
cd /usr/local/redis/redis-4.0.0/
# 指定端口号,启动 redis 客户端:
redis-cli -p 6380
# 查看所有 key
127.0.0.1:6380> keys *
1) "name"
# 清空所有 redis 数据库
127.0.0.1:6380> flushall
OK
# 查看所有 key
127.0.0.1:6380> keys *
(empty list or set)
# 从节点获取数据
127.0.0.1:6380> get name
"redis-6379"
```
## 三、redis 哨兵:工作原理(1)
### 1、redis 哨兵在进行主从切换过程中经历三个阶段
- 监控。
- 通知。
- 故障转移。
### 2、redis 哨兵:工作原理:
阶段一:监控阶段: 用于同步各个节点的状态信息。
1)获取各个 sentinel 的状态(是否在线)。
2)获取 master 的状态。
- master 属性。
- runid
- role:master
- 各个slave的详细信息。
3)获取所有 slave 的状态(根据 master 中的 slave 信息)。
- slave属性
- runid
- role:slave
- master_host、master_port
- offset
- ......
### 3、redis哨兵工作原理-阶段一监控阶段示例图:
## 四、redis 哨兵:工作原理(2)
redis哨兵工作原理-阶段二通知阶段示例图:
## 五、redis 哨兵:工作原理(3)
### 1、redis 哨兵工作原理:阶段三--故障转移阶段
1)服务器列表中挑选备选 master。
- 在线的。
- 响应慢的。
- 与原master断开时间久的。
- 优先原则。
- 优先级
- offset
- runid
2)发送指令( sentinel )
- 向新的 master 发送 slaveof no one。
- 向其他 slave 发送 slaveof 新 masterIP 端口。
### 2、redis 哨兵工作原理:阶段三--故障转移阶段 示例图:
### 3、redis 哨兵工作原理
1)第一阶段--监控: 同步信息。
2)第二阶段--通知: 保持联通。
3)第三阶段--故障转移
- 发现问题。
- 竞选负责人。
- 优选新 master。
- 新 master 上任,其他 slave 切换 master,原 master 作为 slave 故障回复后连接。
### 4、redis 消兵模式 总结:
- 什么是哨兵
- 哨兵模式搭建
- 哨兵工作原理
- 监控
- 通知
- 故障转移
****`上一节关联链接请点击:`****
[# Redis 入门到精通(九)-- 主从复制(3)](https://dzs168.blog.csdn.net/article/details/140591940)
相关推荐
- 风险突出的高危端口汇总 一网打尽 !
-
高危端口一直是攻击者关注的焦点,了解这些端口的风险、攻击方式及防护策略至关重要。一、文件传输类端口1.TCP20/21:FTP服务端口FTP(文件传输协议)用于文件的上传和下载。其明文传输特性使得...
- 9. Redis Operator (2) —— Sentinel部署
-
0.简介上一篇,我们借由Redis的单机部署,学习了一下Operator的基本使用,今天,我们在此基础上,部署一下Redis的Sentinel模式。Sentinel本质上是为了解...
- Spring Boot3 整合 Redis 后解决缓存穿透问题全解析
-
在当今互联网软件开发领域,构建高效、稳定的应用系统是每个开发者的追求。对于从事互联网软件开发的人员来说,SpringBoot和Redis都是极为常用的技术工具。当在SpringBoot3...
- Spring Boot3 整合 Redis 后解决缓存雪崩问题全解析
-
在当今互联网软件开发领域,高并发、高性能的系统需求日益增长。对于从事互联网软件开发的人员来说,构建高效的缓存机制至关重要。SpringBoot3作为一款流行的Java框架,与Redis这一...
- Sa-Token 多账号体系下Redis持久化问题
-
在使用Sa-Token框架实现多账号体系时,当后端服务重启后,系统报错"未能获取对应StpLogic,type=XXX"。这种情况通常发生在配置了Redis持久化存储的场景下...
- 外贸独立站缓存迷惑行为:你的Redis可能正在制造更多问题!
-
上周帮一个深圳卖家排查网站卡顿,发现他们用Redis缓存了整站HTML——"你们这是把缓存当备份用呢?"结果每次更新产品都要手动清空缓存,编辑小哥差点辞职...最近对象缓存圈两大魔教...
- 别再用top和htop了,这几款终端神器让你的服务器状态一目了然
-
当top命令成为性能瓶颈:一个深夜运维的真实困境凌晨三点,服务器告警短信突然炸响。老王盯着屏幕上top命令的黑白界面,CPU使用率飙升到90%却找不到具体进程,内存占用数据分散在不同列,磁盘I/O更是...
- Redis学习笔记:管道(Pipelining)技术详解(第三章)
-
在掌握了Redis的基础命令后,如何进一步提升批量操作的效率?管道(Pipelining)技术是解决这一问题的关键。本章将深入解析管道的工作原理、使用场景及与其他技术的对比,帮助你在高并发场景下优化R...
- Redis8.0有哪些新特性(redis最新特性)
-
Redis8.0引入了多项新特性和功能增强,以下是其中的一些亮点:1、数据结构:向量集合(VectorSet):这是一种新的数据类型,专为向量相似性搜索设计。它基于有序集(sortedset)...
- Netty 的对象池(netty objectdecoder)
-
Netty是一个高性能的网络通信框架,广泛用于构建高并发、低延迟的TCP/UDP服务。为了提升性能,Netty内部大量使用了对象池(ObjectPool)技术来减少频繁创建和销毁对象带来的...
- Redis学习笔记:核心命令与数据类型操作指南(第二章)
-
上一章我们梳理了Redis的核心应用场景与选型逻辑,本章将聚焦Redis的命令体系,从键操作到各数据类型的核心命令,帮你快速掌握Redis的"操作语法"。一、键(Key)命令:Redi...
- Redis面试核心考点总结(覆盖 90% 的 Redis 面试场景)
-
一、基础核心数据类型与适用场景String:缓存、计数器(INCR)、分布式锁(SETNX)Hash:存储对象(用户信息、商品属性)List:消息队列(LPUSH/BRPOP)、时间线Set:标...
- Redis ListPack有哪些具体应用场景?
-
Redis的Listpack是一种紧凑的数据结构,适用于存储少量数据。它被设计为ziplist的一种改进版本,旨在解决ziplist中存在的连锁更新问题,并提供更高效的内存使用和访问速度。以下是Lis...
- SpringBoot实现单点登录(SSO)的4种方案
-
单点登录(SingleSign-On,SSO)是企业应用系统中常见的用户认证方案,它允许用户使用一组凭证访问多个相关但独立的系统,无需重复登录。对于拥有多个应用的企业来说,SSO可以显著提升用户体验...
- 刚刚,给学妹普及了登录的两大绝学
-
今天跟大家聊一个比较基础的话题,就是实现登录的方式有哪些?适合刚入行的朋友。华山之Session绝学Session我们称之为会话控制,是一种在服务器端保持会话状态的解决方案。通俗点来讲就是客户...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 风险突出的高危端口汇总 一网打尽 !
- 9. Redis Operator (2) —— Sentinel部署
- Spring Boot3 整合 Redis 后解决缓存穿透问题全解析
- Spring Boot3 整合 Redis 后解决缓存雪崩问题全解析
- Sa-Token 多账号体系下Redis持久化问题
- 外贸独立站缓存迷惑行为:你的Redis可能正在制造更多问题!
- 别再用top和htop了,这几款终端神器让你的服务器状态一目了然
- Redis学习笔记:管道(Pipelining)技术详解(第三章)
- Redis8.0有哪些新特性(redis最新特性)
- Netty 的对象池(netty objectdecoder)
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle主从同步 (56)
- oracle 乐观锁 (53)
- redis 命令 (83)
- php redis (97)
- redis 存储 (67)
- redis 锁 (74)
- 启动 redis (73)
- redis 时间 (60)
- redis 删除 (69)
- redis内存 (64)
- redis并发 (53)
- redis 主从 (71)
- redis同步 (53)
- redis结构 (53)
- redis 订阅 (54)
- redis 登录 (62)
- redis 面试 (58)
- redis问题 (54)
- 阿里 redis (59)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)