Redis 主从复制,哨兵,集群——(2)哨兵篇

目录

1. Redis 哨兵是什么?

2. Redis 哨兵有什么用?

2.1 主动监控

2.2 消息通知

2.3 故障转移

2.4 配置中心

3. Redis 哨兵数量配备要求

4. 哨兵配置文件详解

5. quorum 投票数详解

5.1 quorum 的含义

5.2 网络抖动导致主观下线

5.3 quorum 票数达到设定值客观下线

6. 最好让所有 redis 服务器密码一致

7. 什么是 leader 哨兵领导者

8. Raft 算法选举 leader 哨兵领导者

9. leader 选取新 master 的规则

10. 从机变成 master 的过程?

11. 解答哨兵数量配备问题

12. 哨兵的使用建议


前提须知,本篇是 Redis 主从复制,哨兵,集群三板斧的第二篇,建议同学先阅读过主从复制篇,再来观看哨兵篇,想必你会有更好的理解哦!如果你已经懂了主从复制原理,可以直接看正文。

Redis 主从复制,哨兵,集群——(1)主从复制篇-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_70325779/article/details/133878404?spm=1001.2014.3001.5502

1. Redis 哨兵是什么?

哨兵就像一个看守者,看守某个东西,在 Redis 中哨兵就是来看守服务器的状态的。

我们上一篇主从复制篇中提到过,在主从复制服务器中,主服务器宕机了,从服务器不会上位,而是一直等待主服务器恢复正常,但是从服务器又没有写数据的权限,就会导致整个业务面临中断甚至崩溃。所以我们就需要想一个办法,在 master 主服务器宕机无法对外提供服务的时候,从 slave 从服务器中挑选一个新的 master 继续对外提供服务,保证我们业务的正常运行。

那么谁来做这件事呢?就是我们的本篇文章重点要说的 "哨兵"。

2. Redis 哨兵有什么用?

2.1 主动监控

哨兵可以监控主从 Redis 数据库运行是否正常;

2.2 消息通知

哨兵可以将故障转移的结果发送给客户端,让我们的运维人员知道哪台 redis 服务器可能出现了故障,以便于及时恢复;

2.3 故障转移

如果 master 主服务器发生了异常,那么哨兵就会自动进行主从切换,将其中一个 slave 从服务器作为新的 master 主服务器继续对外服务;

2.4 配置中心

客户端通过连接哨兵来获得当前 Redis 服务的主节点地址;

3. Redis 哨兵数量配备要求

在企业配备 Redis 哨兵的时候,也是有默认要求的,那就是 Redis 哨兵的数量不要少于三台并且必须是奇数台。如果不能满足以上要求,干脆就不要用哨兵,因为会有潜在风险。为什么哨兵的数量要选择奇数,这和 Raft 算法选举 leader 哨兵领导者有关,下面我会专门讲到,这也是一个面试考点。

4. 哨兵配置文件详解

我们在安装 redis 之后它就已经给我们配备了哨兵的配置文件,就存放在 Redis 安装目录下,各位同学可以打开自己的 Redis 安装文件夹,如下所示,我使用 ls 命令展示我 redis-6.2.6 的所有文件,这里可以看到 redis.conf 配置文件,sentinel.conf 哨兵配置文件 等

在面试和工作中,几乎很少会让你配置哨兵的配置信息,一般都会提前设定好,直接粘贴进 redis 的配置文件即可,但关于配置文件的各种配置的作用各位还是要记清楚的。

[root@localhost redis-6.2.6]# ls
00-RELEASENOTES  CONDUCT       COPYING  INSTALL   MANIFESTO  redis.conf  runtest          runtest-moduleapi  sentinel.conf  tests   utils
BUGS             CONTRIBUTING  deps     Makefile  README.md  redis.log   runtest-cluster  runtest-sentinel   src            TLS.md

在 Redis 哨兵配置文件 sentinel.conf 中,有几个比较重要的配置项,我拿出来放到下边。

1:bind:0.0.0.0;

2:daemonize yes (yes开启表示后台运行);

3:protected-mode no(no 表示关闭保护模式);

4:port 26379 (26379为哨兵服务器端口,6379为 redis 服务器端口,两者不一样,各位同学要分清哦!);

5:logfile "文件路径"(logfile为哨兵日志文件,和redis日志文件不是同一个,后面双引号内部可以自定义日志文件路径);

6:sentinel monitor <mastername> <ip> <redis-port> <quorum> 

mastername 为主机名,可自定义设置,IP 就是要监控的主机IP,redis-port 就是主机的端口号,quorum 为投票数

举例如 sentinel monitor mymaster 121.41.67.181 6379 2

7:sentinel auth-pass <mastername> <password>

mastername 就是主机名称,和上面的保持一致,password 为监控主机的密码;

举例如 sentinel auth-pass mymaster 123456

5. quorum 投票数详解

5.1 quorum 的含义

在上面第四点我重点标注了 quorum 为投票数,这是我们理解哨兵机制必须要掌握的一个知识点。

总结为一句话就是,"至少有 quorum 个哨兵认为 master 主机该下线的时候,master 主机就要客观下线并进行故障转移"。

5.2 网络抖动导致主观下线

我们知道网络是不太可靠的,而哨兵与主机之间又是通过网络发送心跳包来确认主机是否还在正常运行。在 sentinel.conf 配置文件中有这一配置项,可以自定义配置时长,假设为 30s,如果网络抖动导致丢包,又或是 master 主机真的出现了问题,导致一个哨兵在 30s 时间内应该收到 master 主机发送过来的心跳反馈但实际却没有收到,那么当前这台哨兵就会认为主机可能已经发生故障了,当前哨兵就会对它投票认为它出故障该下线了换新的服务器上线作为主机,但实际这台主机还没有下线,只是当前这一台没有接收到心跳包的哨兵服务器认为它出故障该下线了,这就是主观下线(Subjectively Down)

下面这一段是我从 sentinel.conf 配置文件中摘下来的关于主观下线的部分注释和配置,上面是这段英文的翻译

主服务器(或任何附加的副本或哨兵)应达到的毫秒数
# 无法访问(例如,不接受对 PING 的回复,连续,对于
# 指定时间段),以便将其视为处于S_DOWN状态(主观上
# 向下线)。# Number of milliseconds the master (or any attached replica or sentinel) should
# be unreachable (as in, not acceptable reply to PING, continuously, for the
# specified period) in order to consider it in S_DOWN state (Subjectively
# Down).# sentinel down-after-milliseconds <master-name> <milliseconds> // 配置示例
# Default is 30 seconds.   // 从配置文件中不难看出 redis 默认是 30 秒
sentinel down-after-milliseconds mymaster 30000
5.3 quorum 票数达到设定值客观下线

我们假设每台哨兵只能投一票,quorum 为投票数,如果三台哨兵中有哨兵都没有收到 master 主机发送过来的心跳包,那么当前哨兵就会与其余两台哨兵进行协商沟通,没有收到心跳包的哨兵会投一票给当前 master,认为它已经挂了,如果三台哨兵有两台哨兵都分别投了一票,此时已经有两票了认为 master 已经挂了,而我们设置的 quorum 正好是 2,已经达到下线要求了;就算剩余的一台哨兵能收到主机发送的心跳包,没有进行投票,但是少数服从多数,两台哨兵都认为主机已经出故障该下线了,那么主机就要下线。

我设置 3 台哨兵,quorum 值应该设置为 2,超过一半;

如果有 5 台哨兵,quorum 值至少应该设置为 3,超过一半;

如果有 7 台哨兵,quorum 值至少应该设置为 4,超过一半;

少数服从多数,至少要一半以上的哨兵都认为主观下线了,主机才能真正客观下线(Objectively Down),不能说一套烧饼认为master该下线了就真的让它下线,只要没有达到 quorum 都只是主观下线,没有真的下线。

6. 最好让所有 redis 服务器密码一致

我们在做主从复制架构的时候,所有从机都要配置主机的密码,主机不需要配置。但现在如果我们加入了哨兵机制,主机也要配备密码,并且不管主机还是从机,密码最好保持一致。

原因如下:

(1)一旦当前 master 主机挂了,slave从机 会重新选举新的服务器作为主机,如果配置文件内的主机密码与新选举出来的主机密码不一致,则新选举的主机会拒绝访问;

(2)再者,原来下线的主机重新上线之后,就会变成从机,在访问新主机就需要知道新主机的密码,否则也会拒绝访问,所以建议所有 redis 服务器密码设置为一样的;

7. 什么是 leader 哨兵领导者

以下是 sentinel.conf 配置文件中关于 leader 哨兵领导者选举的部分注释。

# Note that whatever is the ODOWN quorum, a Sentinel will require to
# be elected by the majority of the known Sentinels in order to
# start a failover, so no failover can be performed in minority.

翻译过来的大致意思就是,"一旦主节点已经被哨兵集群投票并通过认定当前 master 已经主观下线了,那么哨兵内部就会选举出一个哨兵领导 leader,然后由 leader 进行新的 master 节点选取和故障转移。"所以一定要分清,新的 master 服务器是由哨兵集群中选出来的 leader 选举的,由 leader 确定 master

为什么会有 leader 呢?很好理解,假如说现在 master 主机挂了,要重新选择一个 master,谁来选呢?三个哨兵发生争吵怎么办,哨兵A说凭什么你来选,我能力强我来选,哨兵B说我能力强我来选,哨兵C说我能力更强我来选,你们两个退后。

所以在选取新的 master 之前,哨兵内部会先选出一个 leader 哨兵领导者,由 leader 领导者选取新的从服务器作为 master。

8. Raft 算法选举 leader 哨兵领导者

Raft 算法底层其实非常的复杂,这里我做了相应的简化,想深入了解的同学可以搜索相关的资料。

如下图,Raft 算法的核心思想就是先到先得并且一个哨兵只能投一票,以下图为例,

(1)sentinel1 哨兵给 sentinel2 和 sentinel3 分别发送信息,说我想当领导,你们两个都投我;

(2)sentinel2 接收到了 sentinel1 的投票请求,投了 sentinel1 一票,但 sentinel2 自己也想当领导, sentinel2 给 sentinel1 和 sentinel3 发信息说你们两个投我也想当领导;

(3)sentinel3 在接收到了 sentinel1 和 sentinel2 的投票请求后,因为 sentinel3 先接收到了sentinel1 的投票请求,所以 sentinel3 将自己的票投给了 sentinel1,当接收到 sentinel2 的投票请求后,就不能再给 sentinel2 投票了,因为它已经投过票了;但是 sentinel3 它也想当领导,就给 sentinel1 和 sentinel2 发投票请求让他们两个也投我票;

(4)sentinel1 接收到了 sentinel2 和 sentinel3 的投票,自己有两票,又接收到了 sentinel2 的投票请求,于是 sentinel1 将自己的一票投给了 sentinel2,当再次接收到 sentinel3 的投票请求时,就不能重复投票;

(5)经过投票之后,sentinel1获得了两票,sentinel2获得了一票,sentinel3获得了0票,恭喜sentinel1 称为 leader 哨兵领导者;

(6)注意一点,在实际 leader 选取过程中,过程并不一定是我上述的样子,我列举的只是其中一种情况,也有可能 sentinel2 票最多,也有可能 sentinel3 最多,就看谁先获得投票反馈了;

9. leader 选取新 master 的规则

接上一小节,leader 选取完毕之后,sentinel1 就会从 slave 从服务器中选取一个作为新的 master 主机,而 slave 从服务器也是一样的,凭什么都是 slave 从服务器,它就能当 master 做我的老大,我要当老大,我不服它。

因此,leader 哨兵选取有一定的规则,自然而然新的 master 选取也是有规则的嘛。

新 master 的选取规则主要看三点,

(1)首先第一点:看谁的优先级更高。

虽然都是从服务器,但它们自己的 sentinel.conf 配置文件内还有一个优先级属性,slave-priority或replica-priority,redis6版本和redis7版本名字不太一样,但代表的含义都是一样的,我们可以对不同的从服务器优先级属性进行配置,谁的优先级高,谁就会优先被选举为新的 master。

(2)其次第二点:如果优先级都一样大,再看谁的复制偏移量最大

举个例子,slave 从服务器会同步 master 主服务器上的数据,假设 master 在挂掉之前一共有10个数据,slave从服务器A也许因为网络波动只同步过来 9 个数据,丢失了一个。而slave从服务器B把 10 个数据全都同步过来了。那么A的偏移量就是9,B的偏移量就是10;明显B比A能力更强,并且升级为 master 花费的资源更少,而A在同步时还要再添加一条数据,需要花费更多资源,所以理所当然B更有资格也更适合成为新的 master。

(3)最后第三点:如果优先级一样大,偏移量也一样,最后比较RunID的ASCLL码

每个从机服务器都是一个单独的服务嘛,那它就有一个独一无二的运行ID,比较各个从服务器的ASCLL码,谁小谁就当新的 master 主机。

10. 从机变成 master 的过程?

OK,leader经过了三条规则的筛选之后,就能从众多从服务器中确定出来哪个做新的 master了,确定好了之后,还要经过下面的步骤才能彻底完成 master 的选取到完成。

(1)leader会对新选举出来的 master 执行 slaveof no one 命令使其独立为master;

(2)leader 对其他的 slave 从服务器发送命令,让剩余的 slave 变成新 master 的 slave;

(3)之前下线的老 master 重新上线之后,就不再是 master了,leader 会将其降级为 slave,变成新 master 的 slave从机;

11. 解答哨兵数量配备问题

问题一,为什么哨兵不能是一台?

因为哨兵本身它也是一个服务器,如果哨兵出现故障挂了,同时 Redis 主机也出现了故障挂了,那么就没有人能来看守并选出新的主master数据库了,会导致我们的哨兵失效,业务可能面临中断甚至崩溃。

问题二,为什么不能是两台?

从刚才的 Raft 算法中可以看出,如果是两台哨兵,互相投票,最后统计的时候都是一票,还是无法选出 leader,所以两台哨兵的做法不可取。

问题三,为什么哨兵必须是奇数台?

为了方便投票,和刚才的问题二一样的原理,如果有偶数台机器,两两之间互相投票,到最后很有可能会有多台哨兵得票数相等,无法选出最终的 leader,但如果我们采用奇数台哨兵,则可以大大降低无法选出 leader 的情况发生。

12. 哨兵的使用建议

(1)哨兵数量是少在三个以上并且为奇数;

(2)哨兵配备在不同的服务器,硬件最好保持一致,不要这台哨兵的服务器16GB内存,那台哨兵32GB内存,最好保持一致,避免外界环境对我们的 master 选举造成不必要的干扰;

(3)生产过程中经常会使用 Docker 容器化技术部署哨兵集群,一定一定一定要注意端口正确映射;

(4)哨兵集群+主从复制并不能完全保证数据不丢失,因为老 master 下线到新 mater 选举到上线期间是有一定的延迟的,或许几秒,或许几十秒,在此期间我们的 redis 只能对外提供读的业务,不能写数据,所以如果有写数据操作,数据会丢失。

(5)主从复制+哨兵集群的这种方式虽然不错,但还是有一定的局限性,那最典型的来说,只能有一个 master 主机对外提供 写数据操作,至于 slave 从机只能进行读数据操作,一旦用户量增大,单台 master 极有可能承受不了巨大的用户访问量,所以就有集群,在集群中,可以设置多台 master,也多台 slave,同时集群内部自带哨兵机制,不需要我们自己配,非常方便,redis 集群我写了另外一篇文章,感兴趣的小伙伴可以跳转观看。

Redis 主从复制,哨兵,集群——(3)集群篇-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_70325779/article/details/133890063?spm=1001.2014.3001.5502

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

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

相关文章

云计算与云服务

云计算与大数据 1、虚拟化简介1.1、什么是虚拟化1.2、虚拟化的分类 2、云计算与云服务2.1、云计算2.2、云服务2.3、云计算的特点 3、云服务模式&#xff08;IaaS、PaaS、SaaS和DaaS&#xff09;4、云计算分类&#xff08;公有云、私有云和混合云&#xff09; 1、虚拟化简介 当下…

ToDoList全局事件总线学习笔记

全局事件总线 全局事件总线&#xff1a;任意组件间通信 安装全局事件总线 new Vue({……beforeCreate(){Vue.prototype.$busthis},…… })使用事件总线 接收数据&#xff1a;A组件想接收数据&#xff0c;则在A组件中给$bus绑定自定义事件&#xff0c;事件的回调留在A组件自…

react 学习 —— 16、使用 ref 操作 DOM

什么时候使用 ref 操作 DOM&#xff1f; 有时你可能需要访问由 React 管理的 DOM 元素 —— 例如&#xff0c;让一个节点获得焦点、滚动到它或测量它的尺寸和位置。在 React 中没有内置的方法来做这些事情&#xff0c;所以你需要一个指向 DOM 节点的 ref 来实现。 怎么使用 r…

vue3里面vant组件的标签页使用?

一、绑一个v-model事件 二、让activeName的初始为0也就是默认是显示第一个标签页的下标 三、给标签页下面的东西进行一个判断 想让哪个优先显示就把哪个判断作为初始值存入

【逆向】Base64编码解码及逆向识别

示例代码 注意&#xff1a;该示例代码仅为Base64编码实现的其中一种&#xff0c;实际分析样本的Base64编码实现并不一定与此代码相同&#xff0c;读者应重点理解其原理部分&#xff0c;而忽略其实现形式的不同。 View Code 逆向识别 1、编码识别 2、解码识别 总结 1、识别代…

使用AI编写测试用例——详细教程

随着今年chatGPT的大热&#xff0c;每个行业都试图从这项新技术当中获得一些收益我之前也写过一篇测试领域在AI技术中的探索&#xff1a;软件测试中的AI——运用AI编写测试用例现阶段AI还不能完全替代人工测试用例编写&#xff0c;但是如果把AI当做一个提高效率的工具&#xff…

微信小程序之个人中心授权登录

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 &#xff0c;越幸运。 1.了解微信授权登录 微信登录官网&#xff1a; 小程序登录https://developers.weixin.qq.com/miniprogram/d…

2023Jenkins连接k8s

首先配置k8s config文件 1.方式获取k8s密钥 cat .kube/config 2.导出方式或者密钥 kubectl config view --raw > k8s-config-admin pipeline {agent {kubernetes {yaml apiVersion: v1kind: Podmetadata:labels:some-label: devopsspec:containers:- name: dockerimage: d…

【广州华锐互动】建筑安全事故VR沉浸式体验系统

在建筑行业中&#xff0c;安全永远是首要的考虑因素。传统的安全培训方法&#xff0c;如书本教学、现场演示等&#xff0c;虽然能在一定程度上提高员工的安全意识&#xff0c;但这些方法往往缺乏实际体验&#xff0c;员工在真正面临危险时可能无法做出正确的判断和反应。近年来…

【Axure高保真原型】可视化图表图标

今天和粉丝们免费分享可视化图表图标原型模板&#xff0c;包括柱状图、条形图、环形图、散点图、水波图等常用的可视化图表图标。 【原型效果】 【原型预览】 https://axhub.im/ax9/d402c647c82f9185/#c1 【原型下载】 这个模板可以在 Axure高保真原型哦 小程序里免费下载哦…

自然语言处理---Transformer机制详解之Self attention机制详解

1 Self-attention的特点 self-attention是一种通过自身和自身进行关联的attention机制, 从而得到更好的representation来表达自身. self-attention是attention机制的一种特殊情况&#xff0c;在self-attention中, QKV, 序列中的每个单词(token)都和该序列中的其他所有单词(to…

STM32cubemx对FreeRTOS的适配(工程模板配置)

文章目录 前言一、工程的创建二、什么是CMSIS三、STM32cubemx生成的FreeRTOS工程分析总结 前言 本篇文章将带大家使用STM32cubemx对FreeRTOS进行工程模板的配置。 一、工程的创建 1.开始工程的创建&#xff1a; 2.芯片型号选择&#xff1a; 3.修改时钟为TIM8&#xff1a; …

阶段七-Day01-Spring01

一、Spring框架介绍 1. 介绍 Spring Framework是由Spring团队研发的模块化、轻量级开源框架。其主要目的是为了简化项目开发。 Spring Framework前身是interface21&#xff0c;由Rod Johnson于2002年研发&#xff0c;主要是为了不使用EJB下依然能够构建高质量Java EE项目。E…

6.(vue3.x+vite)路由传参query与params区别

前端技术社区总目录(订阅之前请先查看该博客) 效果截图 一:路由传参有两种方式:params与query params与query区别 1:param,路由带“/”,query带“?” 2:query传过来的参数会显示到地址栏中 而params传过来的参数可以显示参数或隐藏参数到地址栏中(vue-router 4.1.4不…

IK分词器如何修改支持跨版本ES

一、问题描述&#xff1a;IK分词器版本和ES版本不一致&#xff0c;无法找到和自己ES版本匹配的分词器。 IK分词器&#xff0c;提供的插件版本&#xff0c;远赶不上ES的更新版本&#xff0c;在使用过程中&#xff0c;不一定能顺利的找到与自己使用的ES版本相对应。在ES集群中使用…

【网络安全 --- xss-labs靶场通关(1-10关)】详细的xss-labs靶场通关思路及技巧讲解,让你对xss漏洞的理解更深刻

靶场安装&#xff1a; 靶场安装请参考以下博客&#xff0c;既详细有提供工具&#xff1a; 【网络安全 --- xss-labs靶场】xss-labs靶场安装详细教程&#xff0c;让你巩固对xss漏洞的理解及绕过技巧和方法&#xff08;提供资源&#xff09;-CSDN博客【网络安全 --- xss-labs通…

物证管理系统|智物证DW-S404是一套成熟系统

系统背景 我司物证智能管理系统&#xff08;智物证DW-S404&#xff09;是一套成熟系统&#xff0c;依托互3D技术、RFID技术、数据库技术、AI、视频分析技术对物证进行统一管理、分析的信息化、智能化、规范化的系统。 物证是公安或者监狱处理案件的关键凭证&#xff0c;针对过…

人工智能(5):深度学习简介

1 深度学习 —— 神经网络简介 深度学习&#xff08;Deep Learning&#xff09;&#xff08;也称为深度结构学习【Deep Structured Learning】、层次学习【Hierarchical Learning】或者是深度机器学习【Deep Machine Learning】&#xff09;是一类算法集合&#xff0c;是机器学…

【CSS】使用 CSS 实现一个宽高自适应的正方形

1. 利用 padding 或 vw <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><metaname"viewport"content"widthdevice-width, initial-scale1.0"><title>Document</title><st…

Java File与IO流学习笔记

内存中存放的都是临时数据&#xff0c;但是在断电或者程序终止时都会丢失 而硬盘则可以长久存储数据&#xff0c;即使断电&#xff0c;程序终止&#xff0c;也不会丢失 File File是java.io.包下的类&#xff0c;File类的对象&#xff0c;用于代表当前操作系统的文件(可以是文…