Redis哨兵模式(Sentinel)高可用方案介绍与配置实践

Redis Sentinel 是 Redis 官方提供的高可用性(HA)解决方案,用于管理 Redis 主从架构中的故障检测和故障转移。通过 Redis Sentinel,可以实现 Redis 主从集群的自动故障恢复,确保服务的高可用性。本文将详细介绍Redis Sentinel的原理、配置方法以及实践步骤。

1 Redis Sentinel简介

1.1 什么是Redis Sentinel

Redis Sentinel是一个分布式系统,用于监控Redis主从节点的健康状态,并在主节点发生故障时自动将从节点提升为新的主节点。它还可以通知客户端主从节点的变化。

1.2 Redis Sentinel的核心功能

  • 监控:持续监控主从节点的健康状态
  • 通知:当 Redis 实例出现故障时,通知管理员或其他应用程序
  • 自动故障转移:当主节点故障时,自动将从节点提升为新的主节点
  • 配置提供者:为客户端提供最新的主节点地址

1.3 Redis Sentinel的优势

  • 高可用性:自动故障转移,减少人工干预
  • 无缝切换:客户端可以自动感知主从节点的变化
  • 易于扩展:支持多个Sentinel节点,避免单点故障

2 Redis Sentinel工作原理

1. Sentinel节点
  • Sentinel是一个独立的进程,可以部署在多个服务器上,每个Sentinel节点会监控Redis主从节点的状态
2. 故障检测
  • Sentinel 会定期向 Redis 主从节点发送ping命令,检测其是否正常运行
  • 如果主节点在指定时间内未响应,Sentinel会将其标记为“主观下线”
  • 多个Sentinel节点会通过投票机制确认主节点是否“客观下线”
3. 故障转移
  • 当主节点被确认为“客观下线”后,Sentinel会选举一个从节点作为新的主节点
  • Sentinel会向其他从节点发送peplicaof命令,使其复制新的主节点
  • Sentinel会更新客户端的配置,使其连接到新的主节点
4. 客户端连接
  • 客户端通过 Sentinel 获取当前的主节点地址,并在主从切换后自动更新连接

3 Redis Sentinel配置与实践

3.1 环境装备

主机IP

角色

端口

说明

192.168.10.32

Redis Master + Sentinel

6379/26379

主节点及哨兵节点1

192.168.10.31

Redis Slave + Sentinel

6379/26379

从节点及哨兵节点2

192.168.10.30

Redis Slave + Sentinel

6379/26379

从节点及哨兵节点3

3.2 Redis主从复制配置

3.2.1 主节点配置

vim /usr/local/redis/redis.conf
# 编辑/usr/local/redis/redis.conf文件,修改如下项的内容
bind 0.0.0.0
protected-mode no
requirepass lahmy1c@
daemonize yes
logfile /var/log/redis-server.log# 修改完如上内容后重启服务
ps -ef |grep redis|grep -v grep |awk '{print $2}'|xargs kill -9 
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf

3.2.2 从节点配置

vim /usr/local/redis/redis.conf
# 编辑/usr/local/redis/redis.conf文件,修改如下项的内容
bind 0.0.0.0
protected-mode no
requirepass lahmy1c@
replicaof 192.168.10.32 6379
masterauth lahmy1c@
daemonize yes
logfile /var/log/redis-server.log# 修改完如上内容后重启服务
ps -ef |grep redis|grep -v grep |awk '{print $2}'|xargs kill -9 
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf

3.2.3 查看主从复制状态

# 主节点
[root@node3 redis]# /usr/local/redis/bin/redis-cli -a lahmy1c@ info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.10.31,port=6379,state=online,offset=210,lag=0
slave1:ip=192.168.10.30,port=6379,state=online,offset=210,lag=1
master_failover_state:no-failover
master_replid:ca76bcd56c1d7aec579fc0976d630857da32b34c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:210
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:210
[root@node3 redis]# # 从节点
[root@node2 redis]# /usr/local/redis/bin/redis-cli -a lahmy1c@ info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:slave
master_host:192.168.10.32
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_read_repl_offset:224
slave_repl_offset:224
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:ca76bcd56c1d7aec579fc0976d630857da32b34c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:224
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:224
[root@node2 redis]# [root@node1 redis]# /usr/local/redis/bin/redis-cli -a lahmy1c@ info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:slave
master_host:192.168.10.32
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_read_repl_offset:224
slave_repl_offset:224
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:ca76bcd56c1d7aec579fc0976d630857da32b34c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:224
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:224
[root@node1 redis]# 

3.3 Sentinel配置(所有节点)

3.3.1 编辑sentinel.conf文件

# 处理sentinel.conf配置文件
grep -v '^$\|#' /root/tool/redis-6.2.9/sentinel.conf > /usr/local/redis/sentinel.conf# 编辑/usr/local/redis/sentinel.conf,修改或者增加如下内容
port 26379
daemonize yes
pidfile /var/run/redis/redis-sentinel.pid
logfile /var/log/redis-sentinel.log
dir /tmp
sentinel monitor mymaster 192.168.10.32 6379 2
sentinel auth-pass mymaster lahmy1c@
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
sentinel parallel-syncs mymaster 1
关键参数说明:
  • sentinel monitor:监控主节点(名称、IP、端口、quorum数)
  • sentinel auth-pass:主节点认证密码
  • sentinel down-after-milliseconds:判定节点不可达的超时时间(毫秒)
  • sentinel failover-timeout:故障转移超时时间(毫秒)
  • sentinel parallel-syncs:故障转移后并行同步的从节点数

3.3.2 启动sentinel服务

# 在所有节点执行如下命令
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf

 3.3.3 检查sentinel状态

 /usr/local/redis/bin/redis-cli -p 26379 info sentinel[root@node3 bin]# /usr/local/redis/bin/redis-cli -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.10.32:6379,slaves=2,sentinels=3
[root@node3 bin]#

3.3.4 查看主从状态

# 查看主节点状态
/usr/local/redis/bin/redis-cli -p 26379 sentinel master mymaster[root@node3 bin]#  /usr/local/redis/bin/redis-cli -p 26379 sentinel master mymaster1) "name"2) "mymaster"3) "ip"4) "192.168.10.32"5) "port"6) "6379"7) "runid"8) "2c673d7bcd9757ef165bce5aa7a835801318ccb9"9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "180"
19) "last-ping-reply"
20) "181"
21) "down-after-milliseconds"
22) "5000"
23) "info-refresh"
24) "4149"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "546489"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "15000"
39) "parallel-syncs"
40) "1"
[root@node3 bin]# # 查看从节点状态
/usr/local/redis/bin/redis-cli -p 26379 sentinel slaves mymaster[root@node2 redis]# /usr/local/redis/bin/redis-cli -p 26379 sentinel slaves mymaster
1)  1) "name"2) "192.168.10.30:6379"3) "ip"4) "192.168.10.30"5) "port"6) "6379"7) "runid"8) "e2204c7b72ceee7476f532226824bbeabcf0fd3d"9) "flags"10) "slave"11) "link-pending-commands"12) "0"13) "link-refcount"14) "1"15) "last-ping-sent"16) "0"17) "last-ok-ping-reply"18) "885"19) "last-ping-reply"20) "885"21) "down-after-milliseconds"22) "5000"23) "info-refresh"24) "6055"25) "role-reported"26) "slave"27) "role-reported-time"28) "668938"29) "master-link-down-time"30) "0"31) "master-link-status"32) "ok"33) "master-host"34) "192.168.10.32"35) "master-port"36) "6379"37) "slave-priority"38) "100"39) "slave-repl-offset"40) "137279"41) "replica-announced"42) "1"
2)  1) "name"2) "192.168.10.31:6379"3) "ip"4) "192.168.10.31"5) "port"6) "6379"7) "runid"8) "80996e2f4e6bfbcc2470431e05cb45bdd105ab36"9) "flags"10) "slave"11) "link-pending-commands"12) "0"13) "link-refcount"14) "1"15) "last-ping-sent"16) "0"17) "last-ok-ping-reply"18) "885"19) "last-ping-reply"20) "884"21) "down-after-milliseconds"22) "5000"23) "info-refresh"24) "6056"25) "role-reported"26) "slave"27) "role-reported-time"28) "668943"29) "master-link-down-time"30) "0"31) "master-link-status"32) "ok"33) "master-host"34) "192.168.10.32"35) "master-port"36) "6379"37) "slave-priority"38) "100"39) "slave-repl-offset"40) "137279"41) "replica-announced"42) "1"
[root@node2 redis]# 

4 模拟故障转移

4.1 模拟主节故障

/usr/local/redis/bin/redis-cli -p 6379 -a lahmy1c@ shutdown

4.2 观察Sentinel日志

# /var/log/redis-sentinel.log日志将记录选举新主节点的过程
54489:X 18 Mar 2025 15:22:23.593 # +sdown master mymaster 192.168.10.32 6379
54489:X 18 Mar 2025 15:22:23.733 # +new-epoch 1
54489:X 18 Mar 2025 15:22:23.740 # +vote-for-leader 255e219ef39458216f990a50b89de6b41e739ec4 1
54489:X 18 Mar 2025 15:22:24.675 # +odown master mymaster 192.168.10.32 6379 #quorum 3/2
54489:X 18 Mar 2025 15:22:24.676 # Next failover delay: I will not start a failover before Tue Mar 18 15:22:54 2025
54489:X 18 Mar 2025 15:22:24.814 # +config-update-from sentinel 255e219ef39458216f990a50b89de6b41e739ec4 192.168.10.32 26379 @ mymaster 192.168.10.32 6379
54489:X 18 Mar 2025 15:22:24.814 # +switch-master mymaster 192.168.10.32 6379 192.168.10.31 6379
54489:X 18 Mar 2025 15:22:24.818 * +slave slave 192.168.10.30:6379 192.168.10.30 6379 @ mymaster 192.168.10.31 6379
54489:X 18 Mar 2025 15:22:24.819 * +slave slave 192.168.10.32:6379 192.168.10.32 6379 @ mymaster 192.168.10.31 6379
54489:X 18 Mar 2025 15:22:29.829 # +sdown slave 192.168.10.32:6379 192.168.10.32 6379 @ mymaster 192.168.10.31 6379

4.3 验证新主节点

/usr/local/redis/bin/redis-cli -p 6379 -a lahmy1c@ info replication# 此时主节点已经转移到了master_host:192.168.10.31
[root@node1 redis]# /usr/local/redis/bin/redis-cli -p 6379 -a lahmy1c@ info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:slave
master_host:192.168.10.31
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:232120
slave_repl_offset:232120
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:124c2940281b400d9240f9237c660db96b23166a
master_replid2:ca76bcd56c1d7aec579fc0976d630857da32b34c
master_repl_offset:232120
second_repl_offset:184978
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:232120
[root@node1 redis]# 

5 总结

通过如上步骤,我们就完成了redis sentinel模式的搭建配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/72869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度】JADC2的层级结构以及全域Mesh网络

文章目录 内容摘要1. 引言2. JADC2层级结构3. JADC2转变为CJADC24. 与工业领域自动化金字塔和全域MESH网络的异同4.1 工业领域自动化金字塔4.2 全域Mesh网络 #JADC2 #Mesh网络 #融合计划 #ABMS #超越计划 #人工智能 #普罗米修斯 **专栏说明:主要研究作战概念、新型作…

210、【图论】课程表(Python)

题目 思路 这道题本质上是一个拓扑排序。每次先统计每个点的入度个数、然后再统计点与点之间的邻接关系,找到入度为0的点作为起始遍历点。之后每遍历到这个点之后,就把这个点后续的邻接关系边的点入度减去一。当某个点入度为0时,继续被加入其…

Mock接口编写教程-axios-mock-adapter(React)

Mock模拟接口编写教程 直接在前端实现接口模拟 1.第一步 设置模拟接口 // mock.ts import axios from axios import MockAdapter from axios-mock-adapter// 创建一个模拟适配器 const mock new MockAdapter(axios)// 设置模拟接口 export const setupMock () > {mock.…

CCF 编程能力认证 C++ 四级宝典

CCF编程能力等级认证(以下简称GESP)2025年四次认证时间分别为:3月22日、6月28日、9月27日、12月20日,认证方式为线下机考,认证语言包括:C、Python和Scratch三种语言,其中Scratch认证为一到四级&…

OpenCV图像拼接(4)图像拼接模块的一个匹配器类cv::detail::BestOf2NearestRangeMatcher

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::BestOf2NearestRangeMatcher 是 OpenCV 库中用于图像拼接模块的一个匹配器类,专门用于寻找两幅图像之间的最佳特征点匹配…

【C#语言】C#中的同步与异步编程:原理、示例与最佳实践

文章目录 ⭐前言⭐一、同步编程:简单但低效的线性执行🌟代码示例🌟执行流程示意图🌟同步编程特点 ⭐二、异步编程:非阻塞的高效执行🌟代码示例🌟执行流程示意图🌟异步编程核心机制&a…

el-input 不可编辑,但是点击的时候出现弹窗/或其他操作面板,并且带可清除按钮

1.focus“getFocus”鼠标聚焦的时候写个方法,弹窗起来 getFocus(){ this.定义的弹窗状态字段 true;} 2.点击确定的时候,数值赋值到el-input的输入框,弹窗取消(this.定义的弹段字端 false) 3.但是会有个问题就是el-input 不可点…

事件响应计划:网络弹性的关键

网络安全事件响应计划不仅仅是技术上的需要,更是企业的当务之急。在网络威胁比以往任何时候都更加复杂和频繁的时代,了解并做好准备应对这些事件可能会决定是恢复还是灾难。 以下是简要分析: 网络安全事件不仅仅是技术故障;它们…

正则表达式详解(regular expression)

💡 正则表达式(Regular Expression, regex)知识点总结 💡 正则表达式是一种用于匹配字符串的模式,广泛用于搜索、替换、验证等操作。 📌 正则表达式的主要作用 1️⃣ 字符串匹配 🧐 检查一个…

全球化2.0 | ZStack云计算系统工程师(ZCCE)国际认证培训成功举办

近日,ZStack云计算系统工程师(ZCCE)国际认证培训在上海成功举办。本次培训采用 "线下 线上直播" 双轨模式,同步开设中文与英文课程,吸引了来自中国、东南亚、独联体、北美、中东等多个国家和地区的近 90 名…

C++学习之nginx+fastDFS

目录 1.知识点概述 2.fastcgi复习 3.文件上传流程分析 4.文件下载流程和优化 5.在存储节点上安装nginx和fastdfs插件 6.mod-fdsf.com配置文件修改 7.解决nginx的worker无法启动,拷贝配置文件操作 8.客户 通过浏览器访问存储节点404问题 9.nginx服务器处理资…

【AIGC】Win10系统极速部署Docker+Ragflow+Dify

【AIGC】WIN10仅3步部署DockerRagflowDify 一、 Docker快速部署1.F2进入bios界面,按F7设置开启VMX虚拟化技术。保存并退出。2.打开控制面板配置开启服务3.到官网下载docker安装包,一键安装(全部默认勾选) 二、 RagFlow快速部署1.确…

token升级(考虑在分布式环境中布置token,结合session保证请求调用过程中token不会过期。)

思路: 首先,用户的需求是确保使用同一个Token的外部调用都在一个Session中处理。 需要考虑Token与Session绑定、安全措施、Session管理、分布式处理等。 使用Redis作为Session存储, 在Java中 通过Spring Data Redis或Lettuce库实现。 2.生成…

新一代电子数据取证专家 | 苏州龙信信息科技有限公司

本文关键词:电子取证、手机取证、计算机取证、云取证 关于我们About us 苏州龙信信息科技有限公司专注于电子数据取证、大数据、信息安全等领域,核心业务主要涵盖取证工具研发、大数据融合分析、案件技术支持、取证能力培训等,先后为执法部门…

研究生研究方向系统基于springboot SSM

目录 摘要 一、系统背景与目的 二、开发流程 三、系统架构与技术选型 四、功能分析 4.1 用户角色与权限管理 4.2研究方向管理功能 4.3学习资源管理功能 4.4科研项目跟踪功能 4.5学术交流与分享功能 4.6导师指导与评估功能 摘要 基于Spring Boot的研究生研究方向系统…

[解决] PDF转图片,中文乱码或显示方框的解决方案

在Java开发中,将PDF文件转换为图片是一项常见的需求,但过程中可能会遇到中文乱码或显示方框的问题。本文将深入探讨这一问题,并提供详细的解决方案,帮助开发者顺利地完成PDF到图片的转换。 一、问题现象 在使用Java库(如Apache PDFBox)将PDF转换为图片时,如果PDF文件中…

「JavaScript深入」WebSocket:高效的双向实时通信技术

WebSocket WebSocket 的特点1. 全双工通信2. 持久连接3. 低延迟4. 二进制和文本支持5. 连接管理6. 二进制数据传输 WebSocket 协议详解1. 握手过程2. 数据帧结构 WebSocket 的实现服务器端实现(Node.js ws库)1. 基础服务器2. 广播功能实现3. 心跳机制客…

ABAP 长文本编辑器

加个屏幕 *&---------------------------------------------------------------------* *& Report YDEMO2 *&---------------------------------------------------------------------* *& *&---------------------------------------------------------…

postman小白教程(从入门到实战,详细教学)

目录 1. postman介绍 2. 下载地址 3. 安装流程 4. 注册postman账号 ① 打开postman,点击【创建账号】或【登录】,会跳转到浏览器 ② 若已有账号可以直接登录;若无账号,则创建新账号 ③ 若登录成功会弹出提示框,…

Qt 实现波浪填充的圆形进度显示

话不多说&#xff0c;先上效果图 代码示例&#xff1a; #include <QApplication> #include <QWidget> #include <QPainter> #include <QPropertyAnimation> #include <QTimer> #include <cmath>class WaveProgressBar : public QWidget {…