Linux下搭建Redis一主二从的哨兵模式

一、Redis哨兵模式搭建

1、准备好三台机器,使用diap用户完成搭建

2、安装Redis

-在资源库中下载redis-7.0.8.tar.gz,分别上传到三台服务器中软件安装的目录,我这里安装到/u01下

-安装依赖。yum -y install gcc-c++(root用户执行),三台服务器都要执行

3、修改Redis配置文件

  • 将/redis-7.0.8/redis.conf复制一份到/usr/local/redis/etc中
mkdir /usr/local/redis
Mkdir /usr/local/redis/etc
cp /u01/redis-7.0.8/redis.conf  /usr/local/redis/etc
vi /usr/local/redis/etc/redis.conf
  • 修改以下内容
daemonize yes   #redis后台启动
requirepass  !QAZ3edc   #设置redis密码
bind 127.0.0.1 注释掉这行
pidfile /usr/local/redis/run/redis_6379.pid
logfile “/usr/local/redis/logs/redis.log”
dir /usr/local/redis/dbcache
masterauth !QAZ3edc #连接主机的密码
#以上内容三台机器都是一样配置,下面的内容在两台从节点上配置
slaveof 10.38.17.82 6379   #是10.38.17.82的从节点
  • 保存退出
  • 创建配置文件中修改的pid、log、dbcache文件,三台机器一样执行
mkdir /usr/local/redis/run
touch /usr/local/redis/run/redis_6379.pid
mkdir /usr/local/redis/logs
touch /usr/local/redis/logs/redis.log
mkdir /usr/local/redis/dbcache

4、启动Redis,看一主二从是否生效

进入/u01/redis-7.0.8/src,输入以下命令

./redis-server /usr/local/redis/etc/redis.conf        #三台机器同时启动redis-server
./redis-cli -p 6379             #启动主节点的客户端redis-cli
127.0.0.1:6379>auth !QAZ3edc    # 验证密码
OK
127.0.0.1:6379>info replication
role:master
connected_slaves:2
...
#说明一主二从模式搭建完毕

5、部署哨兵模式

将配置文件sentinel.conf复制到指定目录

cp sentinel.conf /usr/local/redis/etc
vi /usr/local/redis/etc/sentinel.conf 

修改以下内容,三台机器都要

Daemonize yes
pidfile /usr/local/redis/run/redis-sentinel.pid
logfile "/usr/local/redis/logs/redis-sentinel.log"
dir /usr/local/redis/tmp
sentinel monitor mymaster 10.38.17.82 6379 2	#设置redis主机IP地址,端口,选举次数
sentinel auth-pass mymaster !QAZ3edc		#设置redis主机访问密码
sentinel down-after-milliseconds mymaster 8000	#心跳检测8000毫秒,如果主机8秒内没有

创建配置中修改的pid、log、tmp文件(三台机器都要)

touch /usr/local/redis/run/redis-sentinel.pid
touch /usr/local/redis/logs/redis-sentinel.log
mkdir /usr/local/redis/tmp

6、启动哨兵模式

#进入/redis-7.0.8/src目录
./redis-sentinel  /usr/local/redis/etc/sentinel.conf  #三台机器都一样
#连接主节点的哨兵客户端
./redis-cli -p 26379 
127.0.0.1:26379>ping
PONG
127.0.0.1:26379>info sentinel
#Sentinel
Sentinel_masters:1
...
master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves:2,sentinels=3

这样哨兵模式就搭建完毕。查询当前的主节点,在哨兵模式客户端输入命令SENTINEL get-master-addr-by-name mymaster mymaster

模拟主节点宕机:用kill命令将主节点的redis-server关闭,连接从节点redis-cli客户端,观察是否从slave变为master(总有一台从节点会自动变为主节点

二、哨兵模式工作原理

2.1、哨兵模式工作原理

哨兵是Redis的一种工作模式,以监控节点状态及执行故障转移 为主要工作,哨兵总是以固定的频率去发现节点、故障检测 ,然后在检测到主节点故障时以安全的方式执行故障转移,确保集群的高可用性。

2.2、节点自动发现

这里的节点指的是其他哨兵节点和主从节点

1、自动发现数据节点(主从节点):

一般情况下,哨兵节点每隔10秒(故障转移时每隔1秒)向主从节点发送INFO命令,以此获取主从节点的信息。第一次执行时,哨兵仅知道我们给出的主节点信息,通过对主节点执行INFO命令,就可以获取其从节点列表,如此周期性执行,就可以不断发现新加入的节点

在这里插入图片描述

  • 如果INFO命令目标是从节点:哨兵从返回信息中获取从节点所属的最新主节点ip和port,如果与历史记录不一致,则执行更新
  • 如果INFO命令目标是主节点:哨兵从返回信息中获取主节点的从机列表,如果从节点是新增的,则将其加入监控列表

2、自动发现其他哨兵节点:

Redis提供了一种发布订阅的消息通信模式,即Pub/Sub,哨兵们就是通过一个约定好的通道(channel)发布/订阅hello信息进行通信。

在这里插入图片描述

  • 每隔2秒,每个哨兵会通过它监控的主节点、从节点向通道发布一条hello信息

  • 每个哨兵会通过它所监控的主节点、从节点订阅通道的信息,以此接收其他哨兵发布的信息

  • 每个哨兵都会维护其监控的主节点信息,如果它接收到其他哨兵消息后,发现自己维护的信息已经过时,则立即执行更行过程。

  • 如果哨兵接受到的信息没有在已有的监控列表中,就意味着发现了一个新的哨兵实例,此时会创建一个新的哨兵实例加入监控列表。在处理新增哨兵实例时,如果它与已存在的哨兵实例runId或者ip、port一致,将只保存最新的实例信息。

3、总结

节点发现的过程就是这样:对于数据节点采用INFO命令询问,从一个主节点得到从节点,再通过从节点检验主节点,实现数据节点发现;对于其他哨兵节点,借助正在被监控的数据节点以类似广播的方式,实现节点的发现。

2.3、故障检测

1、故障检测

故障检测是哨兵执行故障转移的前提,在知晓需要监控的目标(主从节点)后,哨兵通过PING命令实现对主从节点的故障检测。

哨兵以集群方式工作,官方建议至少要有三个节点 (一主二从节点部署哨兵模式),每个节点都以相同的方式对主从节点进行监控与故障检测。由于网络抖动或者网络分区,单个哨兵对节点的故障检测可能无法代表其真实的状态,为了降低误判,哨兵之间还需要对节点的故障状态进行协商 。所以这里需要引入两个概念:

  • 主观宕机(SDOWN):是指一个哨兵 实例通过检测发现某个主节点发生故障的一种状态、
  • 客观宕机(ODOWN):是指哨兵检测到某个主节点发生故障,通过命令SENTINEL is-master-down-by-addr 与其他哨兵节点协商,并且在指定时间内接收到指定数量的其他哨兵的确认反馈时的一种状态

简单来说,SDOWN是哨兵自己认为节点宕机,而ODOWN是不但哨兵自己认为节点宕机,而且该哨兵与其他节点沟通后,达到一定数量的哨兵都认为节点宕机

这个一定数量可以配置:

sentinel monitor mymaster xx.xx.xx.xx 6379 2

这里的 2:代表只有两个或两个以上的哨兵认为主节点不可用的时候,才会把主节点设置为ODOWN状态,然后进行failovor操作

2、Redis如何实现SDOWN和ODOWN

  • 主观宕机SDOWN

Redis以类似心跳检测的PING命令对节点进行健康检查,然后根据节点的回复情况进行状态管理。

SDOWN状态是指在sentinel down-after-milliseconds 时间内未收到节点的PING命令回复,这个是在sentinel.conf中的sentinel down-after-milliseconds mymaster配置,如

sentinel down-after-milliseconds mymaster 8000 ##心跳检测8000毫秒,如果主机8秒内没有相应,就会将主节点设置为SDOWN

SDOWN无法触发故障转移 ,仅仅说明是一个哨兵认为节点发送故障(不可用)了,若要触发故障转移,必须达到ODOWN状态

  • 客观宕机DOWN

当Sentinel将一个主节点判断为主观下线之后,为了确认这个主服务器是否真的下线 了,它会向同样监视这一主服务器的其他Sentinel进行询问,看它们是否也认为主服务器已经进入了下线状态。当Sentinel从其他Sentinel那里接收到足够数量的已下线判断之后,Sentinel就会将从服务器判定为客观下线,并对主服务器执行故障转移操作

ODOWN状态仅应用在主节点上 ,不对从节点及其他哨兵节点应用,但是SDOWN状态对他们都是有效的

2.4、故障转移

1、进入故障转移过程有几个前提:

  • 主节点为客观宕机状态
  • 当前没有故障转移在执行
  • 上次故障转移已经超时

故障转移执行过程中的核心过程主要为Sentinel Leader选举,新主节点选举,配置其他从节点

2、Sentinel Leader选举

当一个主节点被判断为客观下线时,监控这个主节点的所有Sentinel会进行协商,选举一个Leader对下线的主节点执行故障转移操作 。故障检测是多个Sentinel同时执行 的,也就是说可能多个Sentinel在相近的时间内都判定主节点客观宕机了,因此Leader的选举过程在Sentinel集群内可能是同步进行的。所以,Sentinel需要在集群内进行“拉票”,“拉票”的依据就是配置纪元及“拉票”的时间。配置纪元越大,优先级越高;“拉票”请求越早,优先级越高

  • 当Sentinel判断主节点客观下线后,会把自己的配置纪元加1,未检测到主节点ODOWN或检测慢的,自然落后于当前纪元

  • Sentinel会使用Sentinel is-master-down-by-addr命令向其他所有Sentinel发起投票请求,与故障检测过程中的“询问“不同,这里的runId将被设置为当前Sentinel的runId,epoch为最新的纪元。

  • 其他Sentinel接收到“投票”请求后,执行以下过程:

    • 请求纪元大于自身配置纪元 ,则更新替换;若监控主节点的配置纪元小于请求纪元,则更新替换,并“投票”给发起请求的Sentinel 。这个过程是抢占式的,同一纪元,先到先得。(Redis命令处理是单线程,无并发冲突)。
    • 根据判断结果,回复“投票”请求:回复内容为该Sentinel选举的Leader的runId。
  • Sentinel接收并处理Sentinel is-master-down-by-addr回复:把投票结果(runId)更新到该Sentinel的节点信息中。

投票结束,进行统计结果。该过程是在SENTINEL_FAILOVER_STATE_WAIT_START状态下执行的。Sentinel会遍历当前主节点下所有的Sentinel节点,把它们的投票信息进行统计;然后判断是否有Sentinel胜出。这里胜出的条件是:

  • Sentinel必须获取集群内大多数Sentinel的选票,即票数大于50% (防止“脑裂“出现两个leader);
  • Sentinel所获票数必须大于等于法定人数 (quorum);(配置文件中设置的)

3、新主节点选举

选举出Sentinel Leader后,Sentinel Leader会从该宕机的主节点的存活的从节点中选出一个新的主节点。首先,按照一下条件剔除从节点:

  • 主观宕机(SDOWN)或与处于断线状态的从节点;
  • 最近5秒内未回复过Sentinel Leader INFO命令的从节点;
  • 从节点的优先级为0的从节点,由配置项replica-priority决定;
  • 与主节点断开连接超过10倍down-after-milliseconds的从节点;

然后按照以下规则选择新的节点:

  • 选择replica-priority最低的节点。如果存在相同,则继续;
  • 选择复制偏移量最大的的从节点。如果存在相同,则继续;
  • 选择runId最小的从节点;

选出新的主节点之后,Sentinel Leader会向它发送slaveof NO ONE ,把这个从节点转为主节点(这是在从节点自身来看的角色转换)。

从节点接收slaveof NO ONE命令后,会重置其主节点信息,断开与其主节点、从节点的网络连接,重置其复制ID,并执行持久化重写操作。

4、配置其他从节点

新的主节点已经配置完成,接下来就是要让其他存活的从节点以该节点为主节点,然后向该节点发起主从复制,该过程原理比较简单:遍历原主节点的从节点,向这些从节点发送slaveof 命令

这样故障转移过程就完成。新的主节点也诞生。

5、注意:

Sentinel从不移除从节点,即使很长时间都不可用。这一点是非常有用的,因为当发生网络分区或者故障后,Sentinel需要正确的对恢复节点进行重新配置。经过故障转移,旧主节点将以从节点的角色加入集群 ,Sentinel会对他进行重新配置,让它从新的主节点执行主从复制。即使旧的主节点恢复,仍然是以从节点的身份加入集群,不再是主节点。

脑裂问题:redis的主从模式下脑裂是指因为网络问题,导致redis 主节点跟从节点和Sentinel集群处于不同的网络分区 ,此时因为Sentinel集群无法感知到 主节点的存在,就会将某一个从节点提升为主节点。此时就存在两个不同的主节点 ,就像一个大脑分裂成了两个。

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

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

相关文章

vue onlyoffice在线编辑与预览,文件无法保存问题,始终打开同一文件的问题

主要写一下前端vue的使用&#xff0c;需要后端或运维去弄docker服务&#xff0c;然后给前端一个api地址 在vue的Index.html页面添加这个 <script type"text/javascript" src"http://docker服务器ip:docker服务器端口/web-apps/apps/api/documents/api.js&q…

智能优化算法应用:基于鼠群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鼠群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鼠群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鼠群算法4.实验参数设定5.算法结果6.参考文献7.MA…

【网络安全】—Shell编程入门(1)

文章目录 基础变量概念介绍特殊变量进阶数值计算实践条件测试比较条件判断语句流程控制语句循环语句应用 Shell 是 Unix/Linux 操作系统下的一种命令行解释器&#xff0c;它接收用户输入的命令然后调用相应的程序。我们可以通过 Shell 脚本来自动执行一系列的命令。接下来&…

Logback简介与配置详解

在开发和维护Spring Boot应用程序时&#xff0c;一个强大而灵活的日志框架是至关重要的。Spring Boot默认集成了Logback&#xff0c;一个高性能的Java日志框架。本文将介绍如何配置Logback以满足你的日志记录需求。 Logback简介 官方网址&#xff1a;https://logback.qos.ch/ …

【C++进阶】继承

一、继承的基本概念及定义 1.1 继承的概念 继承的本质是代码的复用 比如&#xff1a; 学校的师生管理系统 有学生、老师、宿管阿姨等 每个人都有的信息名字、电话 身份证号、年龄、性别等 我们可以发现有些类型是具有共性的 如果每个类都去写&#xff0c;初始化时每个 都要初…

Vault实战(一)-Vault介绍

1 Vault介绍 Vault 是一个基于身份的秘密和加密管理系统。秘密是您想要严格控制访问的任何内容&#xff0c;例如 API 加密密钥、密码和证书。 Vault 提供由身份验证和授权方法控制的加密服务。使用 Vault 的 UI、CLI 或 HTTP API&#xff0c;可以安全地存储和管理、严格控制&a…

FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持

目录 1、前言LeNet-5简洁基于Zynq7020 的设计说明PL 端 FPGA 逻辑设计PS 端 SDK 软件设计免责声明 2、相关方案推荐卷积神经网络解决方案FPGA图像处理方案 3、详细设计方案PL端&#xff1a;ov7725摄像头及图像采集PL端&#xff1a;图像预处理PL端&#xff1a;Xilinx推荐的图像缓…

ASO优化实践经验和改进措施

在积累了大量的实战经验后&#xff0c;小柚总结了一些关于ASO优化的经验给大家分享。共同进步&#xff01;共同学习&#xff01;Fighting&#xff01; 一、关键词研究 关键词研究是ASO优化的基础。在进行关键词研究时&#xff0c;需要了解用户搜索意图、关键词竞争情况和关键…

1265. 数星星(树状数组/蓝桥杯)

题目&#xff1a; 输入样例&#xff1a; 5 1 1 5 1 7 1 3 3 5 5输出样例&#xff1a; 1 2 1 1 0 思路&#xff1a; 树状数组 代码&#xff1a; #include<cstdio> #include<iostream> using namespace std; const int N32010; int n; int tr[N],level[N];int lo…

linux:掌握systemctl命令控制软件的启动和关闭、掌握使用ln命令创建软连接

掌握使用systemctl命令控制软件的启动和关闭 一&#xff1a;systemctl命令&#xff1a; Linux系统很多软件(内置或第三方)均支持使用systemctl命令控制:启动停止、开机自启 能够被systemctl管理的软件一般也称之为:服务 语法: systemctl | start | stop | status | enable …

Qt Q_DECL_OVERRIDE

Q_DECL_OVERRIDE也就是C的override&#xff08;重写函数&#xff09;&#xff0c;其目的就是为了防止写错虚函数,在重写虚函数时需要用到。 /* 鼠标按下事件 */ void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; 参考: Qt Q_DECL_OVERRIDE - 一杯清酒邀明月 - 博客…

Mybatis复习总结

MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发 MyBatis本是Apache的一个开源项目&#xff0c;2010年这个项目由apache迁移到了Google&#xff0c;并且改名为 Mybatis&#xff0c;2013年11月迁移至Github。 持久层 指的就是数据访问层&#xff0c;用来操作数…

数组指定部分逆序重放

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

基于ssm物资进销存论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本货物进销管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

C#中HttpWebRequest的用法

前言 HttpWebRequest是一个常用的类&#xff0c;用于发送和接收HTTP请求。在C#中使用HttpWebRequest可以实现各种功能&#xff0c;包括发送GET和POST请求、处理Cookie、设置请求头、添加参数等。本文将深入介绍HttpWebRequest的用法&#xff0c;并给出一些常见的示例。 目录 前…

Java面试总结——集合篇

摘自javaguide的集合总体框架图&#xff1a; List, Set, Queue, Map 的区别 List&#xff1a;底层基于object[]数组&#xff0c;存储的元素有序、可重复。 Set&#xff1a;底层基于HashMap实现&#xff0c;存储的元素无序&#xff0c;不可重复。 Queue&#xff1a;单…

科研院校和研究所都在用功率放大器做哪些实验

科研院校和研究所在科研工作中常常使用功率放大器进行实验。功率放大器是一种电子设备&#xff0c;其主要功能是将输入信号的功率增加到预定的输出功率水平&#xff0c;并保持信号的波形不失真。它在各个学科领域都有广泛的应用&#xff0c;包括通信、无线电、雷达、生物医学等…

vue3 使用<script lang=“ts“ setup>加上lang=“ts“后编译错误

报错信息 报错原因 加上了langts解决 下载typescript和loader npm install typescript ts-loader --save-dev配置vue.config.js 添加下面的代码 configureWebpack: { resolve: { extensions: [".ts", ".tsx", ".js", ".json"] }…

Axure中继器的使用

一.中继器介绍 在Axure中&#xff0c;中继器&#xff08;Relays&#xff09;是一种功能强大的元件&#xff0c;可以用于创建可重复使用的模板或组件。中继器允许您定义一个主要的模板&#xff0c;并在页面中重复使用该模板的实例。以下是中继器的作用和优缺点&#xff1a; 作…

2023 英特尔On技术创新大会直播 |我感受到的AI魅力

文章目录 前言英特尔技术创新大会 的来历芯生无限 赋能AI创新后记 前言 近年来&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff09;的应用与发展呈现出爆发式增长的态势&#xff0c;成为科技领域最为引人注目的热门话题之一。作为全球领先的半导体公司&…