18.Redis之哨兵

1.哨兵机制的介绍

通过自动化的手段,来解决主节点挂了的问题~~

哨兵机制, 是通过独立的 进程 来体现的.和之前 redis-server 是不同的进程!!

redis-sentine| 不负责存储数据,只是对其他的 redis-server 进程起到监控的效果~~

通常哨兵节点,也会搞一个集合~~(多个哨兵节点构成的)

单个哨兵节点,挂了,咋办~~

Redis 的主从复制模式下,⼀旦主节点由于故障不能提供服务,需要⼈⼯进⾏主从切换,同时⼤量
的客⼾端需要被通知切换到新的主节点上,对于上了⼀定规模的应⽤来说,这种⽅案是⽆法接受的, 于是 Redis提供了 Redis Sentinel(哨兵)加个来解决这个问题。

1.1 基本概念

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

2.手动恢复redis主从复制的流程

  • 实际开发中,对于服务器后端开发,监控程序, 是非常重要的!!
  • 服务器,要求要有比较高的可用性,7*24 运行~~
  • 服务器长期运行,总会有一些"意外",具体啥时候出现了意外,咱们也不知道~~同时,也不能全靠人工来盯着服务器运行~~
  • 写一个程序,用程序来盯着服务器的运行状态~~
  • 监控程序~~
    往往还需要搭配 |报警程序"短信/电话/邮件/微信/钉钉/飞书.(给程序猿报警,通知程序猿说,这个服务器程序挂了/出问题了~-)
  • 互联网公司的程序猿,尤其是大厂,公司都会明确要求, 程序猿的手机要 24 小时开机, 并且要随时关注~~报警不仅仅是只发给这一个程序猿的~~还会发给程序猿的领导/领导的领导~~
    关键时刻,错过领导的电话, 掉链子,领导就会有比较负面的评价~~可能升职加薪就得往后稍
    稍了~~

程序猿如何恢复?

  • 1.先看看主节点还能不能抢救了,好不好抢救~~
  • 如果主节点这边是啥原因挂的,不好定位; 或者原因知道,但是短时间难以解决~
  • 2.就需要挑一个从节点,设置为新的主节点~
  • a)把选中的从节点,通过 slaveof no one,自立山头,
  • b)把其他的从节点,修改 slaveof 的主节点 ip port,连上新的主节点~
  • c)告知客户端(修改客户端的配置),让客户端能够连接新的主节点,用来完成修改数据的操作~
  • 当之前的挂了的主节点,修好了之后,就可以作为一个新的从节点,挂到这组机器中~~

只要是涉及到人工干预,不说繁琐,至少很烦人~~
另外,这个操作过程如果出错了咋办?? 可能会导致问题更加严重~~
通过人工干预的做法, 就算程序猿第一时间看到了报警信息,第一时间处理~~
恢复的过程,也需要 半个小时,以上~~
这半个小时里,整个 redis 就一直不能写????显然是不合适 

引入了哨兵机制

3.自动redis主从复制的流程

  • redis 哨兵核心功能:
  • 1.监控
  • 2.自动的故障转移
  • 3. 通知
  • 注意,redis 哨兵节点,有一个,也是可以的~~
  • 1.如果哨兵节点只有一个,它自身也是容易出现问题的~~
  • 万一这个哨兵节点挂了,后续redis节点也挂了,就无法进行自动的恢复过程了~~出现误判的概率也比较高~~
  • 2.毕竟网络传数据是容易出现抖动或者延迟或者丢包的~~ 如果只有一个哨兵节点,出现上述问题之后,影响就比较大~~

基本的原则: 在分布式系统中,应该避免使用"单点”(冗余) 

哨兵节点,最好要搞 奇数 个.最少也应该是3 个~~(方便进行选举)

4.使用docker搭建环境 

  • 按理说,这 6个节点,是要在 6个不同的服务器主机上的~~
  • 此时, 只有一个云服务器, 就在一个云服务器上,来完成这里的环境搭建~~
  • 在实际工作中,把上述节点放到一个服务器上,是没有意义的!!当前这么做只是迫于无奈~~
  • 由于这些节点,还挺多的, 相互之间容易打架;
  • 依赖的端口号/配置文件/数据文件....如果咱们直接部署,就需要小心翼翼的去避开这些冲突~~
  • 类似于咱们最开始哪种进行主从结构配置的方式~~
  • 比较繁琐; 也会和在不同主机上部署,存在较大差异~~

使用 docker 就可以有效的解决上述的问题~~ 

  • 虚拟机~~,通过软件,在一个电脑上模拟出另外的一些硬件(构造了另一个虚拟的电脑)
  • 虚拟机这样的软件,就可以使用一个计算机,来模拟出多个电脑的情况~~
  • 但是虚拟机有一个很大的问题: 比较吃配置~这个事情对于咱们的云服务器来说,压力山大~~
  • docker(现在后端开发这块非常流行的组件~~) 可以认为是一个"轻量级"的虚拟机~~ 起到了虚拟机这样的隔离环境的效果,但是又没有吃很多的硬件资源即使是配置比较拉胯的云服务器,也能构造出好几个这样的虚拟的环境~~

4.1 安装部署 (基于 docker)  

1.安装 docker 和 docker-compose

docker

yum install docker

docker-compose 的安装
# ubuntu
apt install docker-compose
# centos
yum install docker-compose

2.停⽌之前的 redis-server

# 停⽌ redis-server
service redis-server stop
# 停⽌ redis-sentinel 如果已经有的话 .
service redis-sentinel stop

 

3.使⽤ docker 获取 redis 镜像  

  • git pull 使用 git 从中央仓库拉取代码.
  • docker pull 使用 docker 从中央仓库(默认就是从 docker hub)来拉取镜像
  • 拉取到的镜像,里面包含一个精简的 Linux 操作系统, 并且上面会安装 redis ~^只要直接基于这个镜像创建一个容器跑起来,此时,redis 服务器就搭建好了~~ 

【出现问题】 

[root@iZuf6ep3mumzp5gofcygtuZ ~]# docker images
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

service docker start 

Docker启动提示:Cannot connect to the Docker daemon..._cannot connect to the docker daemon at-CSDN博客

4.启动服务器

sudo systemctl start redis

4.2 基于docker搭建redis哨兵环境 

  • 基于 docker 来搭建 redis 哨兵环境了~~
  • docker-compose 来进行 容器编排~
  • 此处涉及到多个 redis server 也有多个 redis 哨兵节点~每一个 redis server 或者每一个 redis 哨兵节点都是作为一个单独的容器了
  • 通过一个配置文件,把具体要创建哪些容器,每个容器运行的各种参数,描述清楚
  • 后续通过一个简单的命令,就能够批量的启动/停止这些容器了
  • 使用 yml 这样的格式来作为配置文件,
  • spring 也是使用 yml来作为配置文件的呀~~

1.具体步骤 

  • 1)创建三个容器, 作为 redis 的数据节点(一个主 两个从) yml
  • 2)创建三个容器,作为 redis 的哨兵节点 yml
  • 其实也是可以用一个 ym| 文件, 直接启动 6 个容器~~
  • 如果把这个6个容器同时启动,可能是 哨兵 先启动完,成,数据节点 后启动完成,哨兵可能就会先认为是数据节点挂了,虽然对于大局不影响,但是会影响到观察执行日志的过程~~
  • 所以直接分成两组,先手动启动第一组,再手动启动第二组
  • 1.1 编排 redis 主从节点

  • 1)编写yml

version: '3.3'
services:master:image: 'redis:5.0.9'container_name: redis-masterrestart: alwayscommand: redis-server --appendonly yesports:- 6379:6379slave1:image: 'redis:5.0.9'container_name: redis-slave1restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379ports:- 6380:6379slave2:image: 'redis:5.0.9'container_name: redis-slave2restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379ports:- 6381:6379

2) 启动所有容器
docker-compose up -d

3) 查看运⾏⽇志
docker-compose logs
 4) 验证
1.连接主节点
redis-cli -p 6379
info replication

 成功!!!

2.连接从节点
redis-cli -p 6380

redis-cli -p 6381  

 1.2 编排 redis-sentinel 节点

1) 编写 docker-compose.yml
创建 /root/redis-sentinel/docker-compose.yml , 同时 cd 到 yml 所在⽬录中.
注意: 每个⽬录中只能存在⼀个 docker-compose.yml ⽂件.
version: '3.3'
services:sentinel1:image: 'redis:5.0.9'container_name: redis-sentinel-1restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel1.conf:/etc/redis/sentinel.confports:- 26379:26379sentinel2:image: 'redis:5.0.9'container_name: redis-sentinel-2restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel2.conf:/etc/redis/sentinel.confports:- 26380:26379sentinel3:image: 'redis:5.0.9'container_name: redis-sentinel-3restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel3.conf:/etc/redis/sentinel.confports:- 26381:26379
networks:default:external:name: redisdata_default

其中最后一行的name要与以下配置相对应

2) 创建配置⽂件
创建 sentinel1.conf sentinel2.conf sentinel3.conf . 三份⽂件的内容是完全相同
的.
都放到 /root/redis-sentinel/ ⽬录中.
bind 0.0.0.0
port 26379
sentinel monitor redis-master redis-master 6379 2
sentinel down-after-milliseconds redis-master 1000
理解 sentinel monitor

sentinel monitor 主节点名 主节点ip 主节点端⼝ 法定票数 

主节点名, 这个是哨兵内部⾃⼰起的名字.
主节点 ip, 部署 redis-master 的设备 ip. 此处由于是使⽤ docker, 可以直接写 docker 的容器名, 会
被⾃动 DNS 成对应的容器 ip
主节点端⼝, 不解释.
法定票数, 哨兵需要判定主节点是否挂了. 但是有的时候可能因为特殊情况, ⽐如主节点仍然⼯作正常, 但是哨兵节点⾃⼰⽹络出问题了, ⽆法访问到主节点了. 此时就可能会使该哨兵节点认为主节点下线, 出现误判. 使⽤投票的⽅式来确定主节点是否真的挂了是更稳妥的做法. 需要多个哨兵都认为主节点挂了, 票数 >= 法定票数 之后, 才会真的认为主节点是挂了.
理解 sentinel down-after-milliseconds
主节点和哨兵之间通过⼼跳包来进⾏沟通. 如果⼼跳包在指定的时间内还没回来, 就视为是节点出现故障

既然内容相同, 为啥要创建多份配置⽂件?

redis-sentinel 在运⾏中可能会对配置进⾏ rewrite, 修改⽂件内容. 如果⽤⼀份⽂件, 就可能出现修改
混乱的情况.
3) 启动所有容器

docker-compose up -d

如果启动后发现前⾯的配置有误, 需要重新操作, 使⽤ docker-compose down 即可停⽌并删除刚才创建好的容器.
4) 查看运⾏⽇志
docker-compose logs
上述操作必须保证⼯作⽬录在 yml 的同级⽬录中, 才能⼯作.
可以看到, 哨兵节点已经通过主节点, 认识到了对应的从节点.

 

 哨兵启动后自动修改

5.哨兵节点的作用

  • 哨兵存在的意义,能够在 redis 主从结构出现问题的时候(比如主节点挂了),此时哨兵节点就能够自动的帮我们重新选出一个主节点,来代替之前挂了的节点、保证整个 redis 仍然是可用状态.
  • 手动把主节点给干掉.
  • 当主节点挂了之后,哨兵节点就开始工作了!!
  • sdown 主观下线: 本哨兵节点,认为该主节点挂了
  • odown 客观下线: 好几个哨兵都认为该节点挂了,达成了一致(法定票数)
  • 此时,主节点挂了这个事情就被石锤了~~
  • 此时就需要哨兵节点选出一个从节点,作为新的主节点,此处就需要提拔出一个新的主节点~~

6.主从切换的具体流程 

1.主观下线.

哨兵节点通过心跳包,判定 redis 服务器是否正常工作,如果心跳包没有如约而至,就说明 redis 服务器挂了,此时还不能排除网络波动的影响,因此就只能是单方面认为这个 redis 节点挂了

2.客观下线.

多个哨兵都认为主节点挂了。(认为挂了的哨兵节点数目达到 法定票数)哨兵们就认为这个主节点是 客观下线

【比如是否可能出现非常严重的网络波动导致所有的哨兵都联系不上 redis 主节点误判成挂了呢??

当然是有的!!!

如果出现这个情况,怕是用户的客户端也连不上 redis 主节点了..此时这个主节点基本也就无法正常工作了

"挂了"不一定是进程崩了只要无法正常访问,都可以视为是挂了】

3.要让多个哨兵节点,选出一个 leader 节点由这个 leader 负责选一个 从节点 作为新的主节点,

上面投票过程,看谁反应快(谁网络延时小)

4.此时 leader 选举完毕,leader 就需要挑选一个从节点,作为新的主节点.
  • 1)优先级
  • 每个 redis 数据节点,都会在配置文件中,有一个优先级的设置.slave-priority优先级高的从节点,就会胜出~~~
  • 2) offset最大,就胜出.
  • offset 从节点从主节点这边同步数据的进度.数值越大,说明从节点的数据和主节点就越接近.
  • 3)run id 每个 redis 节点启动的时候随机生成的一串数字~~(大小全凭缘分了)
  • 把新的主节点指定好了之后,
    leader 就会控制这个这个节点,执行 slave no one,成为 master,
    再控制其他节点,执行 slave of,让这些其他节点,以新的 master 作为主节点了

经典面试顾~~
尤其是注意选举的过程
不是直接选出新的主节点,而是先选 leader
由 leader 负责后续的主节点指定~~

7.小结 

上述过程, 都是 "⽆⼈值守" , Redis ⾃动完成的. 这样做就解决了主节点宕机之后需要⼈⼯⼲预的问题, 提⾼了系统的稳定性和可⽤性.
⼀些注意事项:
哨兵节点不能只有⼀个. 否则哨兵节点挂了也会影响系统可⽤性.
哨兵节点最好是奇数个. ⽅便选举 leader, 得票更容易超过半数.(大部分3个足以)
哨兵节点不负责存储数据. 仍然是 redis 主从节点负责存储.(哨兵节点就可以使用一些配置不
高的机器来部署.(但是不能搞一个机器部署三个哨兵))
哨兵 + 主从复制解决的问题是 "提⾼可⽤性", 不能解决 "数据极端情况下写丢失" 的问题.
哨兵 + 主从复制不能提⾼数据的存储容量. 当我们需要存的数据接近或者超过机器的物理内存, 这样的结构就难以胜任了.
为了能存储更多的数据, 就引⼊了集群.

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

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

相关文章

【Pr学习】01新建项目起步

【Pr学习】01新建项目起步 1、新建项目2.序列设置2.1新建序列2.2序列参数讲解2.3自定义设置 3.PR窗口认识3.1 项目窗口3.2 源窗口2.4 保存面板 4.剪辑导入4.1 素材导入4.2 视图切换4.3 时间轴4.4轨道工具4.5 节目窗口素材导入 5.基础操作5.1 取消视频音频链接5.2 单独渲染&…

Qos令牌桶算法:笔记0601

令牌桶 令牌:目前看到2种表述,csdn表示一个令牌代表一个字节,51cto是一个令牌代表一个bit。51cto上关于cisco qos算法描述多表达为一个令牌一个bit (不知道rfc上咋表达的懒得去查了,主打一个好读书不求甚解,感觉应该是…

[无监督学习] 11.详细图解LSA

LSA LSA(Latent Semantic Analysis,潜在语义分析)是一种自然语言处理技术。作为一种降维算法,它常被用于信息搜索领域。使用 LSA 能够从大量的文本数据中找出单词之间的潜在关联性。 概述 LSA 是在 1988 年被提出的算法&#xff…

AI产品导航站

1、AI产品导航站 (chat2ai.cn)

更新mirh connect 内置derby数据库密码

更新mirh connect 内置derby数据库密码 1、下载derby连接客户端 https://archive.apache.org/dist/db/derby/ 选择任意版本即可,比如 https://archive.apache.org/dist/db/derby/db-derby-10.14.2.0/db-derby-10.14.2.0-bin.zip 2、连接mirh文件数据库 1、把mi…

UnityAPI学习之游戏物体的方法使用

目录 游戏物体 创建游戏物体的三种方式 组建的获取和查找 游戏物体的方法与其他成员变量 游戏物体的生成 游戏物体的激活状态/标签(tag)/层级(layer) 游戏物体的激活与失活 游戏物体的查找 1. 名称查找(Find) 2. 通过标签查找游戏物体(FindGameObjectWithT…

关于linux程序的查看、前台运行、后台运行、杀死的管理操作。

前言 在Linux中, 程序(program)是放在磁盘上的程序,是不会执行的。 进程(process)是程序被触发,从而加载到内存中的,会被CPU随机执行。 Linux中,有非常多的进程在实时运…

如何让Google收录网页?

确保网页被Google快速且持续地收录,页面的质量起着至关重要的作用。高质量的网页不仅更容易被搜索引擎收录,而且能够提高网页在搜索结果中的排名,想确保页面的质量,要保持原创,确保你的内容是独一无二的,别…

Python基础教程——数据类型和变量

数据类型和变量 Python使用缩进来组织代码块,一般使用4个空格的缩进.使用#来注释一行,其他每一行都是一个语句,当语句以冒号:结尾时,缩进的语句视为代码块.Python对大小写敏感. 1.1 整数 Python可以处理任意大小的整数,包括负整数,写法与数学上写法一致,例如:-10…

Qt Creator中, ui设计中设置属性无效, 会自动变回去问题

最近学qt遇到个问题, 很奇怪, 具体表现为: 我想修改这个字体大小为12, 但是修改后会自动变回9, 我读取qss方式设置样式, 依然无效!找了很久,最终发现是我在最上层设置了字体大小, 导致下面的所有控件, 全部设置字体无效&#xff…

【CPP】栈简介及简化模拟实现

CPP栈和队列简单模拟实现 目录 1. 栈的简介2. 栈简化模拟实现3. 栈练习题 1. 栈的简介 栈 是一种 特殊的线性表,具有数据 先进后出 特点。 具体参考:【数据结构】栈 CPP库参考文档:stl_stack 注意: 1.stack本身 不支持迭代器操…

骨传导耳机防踩雷秘诀是什么?六大选购技巧独家揭秘!

相信大家都已经深有体会,拿那种常规的入耳式无线蓝牙耳机来做运动耳机,很难满足运动需要。如果选择前两年流行的颈挂式无线运动蓝牙耳机,虽然简单轻巧,但也是入耳式设计,长时间佩戴耳朵不舒服。这样看来,运…

Python-3.12.0文档解读-内置函数sorted()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 Python-3.12.0文档解读详细说明 功能描述 参数说明 用法示例 备注 进阶用法 参考…

【Qt】【模型视图架构】代理模型示例

文章目录 1. 基本排序/过滤模型Basic Sort/Filter Model Example2. 自定义排序/过滤模型Custom Sort/Filter Model ExampleFilterLineEdit类定义及实现MySortFilterProxyModel类定义及实现 1. 基本排序/过滤模型Basic Sort/Filter Model Example 官方提供的基本排序/过滤模型示…

【算法】贪心算法——柠檬水找零

题解:柠檬水找零(贪心算法) 目录 1.题目2.题解3.参考代码4.证明5.总结 1.题目 题目链接:LINK 2.题解 分情况讨论 贪心算法 当顾客为5元时,收下当顾客为10元时,收下10元并找回5元当顾客为20元时,收下20元并找回10…

大泽动力车载柴油发电机的特点和优势有哪些

大泽动力车载柴油发电机具有一系列显著的特点和优势,以下是对其的详细介绍: 低噪音性能:大泽动力车载柴油发电机具备明显的低噪音性能,其噪音限值在距离机组7米处测得为70dB(A),这为用户提供了一个相对安静的工作环境…

Java18+​App端采用uniapp+开发工具 idea hbuilder智能上门家政系统源码,一站式家政服务平台开发 家政服务(师傅端)介绍

Java18​App端采用uniapp开发工具 idea hbuilder智能上门家政系统源码,一站式家政服务平台开发 家政服务(师傅端)介绍 家政服务师傅端是一个专为家政服务人员设计的平台,该平台旨在提供便捷、高效的工作机会,同时确保…

html期末复习速览

一.基础标签 1.段落标签<p></p> 特点&#xff1a;分段分割 2.标题标签<h1></h1>……<h6></h6> 特点&#xff1a;文字加粗&#xff0c;单独占一行 3.换行标签<br /> 特点&#xff1a;单标签&#xff0c;强制换行 二.文本格式化…

View->Bitmap缩放到自定义ViewGroup的任意区域(Matrix方式绘制Bitmap)

Bitmap缩放和平移 加载一张Bitmap可能为宽高相同的正方形&#xff0c;也可能为宽高不同的矩形缩放方向可以为中心缩放&#xff0c;左上角缩放&#xff0c;右上角缩放&#xff0c;左下角缩放&#xff0c;右下角缩放Bitmap中心缩放&#xff0c;包含了缩放和平移两个操作&#xf…

SpringBoot 多模块 多环境 项目 单元测试

环境描述 假设项目中有以下三个yml文件&#xff1a; application.ymlapplication-dev.ymlapplication-prod.yml 假设项目各Module之间依赖关系如下&#xff1a; 其中&#xff0c;D依赖C&#xff0c;C依赖B&#xff0c;B依赖A&#xff0c;D对外提供最终的访问接口 现在要想采…