Redis-sentinel(哨兵模式)的搭建步骤及相关知识

1、什么是redis-sentinel,和redis主从复制相比,它具有什么优势

1.1、redis主从复制

Redis主从复制是一种用于数据冗余和可伸缩性的机制,它将一台Redis服务器的数据复制到其他Redis服务器。在这种模式下,数据会实时地从一个主节点(Master)同步到一个或多个从节点(Slave)。
然而,单纯的redis主从复制存在一个明显的缺点——即当主节点(Master)发生故障不可用时,尽管数据因为实时的进行复制而不会丢失(或者丢失极少),但将从节点(Slave)升级为主节点(Master)需要人工介入,手动进行切换。因此,这不但增加了运维的人工成本,并且还无法保障业务连续性。综上,这也是redis主从复制作为redis的冗余方案之一,最大的一个制约因素。

1.2、redis-sentinel的优势

Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,从本质上来说,Redis-Sentinel是一个独立运行的进程,专门用于监控Redis集群中的主从节点。当主节点(Master)出现故障时,Redis-Sentinel能够自动选择并提升一个从节点(Slave)为新的主节点,以保证服务的持续可用性,Redis-Sentinel通过心跳机制检测节点的运行状态,并使用投票算法进行故障判断和主备切换决策。所以,redis-sentinel方案解决的是redis主从复制无法自动进行主从切换(故障转移)的问题。

2、搭建示例

2.1、实验拓扑

在这里插入图片描述

2.2、实施步骤

2.2.1、部署“一主二从”式的redis主从复制架构

【redis-master节点(操作系统为OpenEuler-22.03 -LTS-SP2)】
1、通过命令“yum install redis”安装redis;
2、通过命令“systemctl status redis”查看redis状态,保证安装完成后redis进程处于关闭的状态;
在这里插入图片描述
3、通过命令“touch /etc/redis-master.conf”创建一个配置文件,并在配置文件中输入以下内容:

port 6379
daemonize yes
pidfile "/var/run/redis_6379.pid"
logfile "/var/log/redis_6379.log"
dir "/var/lib/redis"# 开启持久化
save 900 1
save 300 10
save 60 10000# 关闭保护模式
protected-mode no# 绑定IP地址
bind 127.0.0.1 192.168.174.136

配置文件内容的含义如下:
在这里插入图片描述
【redis-slave节点(操作系统为OpenEuler-22.03 -LTS-SP2)】
1、通过命令“yum install redis”安装redis;
2、通过命令“systemctl status redis”查看redis状态,保证安装完成后redis进程处于关闭的状态;
在这里插入图片描述
3、通过命令“touch /etc/redis-master.conf”创建一个配置文件,并在配置文件中输入以下内容(与Master节点的配置文件相比,绝大部分内容一样,只是绑定的IP地址不同,且多出了一个slaveof参数用于指向Master节点的IP地址,代表自己是slave节点):

port 6379
daemonize yes
pidfile "/var/run/redis_6379.pid"
logfile "/var/log/redis_6379.log"
dir "/var/lib/redis"# 开启持久化
save 900 1
save 300 10
save 60 10000# 关闭保护模式
protected-mode no# 绑定IP地址
bind 127.0.0.1 192.168.174.131#指定主节点
slaveof 192.168.174.136 6379

【redis-slave节点(操作系统为OpenEuler-22.03 -LTS-SP2)】
1、通过命令“yum install redis”安装redis;
2、通过命令“systemctl status redis”查看redis状态,保证安装完成后redis进程处于关闭的状态;
在这里插入图片描述
3、通过命令“touch /etc/redis-master.conf”创建一个配置文件,并在配置文件中输入以下内容(与Master节点的配置文件相比,绝大部分内容一样,只是绑定的IP地址不同,且多出了一个slaveof参数用于指向Master节点的IP地址,代表自己是slave节点):

port 6379
daemonize yes
pidfile "/var/run/redis_6379.pid"
logfile "/var/log/redis_6379.log"
dir "/var/lib/redis"# 开启持久化
save 900 1
save 300 10
save 60 10000# 关闭保护模式
protected-mode no# 绑定IP地址
bind 127.0.0.1 192.168.174.130#指定主节点
slaveof 192.168.174.136 6379

2.2.2、部署redis-sentinel节点

【redis-sentinel节点(操作系统为debian-12)】
1、通过命令“apt install redis-sentinel”安装redis-sentinel(debian系Linux的redis-sentinel都需要单独进行安装,而红帽系Linux系统中的redis-sentinel已经集成在redis安装包及其依赖中,无需单独安装);
2、通过以下命令创建“redis-sentinel-1.conf 、redis-sentinel-2.conf 、redis-sentinel-3.conf”三个配置文件:

touch /etc/redis-sentinel-1.conf
touch /etc/redis-sentinel-2.conf
touch /etc/redis-sentinel-3.conf

3、在三个配置文件中分别加入以下内容(3个文件除端口号、进程文件名和日志文件名设定不同,其余配置一样):
【redis-sentinel-1.conf】

port 26379
daemonize yes
pidfile /var/run/redis-sentinel-1.pid
logfile /var/log/redis-sentinel-1.log
dir /var/lib/redis# 监控主服务器
sentinel monitor mymaster 192.168.174.136 6379 2# 判断主服务器下线的时间
sentinel down-after-milliseconds mymaster 10000# 故障转移的超时时间
sentinel failover-timeout mymaster 10000# 在执行故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步
sentinel parallel-syncs mymaster 1

【redis-sentinel-2.conf】

port 26380
daemonize yes
pidfile /var/run/redis-sentinel-2.pid
logfile /var/log/redis-sentinel-2.log
dir /var/lib/redis# 监控主服务器
sentinel monitor mymaster 192.168.174.136 6379 2# 判断主服务器下线的时间
sentinel down-after-milliseconds mymaster 10000# 故障转移的超时时间
sentinel failover-timeout mymaster 10000# 在执行故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步
sentinel parallel-syncs mymaster 1

【redis-sentinel-3.conf】

port 26381
daemonize yes
pidfile /var/run/redis-sentinel-3.pid
logfile /var/log/redis-sentinel-3.log
dir /var/lib/redis# 监控主服务器
sentinel monitor mymaster 192.168.174.136 6379 2# 判断主服务器下线的时间
sentinel down-after-milliseconds mymaster 10000# 故障转移的超时时间
sentinel failover-timeout mymaster 10000# 在执行故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步
sentinel parallel-syncs mymaster 1

2.2.3、启动相关服务

1、依次在对应节点输入以下命令来启动服务:
【redis-master节点】

redis-server /etc/redis-master.conf &

【两个redis-slave节点】

redis-server /etc/redis-slave.conf &

【redis-sentinel节点】

redis-sentinel /etc/redis/redis-sentinel-1.conf &
redis-sentinel /etc/redis/redis-sentinel-2.conf &
redis-sentinel /etc/redis/redis-sentinel-3.conf &

3、分别在以下节点验证主从复制和redis-sentinel是否正常
【redis-master节点】
通过命令“netstat -lnpt | grep 6379”查看端口监听状态:

在这里插入图片描述
通过命令“redis-cli -p 6379 info replication”查看主节点(Master)是否发现了两个从节点(Slave):
在这里插入图片描述

【两个redis-slave节点】
通过命令“netstat -lnpt | grep 6379”查看端口监听状态:
在这里插入图片描述

通过命令“redis-cli -p 6379 info replication”查看从节点(Master)指向的主节点(Master)信息和状态:
在这里插入图片描述
【redis-sentinel节点】
通过命令“netstat -lnpt”查看端口监听状态:
在这里插入图片描述
通过命令“redis-cli -p 26379 info sentinel”查看当前sentinel进程的节点监控信息(-p参数下除26379端口外,也可以设置为26380和26381端口):
在这里插入图片描述

3、验证数据同步和故障转移

3.1数据同步

在Master节点进行如下操作:
在这里插入图片描述
分别查看两个slave节点:
在这里插入图片描述
在这里插入图片描述

3.2、验证故障转移

在Master节点上输入命令“killall redis-server”杀死redis-server进程:
在这里插入图片描述
在sentinel节点上输入命令“redis-cli -p 26379 info sentinel”查看Master节点的自动变化情况:

在这里插入图片描述
需要注意的是,如果此时原有的136节点恢复了正常服务,它会变为当前主节点(130节点)的从节点,而不会抢占为主节点。
在redis主从复制中,某个节点是主节点还是从节点,是由配置文件的内容决定的,而当主节点故障发生时,人工干预的方式是去修改配置文件,redis-seninel只是将这一过程有监听程序自动化了,而不需要人工干预,通过查看136节点(原来的主节点)的配置文件,我们可以看到这个过程:
在这里插入图片描述
在这里插入图片描述

4、实验注意事项

4.1、各个节点之间的redis版本必须严格保持一致

各个节点之间的redis版本必须严格保持一致,如果不一致,例如redis4和redis5之间构成了一个redis-sentinel架构,虽然无故障发生时,数据同步时正常的,但故障发生后,重新启用故障节点的进程,该节点就会出现数据无法恢复的情况,也无法通过同步复制写入新的数据。通过查看相关日志(对应redis节点配置文件中logfile参数所定义的日志文件),可以发现是因为版本之间的不兼容,导致RDB文件中的数据无法被正确读取和恢复:
在这里插入图片描述

4.2、已知在OpenEuler系统中,哨兵模式无法转移故障的场景

通过在OpenEuler-22.03 -LTS-SP2实验中发现,如果redis-sentinel进程和redis主节点或从节点(redis-server进程)都在同一台服务器上,当人为将主节点上redis-server进程杀死时,尽管三个位于各自主从节点上的redis-sentinel进程都会各自将Master视作主观下线,但无法触发客观下线的投票,或故障转移的投票被否决,这会导致故障无法转移而业务中断。
当然这样的部署方式本身就存在不合理的地方,因为将redis-sentinel进程和redis-server进程部署在同一台服务器的做法无法发挥出该有的高可用特性,但在实验过程中,出现了这样的情况,暂不清楚其他的Linux系统和redis版本是否也会出现这样的现象。

5、相关知识

5.1、主观下线和客观下线

在Redis中,主观下线和客观下线是哨兵(Sentinel)机制中的两个重要概念,用于判断Redis实例(特别是主服务器)的健康状态和是否需要进行故障转移。

  • 主观下线(Subjective Down,
    SDOWN):是指某个哨兵节点独立地认为某个Redis实例(包括主服务器或从服务器)已经不可达;
  • 客观下线(Objective Down,
    ODOWN):是指多个哨兵节点都认为某个Redis实例(特指主服务器)已经不可达,并且这一判断达到了法定人数(quorum)的要求(触发投票机制)。

在redis-sentinel的相关日志中,其实就可以看到redis-sentinel进程大量判断某个节点主观下线或者客观下线的相关记录:
在这里插入图片描述

5.2、redis的持久化

Redis 持久化是指将 Redis 内存中的数据存储到磁盘上,以确保在 Redis 服务器重启或发生其他故障时,数据不会丢失。Redis 提供了两种主要的持久化方式:RDB(Redis DataBase)和 AOF(Append Only File)。
【RDB 持久化】
RDB 持久化通过创建并保存 Redis 数据集的快照来工作。在指定的时间间隔内,执行数据集快照,并生成一个 .rdb 文件。Redis 重启时,通过加载这个 .rdb 文件来恢复数据。其具有以下特点:

  • RDB 是一个紧凑的二进制文件,保存了 Redis 在某个时间点上的数据集。
  • RDB 持久化非常适合用于备份,全量复制等场景。
  • RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
  • RDB 会丢失最后一次快照之后写入的数据。

【AOF 持久化】
AOF 持久化是通过保存 Redis 服务器所执行的写命令来记录数据库状态的。当 Redis 服务器重启时,会重新执行这些写命令来恢复数据。其具有以下特点:

  • AOF 持久化以日志的形式记录 Redis 所执行的写命令,因此它可以保存更多的数据。
  • AOF 文件的更新频率通常比 RDB 文件的更新频率高,因为 AOF 需要记录每条写命令。
  • AOF 持久化的写入性能通常比 RDB 持久化低,因为需要记录每条写命令。
  • AOF 持久化在数据恢复时,需要重放所有写命令,因此恢复速度通常比 RDB 慢。
  • AOF 提供了三种不同的写回策略(always, everysec, no),可以根据应用的需求进行调整。

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

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

相关文章

Polar Web【中等】反序列化

Polar Web【中等】反序列化 Contents Polar Web【中等】反序列化思路&探索EXPPHP生成PayloadGET传递参数 运行&总结 思路&探索 一个经典的反序列化问题,本文采用PHP代码辅助生成序列字符串的方式生成 Payload 来进行手动渗透。 打开站点,分析…

SpringBoot整合SpringSecurit(二)通过token进行访问

在文章:SpringBoot整合SpringSecurit(一)实现ajax的登录、退出、权限校验-CSDN博客 里面,使用的session的方式进行保存用户信息的,这一篇文章就是使用token的方式。 在其上进行的改造,可以先看SpringBoot…

力扣每日一题 6/4

3067.在带权树网络中统计可连接服务器对数目[中等] 题目: 给你一棵无根带权树,树中总共有 n 个节点,分别表示 n 个服务器,服务器从 0 到 n - 1 编号。同时给你一个数组 edges ,其中 edges[i] [ai, bi, weighti] 表示…

EKF在LiFePO4电池SOC估算中不好用?一问带你破解EKF应用难题

磷酸铁锂电池因为平台区的存在,导致使用戴维南模型EKF的方法时,无法准确进行SOC准确预估。所以最近搜索了大量关于磷酸铁锂电池SOC预估的论文、期刊,但我被海量忽略客观事实、仅为了毕业的硕士论文给震惊到了。很多论文为了掩饰平台区的存在&…

Spark的开发环境配置

1. 介绍 这里主要记录一下&#xff0c;我们常用的maven配置&#xff0c;方便后期开发配置环境&#xff0c;避免每次都从零开始配置工程。 2. 工程目录 3. pom的配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven…

12c rac dg开启日志应用报错 ora-00313 ora-00312 ora-17503 ora-15012处理

错误 当备库开启日志应用后看到告警日志报大量ora-00313\ora-00312\ora-17503等错误 处理方法 SQL> alter database clear unarchived logfile group 1; alter database clear unarchived logfile group 1 * ERROR at line 1: ORA-01156: recovery or flashback in pro…

存在d盘里的数据突然没有了?别担心,恢复方案在此

在数字化时代&#xff0c;数据存储的重要性不言而喻。然而&#xff0c;有时候我们会遭遇一些意想不到的困扰&#xff0c;比如存储在D盘的数据突然消失。这不仅可能导致重要文件的丢失&#xff0c;还可能影响我们的工作和生活。本文将探讨D盘数据消失的可能原因&#xff0c;提供…

9行超强代码用Python工具快速获取放假日期

9行超强代码用Python工具快速获取放假日期 在很多场景下,我们需要获知国内具体的节假日安排情况,而国内每一年具体的放假安排以及调休情况,都依赖于国务院发布的具体公告,如果不想自己手动整理相关数据的话,我们可以用Python来快速获取最新的放假日期. 可以通过调用公开的 API…

Kubernetes 基础架构最佳实践:从架构设计到平台自动化

本文探讨了如何将DigitalOcean Kubernetes (DOKS)应用于生产环境&#xff0c;并提供实现生产准备&#xff08;production readiness&#xff09;的指导。 规划您的基础架构 Kubernetes 基础架构的规划至关重要&#xff0c;因为它为稳定且可扩展的应用部署平台奠定了基础。通过适…

c++编译器在什么情况下会提供类的默认构造函数等,与析构函数

我们都知道&#xff0c;在 c 里&#xff0c;编写的简单类&#xff0c;若没有自己编写构造析构函数与 copy 构造函数 与 赋值运算符函数&#xff0c;那么编译器会提供这些函数&#xff0c;并实现简单的语义&#xff0c;比如成员赋值。看 源码时&#xff0c;出现了下图类似的情形…

一文搞懂 reST 和 Markdown 语法

唠唠闲话 reStructuredText (reST) 是一种在 Python 社区和文档编写中广泛使用的标记语言。相比 Markdown&#xff0c;reST 更具灵活性和强大功能&#xff0c;提供了更多的语法规则和特性。 下边我们通过对比&#xff0c;学习 reST 和 Markdown 的主要语法规则。 reST 与 Ma…

【Linux】Socket编程基础

文章目录 字节序字节序转化函数 套接字socket通用结构体通信类型名空间套接字函数socket()&#xff1a;创建套接字bind()函数&#xff1a;绑定服务器套接字与其地址、端口listen()函数&#xff1a;侦听客户连接connect()&#xff1a;连接服务器套接字accept()函数&#xff1a;服…

Elasticsearch 认证模拟题 - 14

一、题目 在集群中输入以下指令&#xff1a; PUT phones/_doc/1 {"brand":"Samsumg","model":"Galaxy S9","features":[{"type":"os", "value":"Android"},{"type":&q…

Mysqldump常用工具参数详解

mysqldump 是 MySQL 的一个非常实用的命令行工具&#xff0c;用于进行数据库的逻辑备份。以下是一些 mysqldump 的常用参数及其详解&#xff1a; –all-databases 或 -A&#xff1a; 导出所有数据库。 示例&#xff1a;mysqldump -uroot -p --all-databases > alldb_backup.…

2024年6月8日 每周新增游戏

中医百科中药: 中医百科中药是一款非常强大的中药知识科普软件&#xff0c;该应用提供500多味中草药的文献资料&#xff0c;强大的搜索功能可根据功效、特点和关键词来快速查找中药&#xff0c;而且每味中药的图片、功效、主治、炮制方法等百科知识&#xff0c;可以很好的帮助你…

关于科技的总结与思考

文章目录 互联网时代有趣的数字数据驱动大数据的两个特性数据保护互联网免费模式的再探讨平台互联网的意义人工智能伦理的思考语言理性人梅特卡夫定律冲浪的神奇之处AR的恐怖之处叙词表、受控词表和大众分类法六度/十九度的解读知识图谱是真正的仿生智能幂次法则和优先连接现代…

选择排序(直接选择排序与堆排序)----数据结构-排序②

1、选择排序 1.1 基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完就停止 。 1.2 直接选择排序 排序思想&#xff1a; ①在元素集合array[i]--array[n-1]中选择…

C++三大特性之多态

1.多态 1.1多态的概念 在面向对象方法中一般是这样表述多态性的:向不同的对象发送同一个消息&#xff0c;不同的对象在接收时会产生不同的行为(即方法)也就是说&#xff0c;每个对象可以用自己的方式去响应共同的消息。所谓消息&#xff0c;就是调用函数&#xff0c;不同的行…

【JavaSE】面向对象---多态

前言 本篇以Java初学者视角写下&#xff0c;难免有不足&#xff0c;或者术语不严谨之处。如有错误&#xff0c;欢迎评论区指正。本篇说明多态相关的知识。若本文无法解决您的问题&#xff0c;可以去最下方的参考文献出&#xff0c;找出想要的答案。 多态概念 多态&#xff08…

【小白专用】C# Task 类异步操作-浅谈

注解 Task类表示不返回值并且通常以异步方式执行的单个操作。 Task 对象是在 .NET Framework 4 中首次引入的 基于任务的异步模式 的中心组件之一。 由于对象执行的工作 Task 通常在线程池线程上异步执行&#xff0c;而不是在主应用程序线程上同步执行&#xff0c;因此可以使用…