Redis分布式系统:哨兵机制

“普通到不普通的人,哭着笑着的人~” 


        Redis在主从复制的机制下,一旦主节点出现了故障宕机,不能提供服务后。就需要人工进行主从切换,重新从各从节点中选取新的主节点。同时大量的应用方请求被通知切换到新的主节点上。 

        当然,上述的一系列操作都是谁要去维护处理的?程序员。只要是人工处理,就有可能出现人工的失误。加之如果处理过程繁琐,浪费的时间也会随之增加。显然,恢复处理过程中的时间开销过长,这对于Redis而言是不能接受的。

——前言

基本概念

        由于Redis中出现了多种名词,所以我们在介绍哨兵Sentinel之前,对一些看过的名词作一定的解释。

名词
逻辑结构
物理结构
主节点
Redis 主服务
⼀个独⽴的 redis-server 进程
从节点
Redis 从服务
⼀个独⽴的 redis-server 进程
Redis 数据节点
主从节点         
主节点和从节点的进程
哨兵节点
监控 Redis 数据节点的节点
⼀个独⽴的 redis-sentinel 进程
哨兵节点集合
若⼲哨兵节点的抽象组合
⼀个独⽴的 redis-sentinel 进程
Redis 哨兵(Sentinel)
哨兵节点集合 和 Redis 主从节点
哨兵节点集合 和 Redis 主从节点
应⽤⽅
泛指⼀个多多个客⼾端
一个或多个连接 Redis 的进程

        Redis Sentinel是Redis当中实现高可用的方案,在实际的⽣产环境中,对提⾼整个系统的⾼可⽤是⾮常有帮助的。

哨兵架构

      

        Redis Sentinel 相⽐于主从复制模式是多了若⼲Sentinel 节点,⽤于实现监控数据节点。哨兵节点会定期监控所有节点(包含数据节点和其他哨兵节点)。针对主节点故障的情况,故障转移流程⼤致如下:

1)主节点故障,从节点同步连接中断,主从复制停⽌。

2)哨兵节点通过定期监控发现主节点出现故障。哨兵节点与其他哨兵节点进⾏协商,达成多数认同主节点故障的共识。
3)哨兵节点之间使⽤ Raft 算法选举出⼀个领导⻆⾊,由该节点负责后续的故障转移⼯作。
4)哨兵领导者开始执⾏故障转移:从节点中选择⼀个作为新主节点;让其他从节点同步新主节点;通知应⽤层转移到新主节点
通过上面介绍,我们可以看出Redis Sentinel 具有以下的几个功能:
监控: Sentinel 节点会定期检测 Redis 数据节点、其余哨兵节点是否可达
故障转移: 实现从节点晋升(promotion)为主节点并维护后续正确的主从关系。
通知: Sentinel 节点会将故障转移的结果通知给应⽤⽅。
在Redis分布式系统中,应当尽量避免“单机”,更多的是推崇“冗余”。这种冗余体现在主从复制模式下,每个节点所存储的信息是一致的,是在哨兵机制下,使用由奇数个哨兵节点组成的节点集合,完成对数据节点的监控。既是提升了“单机”下,性能的不足,也提高了系统的高可用性。
        

搭建哨兵架构

为什么使用docker?

        我们现在需要用到三个Redis数据节点和三个Sentinel哨兵节点,这六个节点需要放在不同的服务器上。可是,迫于无奈我们现目前只有一台机器,我们只能将这些环境部署在这一台资源少得可怜的服务器上。

        当然,配置这些节点的过程也十分繁琐,各个节点所依赖的端口号\配置文件\数据文件多需要严格独立一份,这可以参考上篇的主从模式结构的配置。

        采用虚拟机,也未尝不是一个解决方案,但是碍于一些云服务器的配置低,效果不是很好,还可能让你的服务器连接挂掉。

        docker可以视为“轻量级”虚拟机,起到了同虚拟机相似的资源隔离的效果,并且对硬件要求并不高,我们可以借此搭建出多个相似的虚拟环境,来模拟将Redis部署在不同服务器上的场景。

                

安装部署

1) 安装docker-compose 和 docker

        因为我们会在linux的机器里创建多个docker,当我们对docker中不同的redis服务器操作时, 为了避免一个一个地进行,我们可以借助docker-compose进行统一操作。

# centos
yum install docker-compose# ubuntu
apt install docker-compose

2)停止之前的redis

# 停止redis
service redis-server stop# 停止 redis-sentine (如果有)
service redis-sentinel stop

3) 使用docker获取redis镜像        

docker pull redis:5.0.9

        这里类似于git pull,使用git从中央代码仓库中拉取代码。docker pull则是默认从中央仓库(docker hub)上拉取镜像。

        这里的镜像:上面会安装一个精简的Linux操作系统,以及redis。现在,我们只需要基于这个镜像,创建容器,并跑起来,那么我们的redis服务器就搭建好了。

        使用命令:

# 系统下载好了的镜像
docker images

        

搭建环境

        我们现在基于docker环境,完成对redis哨兵机制环境进行进搭建。因为此处涉及到多个redis server,多个redis 哨兵节点,那么每一个redis server每一个redis哨兵节点都需要一个单独的容器。所以,我们需要使用dockers-compose容器编排,更简便统一地进行搭建。

容器编排:        

        通过一个配置文件,把具体要创建的哪些容器,容器运行的具体参数等描述清楚。后续可以通过简单命令,批量对这些容器进行控制。

        在docker-compose中,采用的是yml格式来进行配置。

注:文件格式固定“docker-compose.yml, docker-compose.yaml, compose.yml”

创建三个容器,作为redis的数据节点:

创建三个容器,作为redis的哨兵节点:

创建数据节点

# 创建容器并启动
docker-compose up -d#停⽌并删除刚才创建好的容器.
docker-compose down# 查看容器内日志
docker-compose logs

创建哨兵sentinel节点

        我们需要为每一个哨兵节点,创建独立的配置文件:

        我们再使用docker-compose up统一创建并启动容器。        

        此时我们就可以看到哨兵节点、数据节点独立地运行在各自的容器之中。

局域网互联 

        如果在sentinel的配置文件中,注释掉最后几行。我们再开始启动容器,可能会出现sentine哨兵节点无法解析找到 要监视的节点 Master。

        这是因为,每创建一个新的容器,docker会为之新增一个新的局域网。

# 查看docker创建的局域网
docker network ls

        我们使用命令查看docker内的局域网,分别新创建了两个一份是数据节点,一份是哨兵节点。造成这个的原因,就是我们分两次创建容器。在默认情况下,这两个局域网是不互通的。所以,为了避免在创建哨兵节点时另外新创建一个局域网,我们给sentinel的配置文件中加上那份被注释的选项。

        此时,六个节点都处在同一个局域网内,可以实现相互通信了。


Redis哨兵选举流程

(1) 从现象感知

        现在,在我们的docker容器中,正启动着六个redis服务。我们现在动手将主节点干掉!        

docker stop redis-master

        观察哨兵日志:

 

        我们最终会得出以下结论:

•  Redis 主节点宕机, 哨兵会把其中的⼀个从节点, 提拔成主节点。
•  当之前的 Redis 主节点重启之后, 这个主节点被加⼊到哨兵的监控中, 这时只会当作从节点使⽤。
并且在这过程中,会选择出一个leader。

(2) 选举原理

        假定当前环境如上⽅介绍, 三个哨兵,⼀个主节点,两个从节点。

🎃 主观下线

        当 redis-master 宕机, 此时 redis-master 和三个哨兵之间的⼼跳包就没有了。网络延迟低、响应快的哨兵节点则会将这个redis-master判顶为观下线。

🎃 客观下线

        其他哨兵节点也发现了主节点故障后,发起投票。当投票数 > “法定票数”,

(sentinel monitor redis-master 172.22.0.4 6379 2 这个票数在我们是sentinel中设置的)

则会判断为客观下线,redis-master 故障这个事情被做实了。

🎃 选举出哨兵的 leader

        接下来,首先发现宕机主节点的哨兵节点,会主动申请为leader,并向其他哨兵节点拉票,投票完成后,这个哨兵节点会成为leader。

        leader负责挑选⼀个 slave 成为新的 master。当其他的 sentenal 发现新的 master 出现了, 就说明选举结束了。

        最后,将新的Master节点,告知其他的哨兵节点,更新它们所监视的节点对象。

         整个哨兵选举的过程就是这样,与我们印象中不同的是,需要先从哨兵间选取leader,才能继续由leader去挑选数据节点中哪一个从节点,成为新的主节点。所以,到底挑选哪一个从节点,就是需要一定的准则。

挑选规则:

① 优先级,优先级是配置⽂件中的配置项 “slave-priority” 或者 “replica-priority ”。

② replication offset 谁复制的数据多, ⾼的上位。

③ ⽐较 run id , 谁的 id ⼩, 谁上位。run id记录的是redis服务器启动时间就生成的id。

        当某个 slave 节点被指定为 master 之后:

        leader会指定该节点进行slave no one,成为新的master。其余剩下的slave节点,会重新slave of 到这个新的Master。


Redis哨兵机制的反思

        哨兵机制,避免了人工处理可能会出现的失误,以及能够24小时不间断地对Redis数据节点进行监控。从而提高了系统的稳定性和可用性。

值得注意的是:

哨兵节点不能只有⼀个. 也不能只放在同一个服务器上,否则哨兵节点挂了也会影响系统可⽤性。
哨兵节点最好是奇数个. ⽅便选举 leader, 得票更容易超过半数。
哨兵节点不负责存储数据. 仍然是 redis 主从节点负责存储。
哨兵 + 主从复制解决的问题是 "提⾼可⽤性", 不能解决 "数据极端情况下写丢失" 的问题。
哨兵 + 主从复制不能提⾼数据的存储容量. 如何提高存储容量,这同我们之后Redis集群分布息息相关。

本篇到此结束,感谢你的阅读。

祝你好运,向阳而生~

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

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

相关文章

c语言->学会offsetof宏计算结构体相对偏移量

前言 ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青-CSDN博客 目的,学习offsetof宏计算结构体相对偏移量 1.offsetof宏 来我们看图…

力扣740. 删除并获得点数

动态规划 思路: 选择元素 x,获得其点数,删除 x 1 和 x - 1,则其他的 x 的点数也会被获得;可以将数组转换成一个有序 map,key 为 x, value 为对应所有 x 的和;则问题转换成了不能同…

C#: form 窗体的各种操作

说明:记录 C# form 窗体的各种操作 1. C# form 窗体居中显示 // 获取屏幕的宽度和高度 int screenWidth Screen.PrimaryScreen.Bounds.Width; int screenHeight Screen.PrimaryScreen.Bounds.Height;// 设置窗体的位置 this.StartPosition FormStartPosition.M…

深入解析Spring Boot与MySQL在医院信息管理系统中的应用

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

笔试面试题——二叉树进阶(三)

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、二叉树的前序非递归遍历1、题目讲解2、思路讲解3、代码实现 二、二叉树的中序非递归遍历1…

DNS(域名解析服务)

题目 安装DNS服务;IspSrv作为DNS的的根域创建test1.com - test100.com,并在所有正向区域中创建一条A记录,解析到本机地址。所有无法解析的域名均解析为本机地址服务配置步骤 步骤一 - 添加chinaskills.global正向区域和反向区域 前提条件:安装DNS服务 有时候会添加不成…

免费的WordPress插件大全

在当今数字化的时代,拥有一个强大的在线存在变得至关重要。而对于使用WordPress建站的用户来说,插件是提高网站功能的关键。在这篇文章中,我们将为您推荐三款免费的WordPress插件,它们不仅是147SEO软件中的佼佼者,而且…

手机软件的测试主要有哪些方面去测试,性能测试用什么去测试好?

手机App软件与Web软件系统的架构是不一样的,手机是基于CS架构,而Web系统是基于BS架构的,所以测试手机App软件那么要考虑的东西会更多一些。 分析题主的问题包含两块: 1、手机软件(App)测试主要有哪些方面? 2、手机软件…

QT获取本机网络信息

QT获取本机网络信息 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();void getinform…

模拟器单窗口ip有问题?试试关闭IPV6来解决

目前应该不止雷电9有这个问题了&#xff0c;最早是看到无忧群里在说有这个问题&#xff0c;后面发现很多其他的ip软件也有同样的问题&#xff0c;很多人都遇到&#xff0c;所以做个图文教程在这里&#xff0c;没出问题的也可以设置一下&#xff0c;目前ipv6也还没普及&#xff…

2024年 复习 HTML5+CSS3+移动web 笔记 之CSS遍

28-第三天课程介绍_哔哩哔哩_bilibili CSS 第一天 1.1 引入方式 1.2 选择器 1.3 画盒子 div 独占一行 1.4 文字控制 div 外层 1.5 调试工具 F12 1.5 综合案例 一 新闻详情 1.6 综合案例 二 CSS 简介 CSS 第二天 2.1 复合选择器 2.2 伪类选择器 2.3 CSS 特性 2.4 Emmet 写法 2.5…

Windows 下ffmpeg安装及实践

Windows 下ffmpeg安装及实践 背景安装实践其他 背景 最近负责音频文件处理相关的业务&#xff0c;涉及到 ffmpeg 对一些音频文件格式的校验&#xff0c;记录一下安装过程及踩坑过程。 安装 如图1所示&#xff0c;进入官网&#xff0c;在windows下任选一个文件&#xff1a;h…