Redis集群安装之哨兵集群

news2025/2/21 21:51:19

1.哨兵集群介绍及原理

  主从模式,当主节点宕机之后,从节点是可以作为主节点顶上来,继续提供服务的。但是有一个问题,主节点的IP已经变动了,此时应用服务还是拿着原主节点的地址去访问,此时就需要人工干预进行修改。哨兵恰恰就可以解决这个问题。

  访问redis集群的数据都是通过哨兵集群的,哨兵监控整个redis集群。一旦发现redis集群出现了问题,比如主节点挂了,从节点会顶上来。但是主节点地址变了,这时候应用服务无感知,也不用更改访问地址,因为哨兵才是和应用服务做交互的。Sentinel很好的解决了故障转移,在高可用方面又上升了一个台阶,当然Sentinel还有其他功能。比如 主节点存活检测、主从运行情况检测、主从切换。RedisSentinel最小配置是 一主一从。

在这里插入图片描述

1.1.redis哨兵模式原理

  哨兵模式建立在主从复制基础之上,会在每一个redis节点上打开一个sentinel监控,每个sentinel进程都有自己的端口号和IP,所有sentinel共享集群信息,集群中所有的sentinel都是可以通信的,当主库宕机后,主库上的sentinel就会向集群中的其他节点的sentinel发送信息说主库宕机了,需要在从库上选举master,这时每个节点上的sentinel会比较自己redis配置的ID号,比如slave1ID号大,slave1就会选举为master作为主库,当故障的主库重新加入集群后,主库上的sentinel会向其他节点的sentinel询问谁是主库,这时slave1上的sentinel就会告诉主库上的sentinelslave1是主库,重新加入集群的主库就会找slave1同步数据,如果重新加入的主库想再次成为主库,只需要执行提权命令就可以重新成为主库。

  主从复制的时候程序配置redis地址的时候都是写死主库的地址,每次主库宕机都需要手动修改应用。

  有了哨兵模式后,在程序代码中配置不是redis地址,而是配置的所有哨兵的地址,形成一个地址池,即使集群中一个哨兵坏掉了,还有其他两个哨兵,每次需要找redis写入数据时,程序首先会找哨兵进程,哨兵之间信息共享,会立马告诉程序谁是主库,这时程序拿到哨兵告诉它的redis主库地址,就会去找主库存数据,因此即使主库坏了,也不需要修改程序代码。

  哨兵的配置文件在启动哨兵服务后,尽量不要去修改,因为哨兵会自动增加配置。

  哨兵集群个数建议是奇数,比如3/5/7。

  配置了哨兵后,当主库挂掉,哨兵选举了新库,会自动把配置文件修改为最新主库的地址。

1.2.哨兵的选举规则

  首选判断slave-priority权重优先级,谁的高谁当选为master主库,如果都一致,那么久比较各个节点的id,谁的大谁当选。

1.3.哨兵模式监控的原理

  • 每个Sentinel以每秒钟一次的频率,向它所有的主服务器从服务器以及其他Sentinel实例 发送一个PING命令。

  • 如果一个实例(instance)距离最后一次有效回复PING命令的时间超过down-after-milliseconds所指定的值,那么这个实例会被Sentinel标记为主观下线

  • 如果一个主服务器被标记为主观下线,那么正在监视这个主服务器的所有Sentinel节点,要以每秒一次的频率确认该主服务器是否的确进入了主观下线状态。

  • 如果一个主服务器被标记为主观下线,并且有足够数量的Sentinel(至少要达到配置文件指定的数量)在指定的时间范围内同意这一判断,那么这个该主服务器被标记为客观下线

在这里插入图片描述

  在一般情况下, 每个Sentinel会以每 10秒一次的频率,向它已知的所有主服务器从服务器发送INFO命令。当一个主服务器Sentinel标记为客观下线时,Sentinel下线主服务器的所有从服务器发送INFO命令的频率,会从10秒一次改为 每秒一次。Sentinel和其他Sentinel协商主节点的状态,如果主节点处于SDOWN状态,则投票自动选出新的主节点。将剩余的从节点指向新的主节点进行数据复制。

  当没有足够数量的Sentinel同意主服务器下线时,主服务器客观下线状态就会被移除。当主服务器重新向SentinelPING命令返回 有效回复 时,主服务器主观下线状态就会被移除。

2.搭建哨兵集群

2.1.集群结构

  这里我们搭建一个三节点形成的Sentinel集群,来监管之前的Redis主从集群。如图:

在这里插入图片描述

三个sentinel实例信息如下:

节点IPPORT
s1192.168.150.10127001
s2192.168.150.10127002
s3192.168.150.10127003

2.2.准备实例和配置

  要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。

我们创建三个文件夹,名字分别叫s1s2s3

# 进入/tmp目录
cd /tmp
# 创建目录
mkdir s1 s2 s3

如图:

在这里插入图片描述

然后我们在s1目录创建一个sentinel.conf文件,添加下面的内容:

# 哨兵sentinel实例运行的端口
port 27001

# 明确指定哨兵的ip
sentinel announce-ip 10.0.4.10

# 哨兵模式是否后台启动,默认no,改为yes
daemonize yes

# log日志保存位置
logfile /usr/local/redis/sentinel/redis-sentinel.log

###核心配置
# 核心配置。
# 第三个参数:哨兵名字,可自行修改。(若修改了,那后面涉及到的都得同步) 
# 第四个参数:master主机ip地址
# 第五个参数:redis端口号
# 第六个参数:哨兵的数量。比如2表示,当至少有2个哨兵发现master的redis挂了,
#               那么就将此master标记为宕机节点。
#               这个时候就会进行故障的转移,将其中的一个从节点变为master
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 10.0.4.10 7001 2

# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456

# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 5000

# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。
# 可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1

# 主备切换的时间,若在3分钟内没有切换成功,换另一个从节点切换
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 60000

# 哨兵sentinel的工作目录
dir "/home/redis/s1"

然后将s1/sentinel.conf文件拷贝到s2s3两个目录中(在/home目录执行下列命令):

# 方式一:逐个拷贝
cp s1/sentinel.conf s2
cp s1/sentinel.conf s3
# 方式二:管道组合命令,一键拷贝
echo s2 s3 | xargs -t -n 1 cp s1/sentinel.conf

修改s2s3两个文件夹内的配置文件,将端口分别修改为27002、27003:

sed -i -e 's/27001/27002/g' -e 's/s1/s2/g' s2/sentinel.conf
sed -i -e 's/27001/27003/g' -e 's/s1/s3/g' s3/sentinel.conf

2.3.启动

为了方便查看日志,我们打开3个ssh窗口,分别启动3个redis实例,启动命令:

# 第1个
redis-sentinel s1/sentinel.conf
# 第2个
redis-sentinel s2/sentinel.conf
# 第3个
redis-sentinel s3/sentinel.conf

启动后:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.4.测试

尝试让master节点7001宕机,查看sentinel日志:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

日志解读:

@ 字符之后的内容用于指定主服务器, 这些内容是可选的, 它们仅在 @ 字符之前的内容指定的实例不是主服务器时使用。

  • +reset-master <instance details> :主服务器已被重置。
  • +slave <instance details> :一个新的从服务器已经被Sentinel识别并关联。
  • +failover-state-reconf-slaves <instance details> :故障转移状态切换到了 reconf-slaves 状态。
  • +failover-detected <instance details> :另一个Sentinel开始了一次故障转移操作,或者一个从服务器转换成了主服务器。
  • +slave-reconf-sent <instance details> :领头(leader)的Sentinel 向实例发送了SLAVEOF host port命令,为实例设置新的主服务器。
  • +slave-reconf-inprog <instance details> :实例正在将自己设置为指定主服务器的从服务器,但相应的同步过程仍未完成。
  • +slave-reconf-done <instance details> :从服务器已经成功完成对新主服务器的同步。
  • -dup-sentinel <instance details> :对给定主服务器进行监视的一个或多个Sentinel已经因为重复出现而被移除 —— 当Sentinel实例重启的时候,就会出现这种情况。
  • +sentinel <instance details> :一个监视给定主服务器的新Sentinel已经被识别并添加。
  • +sdown <instance details> :给定的实例现在处于主观下线状态。
  • -sdown <instance details> :给定的实例已经不再处于主观下线状态。
  • +odown <instance details> :给定的实例现在处于客观下线状态。
  • -odown <instance details> :给定的实例已经不再处于客观下线状态。
  • +new-epoch <instance details> :当前的纪元(epoch)已经被更新。
  • +try-failover <instance details> :一个新的故障迁移操作正在执行中,等待被大多数Sentinel选中(waiting to be elected by the majority)。
  • +elected-leader <instance details> :赢得指定纪元的选举,可以进行故障迁移操作了。
  • +failover-state-select-slave <instance details> :故障转移操作现在处于 select-slave 状态 ——Sentinel正在寻找可以升级为主服务器的从服务器。
  • no-good-slave <instance details>Sentinel操作未能找到适合进行升级的从服务器。Sentinel会在一段时间之后再次尝试寻找合适的从服务器来进行升级,又或者直接放弃执行故障转移操作。
  • selected-slave <instance details>Sentinel顺利找到适合进行升级的从服务器。
  • failover-state-send-slaveof-noone <instance details>Sentinel正在将指定的从服务器升级为主服务器,等待升级功能完成。
  • failover-end-for-timeout <instance details> :故障转移因为超时而中止,不过最终所有从服务器都会开始复制新的主服务器(slaves will eventually be configured to replicate with the new master anyway)。
  • failover-end <instance details> :故障转移操作顺利完成。所有从服务器都开始复制新的主服务器了。
  • +switch-master <master name> <oldip> <oldport> <newip> <newport> :配置变更,主服务器的IP和地址已经改变。 这是绝大多数外部用户都关心的信息。
  • +tilt :进入tilt模式。
  • -tilt :退出tilt模式。

查看7002的日志:

在这里插入图片描述

查看7003的日志:

在这里插入图片描述

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

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

相关文章

阿里巴巴 MySQL binlog 增量订阅消费组件canal实现mysql数据同步

canal实现mysql数据同步 简介&#xff1a;最近线上系统进行压测&#xff0c;评估线上系统容量&#xff0c;根据压测情况对代理层&#xff0c;代码&#xff0c;sql等都做了相应的优化&#xff0c;而系统最大的瓶颈在于数据库&#xff0c;根据实际业务情况&#xff0c;决定对数据…

迅镭激光董事长颜章健受邀参加江苏师范大学研究生毕业答辩活动

5月20日&#xff0c;迅镭激光董事长颜章健应邀赴江苏师范大学物电学院进行为期2天的考察交流&#xff0c;并作为特聘专家参加光电信息工程专业研究生毕业答辩活动。 校企携手 再谱新篇 考察期间&#xff0c;江苏师范大学物电学院举行欢迎座谈会&#xff0c;江苏师范大学学科办…

二叉搜索树(查找、插入、删除的讲解实现+图文并茂)

目录 1. 二叉搜索树&#xff08;BST&#xff09; 1.1 二叉搜索树概念 1.2 二叉搜索树操作 1.2.1 二叉搜索树的查找 1.2.2 二叉搜索树的插入 1.2.3 二叉搜索树的删除 2. 二叉搜索树的实现 2.1BST基本结构 2.2 BST操作成员函数(非递归&#xff09; 2.3 BST操作成员函数&#x…

开放式耳机是什么意思?2023年开放式耳机推荐指南

开放式耳机&#xff0c;就是开放耳朵不需要塞入耳道的一种耳机。 这种耳机包括气传导和骨传导两种类型。气传导耳机采用波束成形技术进行定向传音&#xff0c;将音频传送到耳朵&#xff0c;其所采用的空气传导原理在发声的时候不会引起振动。 而骨传导耳机则是通过震动颅骨来…

HttpRunnerManager接口自动化测试框架在win环境下搭建教程

近几日一直在研究如何把接口自动化做的顺畅&#xff0c;目前用的是轻量级jmeterantJenkins自动化测试框架&#xff0c;目前测试界的主流是python语言&#xff0c;所以一直想用搭建一个基于python的HttpRunnerManager。公司项目也比较多&#xff0c;在上班的过程中偶尔研究了一下…

【Linux高级 I/O(6)】初识文件锁—— flock()方法(附代码示例)

想象一下&#xff0c;当两个人同时编辑磁盘中同一份文件时&#xff0c;其后果将会如何呢&#xff1f;在 Linux 系统中&#xff0c;该文件的最后状态通常取决于写该文件的最后一个进程。多个进程同时操作同一文件&#xff0c;很容易导致文件中的数据发生混乱&#xff0c;因为多个…

【UE】制作追踪导弹

效果 步骤 1. 首先在虚幻商城下载所需素材 2. 打开“BP_West_Missile_M26” 勾选模拟物理 添加一个变量&#xff0c;命名为“Target” 该变量用来表示导弹追踪的目标&#xff0c;变量类型为actor的对象引用&#xff0c;勾选可编辑实例和生成时公开 在事件图表中添加如下节点 3…

Swin Transformer 论文精读

Swin Transformer 论文精读 https://www.bilibili.com/video/BV13L4y1475U Swin 几乎涵盖了 CV 的下游任务&#xff08;下游任务指骨干网后面的 head 解决的任务&#xff0c;如&#xff1a;分类、检测、语义分割&#xff09;&#xff0c;并且曾经刷新多个数据集的榜单。 题目…

记一次符合Google Coding Style的Bash脚本重构

最近我在思考这样一个问题&#xff0c;顺便看一下gpt对这个问题的解释。搜索发现&#xff1a; 团队写代码&#xff0c;为什么要遵循coding guideline&#xff1f; 一致性&#xff1a;编码准则确保整个团队的代码风格和格式是一致的&#xff0c;这使得团队成员之间更易于交流和…

人工智能(Pytorch)搭建模型6-使用Pytorch搭建卷积神经网络ResNet模型

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(Pytorch)搭建模型6-使用Pytorch搭建卷积神经网络ResNet模型&#xff0c;在本文中&#xff0c;我们将学习如何使用PyTorch搭建卷积神经网络ResNet模型&#xff0c;并在生成的假数据上进行训练和测试。本文将…

Linux---vi/vim编辑器、查阅命令

1. vi\vim编辑器三种模式 vim 是 vi 的加强版本&#xff0c;兼容 vi 的所有指令&#xff0c;不仅能编辑文本&#xff0c;而且还具有 shell 程序编辑的功能&#xff0c; 可以不同颜色的字体来辨别语法的正确性&#xff0c;极大方便了程序的设计和编辑性。 命令模式&#xff08…

整数智能重磅推出集成SAM的智能标注工具2.0

前言 图像语义分割一直是数据标注中最繁琐、最耗时的标注任务之一&#xff0c;利用钢笔工具手动描边的标注方式所带来的时间成本和低准确率都将影响模型的生产速度和模型性能。整数智能ABAVA数据工程平台最新发布了基于SAM&#xff08;Segement Anything Model&#xff09;改进…

【面试题】面试题总结

加油加油 文章目录 1. TCP与UDP的区别2. TCP为什么是四次挥手机制3. HTTP与HTTPS的区别4. HTTPS加密机制5. 简要介绍SSL/TSL协议6. GET与POST的区别7. cookie与session的区别8. JVM内存区域划分9. 程序运行时候内存不足&#xff0c;会出现什么状况10. 显式调用GC会立即执行吗11…

【Python json】零基础也能轻松掌握的学习路线与参考资料

Python中的JSON模块主要用于将Python对象序列化成JSON数据或解析包含JSON数据的字符串。JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。由于JSON在Web应用中的广泛使用…

SpringCloud Sentinel实战限流熔断降级应用

目录 1 Sentinel核心库1.1 Sentinel介绍1.2 Sentinel核心功能1.2.1 流量控制1.2.2 熔断降级 2 Sentinel 限流熔断降级2.1 SentinelResource定义资源2.2 Sentinel的规则2.2.1 流量控制规则 (FlowRule)2.2.2 熔断降级规则 (DegradeRule)2.2.3 系统保护规则 (SystemRule)2.2.4 访问…

Tomcat配置https协议证书-阿里云,Nginx配置https协议证书-阿里云,Tomcat配置https证书pfx转jks

Tomcat/Nginx配置https协议证书 前言Tomcat配置https协议证书-阿里云方式一 pfx配置证书重启即可 方式二 jkspfx生成jks配置证书重启即可 Nginx配置https协议证书-阿里云实现方式重启即可 其他Tomcat相关配置例子如下nginx配置相关例子如下 前言 阿里云官网&#xff1a;https:…

探索Java面向对象编程的奇妙世界(三)

⭐ 垃圾回收机制(Garbage Collection)⭐ JVM 调优和 Full GC⭐ this 关键字⭐ static 关键字 ⭐ 垃圾回收机制(Garbage Collection) Java 引入了垃圾回收机制&#xff0c;令 C程序员最头疼的内存管理问题迎刃而解。Java 程序员可以将更多的精力放到业务逻辑上而不是内存管理工…

网安面试只要掌握这十点技巧,绝对轻轻松松吊打面试官

结合工作经验&#xff0c;在这里笔者给企业网管员提供一些保障企业网络安全的建议&#xff0c;帮助他们用以抵御网络入侵、恶意软件和垃圾邮件。 定义用户完成相关任务的恰当权限 拥有管理员权限的用户也就拥有执行破坏系统的活动能力&#xff0c;例如&#xff1a; ・偶然对系…

挂耳式耳机品牌排行榜,良心推荐这四款蓝牙耳机

在蓝牙耳机越来越普及的同时&#xff0c;大家开始重视佩戴耳机时的舒适度&#xff0c;市面上的耳机形式也逐步迭代&#xff0c;目前流行的开放式耳机不仅很好的避免长期佩戴耳机产生的酸痛感&#xff0c;而且对耳道健康问题的处理也具有极佳的效果。那么&#xff0c;面对市面上…

VB显示“shell32.dll”中的图标

在Form上添加一个ListBox列表控件 代码如下&#xff1a; Option Explicit Private Declare Function ExtractIconEx Lib “shell32.dll” Alias “ExtractIconExA” (ByVal lpszFile As String, ByVal nIconIndex As Long, phiconLarge As Long, phiconSmall As Long, ByVal nI…