Redis哨兵模式搭建

Redis哨兵模式搭建

在Redis主从复制这篇文章中我们分析了主从复制的特点,其中一个问题就是主机宕机后需要手动调整,修改从机

为主机,不仅不利于迅速恢复生产场景,还会增加人力成本。哨兵模式的出现是就是为了解决我们主从复制模式中

需要我们人为操作的东西变为自动版,并且它比人为要更及时。这篇文章我们就来讲讲如何通过哨兵模式,迅

速实现自动故障转移。

一、哨兵主要功能

监控(Monitoring):哨兵会不断地检查主节点和从节点是否运作正常。

自动故障转移(Automatic Failover):当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主

节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。

配置提供者(Configuration Provider):客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址。

通知(Notification):哨兵可以将故障转移的结果发送给客户端。

其中,监控和自动故障转移功能,使得哨兵可以及时发现主节点故障并完成转移;而配置提供者和通知功能,则需

要在与客户端的交互中才能体现。

二、哨兵模式

哨兵模式下,可以将节点类型分为数据节点和哨兵节点:

数据节点:主从架构中的主节点和从节点都是数据节点。

哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的Redis节点,不存储数据。

在这里插入图片描述

在上图的架构中,除使用1主2从外,还额外使用了3个哨兵来监视集群状况。

三、搭建哨兵模式

1、部署主从节点

哨兵系统中的主从节点,与普通的主从节点配置是一样的,并不需要做任何额外配置,继续使用上篇文章的配置即

可。

bind 0.0.0.0
port 8000
pidfile /var/run/redis_8000.pid
logfile "redis8000.log"
dbfilename dump8000.rdb
dir /home/hydra/files/redis/slave/redis8000/
requirepass 123456
daemonize yes
masterauth 123456
bind 0.0.0.0
port 8001
pidfile /var/run/redis_8001.pid
logfile "redis8001.log"
dbfilename dump8001.rdb
dir /home/hydra/files/redis/slave/redis8001/
# replicaof 127.0.0.1 8000
slaveof 127.0.0.1 8000
requirepass 123456
masterauth 123456
# 从机开启aof持久化
appendonly yes
daemonize yes
bind 0.0.0.0
port 8002
pidfile /var/run/redis_8002.pid
logfile "redis8002.log"
dbfilename dump8002.rdb
dir /home/hydra/files/redis/slave/redis8002/
# replicaof 127.0.0.1 8000
slaveof 127.0.0.1 8000
requirepass 123456
masterauth 123456
# 从机开启aof持久化
appendonly yes
daemonize yes

注意使用哨兵模式下,一定要开启materauth配置密码:

masterauth 123456

2、部署哨兵节点

拷贝安装目录下的配置文件sentinel.conf到自己新建的sentinel目录下,并重命名为sentinel28000.conf

以便和之后的哨兵通过端口进行区分。

修改配置文件,首先修改通用配置:

bind 0.0.0.0
protected-mode no
port 28000
daemonize yes
pidfile /var/run/redis-sentinel28000.pid
logfile "sentinel28000.log"
dir /tmp

修改哨兵核心配置,如果只配置一台哨兵,只需要修改以下配置:

sentinel monitor mymaster 127.0.0.1 8000 2
# redis数据master节点设置了认证,则需要如下配置
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

看一下官方注释中的格式:

sentinel monitor <master-name> <ip> <redis-port> <quorum>  

master-name指定了主节点名称,ipredis-port指定了主节点地址,quorum是判断主节点客观下线的哨兵

数量阈值:当判定主节点下线的哨兵数量达到quorum时,对主节点进行客观下线。建议取值为哨兵数量的一半加

1。

sentinel auth-pass <master-name> <password>

当在Redis实例中开启了requirepass foobared 授权密码后,所有连接Redis实例的客户端都要提供密码。设置

哨兵sentinel 连接主从的密码,注意必须为主从设置一样的验证密码。

其他配置参数:

sentinel down-after-milliseconds mymaster 30000

该参数与主观下线的判断有关:哨兵使用ping命令对其他节点进行心跳检测,如果其他节点超过down-after-

milliseconds配置的时间没有回复,哨兵就会将其进行主观下线。该配置对主节点、从节点和哨兵节点的主观下线

判定都有效。

sentinel parallel-syncs mymaster 1

该参数与故障转移之后从节点的复制有关:它规定了每次向新的主节点发起复制操作的从节点个数。

例如,假设主节点切换完成之后,有3个从节点要向新的主节点发起复制:

如果parallel-syncs=1,则从节点会一个一个开始复制;

如果parallel-syncs=3,则3个从节点会一起开始复制。

parallel-syncs取值越大,从节点完成复制的时间越快,但是对主节点的网络负载、硬盘负载造成的压力也越大,

应根据实际情况设置。

这里我们使用3台哨兵,因此复制配置文件sentinel28001.confsentinel28002.conf,并批量替换其中的端

口号为28001和28002。

bind 0.0.0.0
protected-mode no
port 28000
daemonize yes
pidfile /var/run/redis-sentinel28000.pid
logfile "sentinel28000.log"
dir /tmp
sentinel monitor mymaster 127.0.0.1 8000 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
bind 0.0.0.0
protected-mode no
port 28001
daemonize yes
pidfile /var/run/redis-sentinel28001.pid
logfile "sentinel28001.log"
dir /tmp
sentinel monitor mymaster 127.0.0.1 8000 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
bind 0.0.0.0
protected-mode no
port 28002
daemonize yes
pidfile /var/run/redis-sentinel28002.pid
logfile "sentinel28002.log"
dir /tmp
sentinel monitor mymaster 127.0.0.1 8000 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

3、启动哨兵节点

../redis-5.0.4/src/redis-sentinel sentinel28000.conf
../redis-5.0.4/src/redis-sentinel sentinel28001.conf
../redis-5.0.4/src/redis-sentinel sentinel28002.conf

除此之外,也可以使用下面的命令启动,效果相同:

../redis-5.0.4/src/redis-server sentinel28002.conf --sentinel

查看运行进程:
在这里插入图片描述

可以看出,现在主从运行3台Redis实例,并配置了3台哨兵。

4、使用Jedis客户端进行测试

public class RedisSentinelTest {public static void main(String[] args)  {Set<String> set=new HashSet<>();set.add("127.0.0.1:28000");set.add("127.0.0.1:28001");set.add("127.0.0.1:28002");JedisSentinelPool jedisSentinelPool=new JedisSentinelPool("mymaster",set,"123456");while (true) {Jedis jedis=null;try {jedis = jedisSentinelPool.getResource();String s = UUID.randomUUID().toString();jedis.set("k" + s, "v" + s);System.out.println(jedis.get("k" + s));Thread.sleep(1000);}catch (Exception e){e.printStackTrace();}finally {if(jedis!=null){jedis.close();}}}}
}

在客户端写数据过程中,使用kill命令杀死主机,会存在短暂的写失败情况,抛出异常。这是因为在故障迁移的时

候,是不能写数据的,中间有服务不可用的过程,在迁移后会自动恢复。并且当原来的主机再启动后,会变成新主

机的从机使用,这是因为哨兵会动态的修改配置文件。

四、哨兵模式原理

1、关于哨兵的原理,关键是了解以下核心概念:

主观下线:在心跳检测的定时任务中,如果其他节点超过一定时间没有回复,哨兵节点就会将其进行主观下线。顾

名思义,主观下线的意思是一个哨兵节点“主观地”判断下线;与主观下线相对应的是客观下线。

客观下线:哨兵节点在对主节点进行主观下线后,会通过sentinel is-master-down-by-addr命令询问其他哨

兵节点该主节点的状态;如果判断主节点下线的哨兵数量达到一定数值,则对该主节点进行客观下线。

需要特别注意的是,客观下线是主节点才有的概念;如果从节点和哨兵节点发生故障,被哨兵主观下线后,不会再

有后续的客观下线和故障转移操作。

2、每个哨兵节点维护了3个定时任务。定时任务的功能分别如下:

  • 每10秒通过向主从节点发送info命令获取最新的主从结构:发现slave节点,并确定主从关系;

  • 每2秒通过发布订阅功能获取其他哨兵节点的信息,交互对节点的“看法”和自身情况;

  • 每1秒通过向其他节点发送ping命令进行心跳检测,判断是否下线。

3、领导者选举

选举领导者哨兵节点:当主节点被判断客观下线以后,各个哨兵节点会进行协商,选举出一个领导者哨兵节点,并

由该领导者节点对其进行故障转移操作。

监视该主节点的所有哨兵都有可能被选为领导者,选举使用的算法是Raft算法;Raft算法的基本思路是先到先得:

即在一轮选举中,哨兵A向B发送成为领导者的申请,如果B没有同意过其他哨兵,则会同意A成为领导者。

在从节点中选择新的主节点,选择的原则如下:

  • 首先过滤掉不健康的从节点

  • 然后选择优先级最高的从节点(由replica-priority指定)

  • 如果优先级无法区分,则选择复制偏移量最大的从节点

  • 如果仍无法区分,则选择runid最小的从节点

  • 更新主从状态:通过slaveof no one命令,让选出来的从节点成为主节点,并通过slaveof命令让其他节点成为其从节点

  • 将已经下线的主节点保持关注,当再次上线后设置为新的主节点的从节点

五、总结

在实际使用过程中,哨兵节点的数量应大于一个。一方面增加哨兵节点的冗余,避免哨兵本身成为高可用的瓶颈;

另一方面减少对下线的误判。此外,不同的哨兵节点应部署在不同的物理机上。并且哨兵节点的数量应该是奇数,

便于哨兵通过投票进行领导者选举的决策、客观下线的决策等。

在主从复制的基础上,哨兵引入了主节点的自动故障转移,进一步提高了Redis的高可用性;但是哨兵的缺陷同样

很明显:哨兵无法对从节点进行自动故障转移,在读写分离场景下,从节点故障会导致读服务不可用,需要我们对

从节点做额外的监控、切换操作。此外,哨兵仍然没有解决写操作无法负载均衡、及存储能力受到单机限制的问

题。

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

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

相关文章

比ChatGPT更强的星火大模型V2版本发布!

初体验 测试PPT生成 结果&#xff1a; 达到了我的预期&#xff0c;只需要微调就可以直接交付&#xff0c;这点比ChatGPT要强很多. 测试文档问答 结果&#xff1a; 这点很新颖&#xff0c;现在类似这种文档问答的AI平台收费都贵的离谱&#xff0c;星火不但免费支持而且效果也…

[oeasy]python0085_[趣味拓展]字体样式_下划线_中划线_闪动效果_反相_取消效果

字体样式 回忆上次内容 \033 xm 可以改变字体样式 0m - 10m 之间设置的 都是字体效果 0m 复原1m 变亮2m 变暗 从3m到10m 又是什么效果 呢&#xff1f;&#xff1f; 真的可以 让文字 blink闪烁吗&#xff1f;&#x1f441; 3m 3m 实现斜体字的效果 4m 4m 对应着下划线 控…

16.5.3 【Linux】SELinux 三种模式的启动、关闭与观察

并非所有的 Linux distributions 都支持 SELinux 的&#xff0c;所以你必须要先观察一下你的系统版本为何。 目前 SELinux 依据启动与否&#xff0c;共有三种模式&#xff0c;分别如下&#xff1a; enforcing&#xff1a;强制模式&#xff0c;代表 SELinux 运行中&#xff0c;…

Es、kibana安装教程-ES(二)

上篇文章介绍了ES负责数据存储&#xff0c;计算和搜索&#xff0c;他与传统数据库不同&#xff0c;是基于倒排索引来解决问题的。Kibana是es可视化工具。 分布式搜索ElasticSearch-ES&#xff08;一&#xff09; 一、ElasticSearch安装 官网下载地址&#xff1a;https://www…

springBoot 配置文件 spring.mvc.throw-exception-if-no-handler-found 参数的作用

在Spring Boot应用中&#xff0c;可以通过配置文件来控制当找不到请求处理器&#xff08;handler&#xff09;时是否抛出异常。具体的配置参数是spring.mvc.throw-exception-if-no-handler-found。 默认情况下&#xff0c;该参数的值为false&#xff0c;即当找不到请求处理器时…

ES踩坑记录之UNASSIGNED分片无法恢复

问题背景 换节点 我们线上有一套ES集群&#xff0c;三台机器&#xff0c;共运行了6个节点。一直在线上跑了几个月也一直没出什么问题。然而好巧不巧&#xff0c;就在昨天&#xff0c;集群中的3号节点磁盘出现故障&#xff0c;导致机器直接瘫痪。本来大家觉得问题不大&#xf…

Android12 偶现触摸失灵

生产线 在烧录固件时&#xff0c;会偶然出现稍完之后屏幕触摸用不了。前期以为是烧录没弄好&#xff0c;后面又发生&#xff0c;就怀疑与产品有关了。 首先进行抓日志分析&#xff1a;有问题的设备先确认下dmesg信息 adb连接设备进行日志抓取&#xff1a; logcat > /sdcard…

QT的工程文件认识

目录 1、QT介绍 2、QT的特点 3、QT模块 3.1基本模块 3.2扩展模块 4、QT工程创建 1.选择应用的窗体格式 2.设置工程的名称与路径 3.设置类名 4.选择编译器 5、QT 工程解析 xxx.pro 工程配置 xxx.h 头文件 main.cpp 主函数 xxx.cpp 文件 6、纯手工创建一个QT 工程…

carla中lka实现(二)

前言&#xff1a; 首先计算之前检测出来的车道线的中线与输入图像的中线进行计算距离&#xff0c;&#xff0c;并设置不同的阈值对于不同的方向进行相关的调整。 一、车辆中心线 一般而言将摄像头架设在车辆的正中心轴上&#xff0c;所获得的图像的中间线极为车辆的中心。 …

js watermark实现水印效果

2023.8.15今天学习了如何给页面添加水印&#xff0c;效果如下&#xff1a; 1.创建watermark.js文件&#xff1a; import id from "element-ui/src/locale/lang/id";let watermark {} let setWatermark (str) > {let id 1.23452384164.123412415if (document.g…

WebGL游戏站优化实录【myshmup.com】

myshmup.com 允许在浏览器中创建 shmup&#xff08;射击&#xff09;游戏。 你可以使用具有创意通用许可证的资源或上传自己的艺术作品和声音。 创建的游戏可以在网站上发布。 该平台不需要编码&#xff0c;游戏对象的配置是在用户界面的帮助下执行的。 后端是使用Django框架开…

Git多版本并行开发实践

本文目的&#xff1a; 实现多个项目同时进行的git多版本管理工作流。 名词解释&#xff1a; feature-XXXX&#xff1a;特性分支指CCS中一个项目或者一个迭代&#xff0c;在该分支上开发&#xff0c;完成后&#xff0c;合并&#xff0c;最后&#xff0c;删除该分支&#xff0c;…

设计模式之中介者模式(Mediator)的C++实现

1、中介者模式的提出 在软件组件开发过程中&#xff0c;如果存在多个对象&#xff0c;且这些对象之间存在的相互交互的情况不是一一对应的情况&#xff0c;这种功能组件间的对象引用关系比较复杂&#xff0c;耦合度较高。如果有一些新的需求变化&#xff0c;则不易扩展。中介者…

uniapp 官方扩展组件 uni-combox 实现:只能选择不能手写(输入中支持过滤显示下拉列表)

uniapp 官方扩展组件 uni-combox 实现&#xff1a;只能选择不能手写&#xff08;输入中支持过滤显示下拉列表&#xff09; uni-comboxuni-combox 原本支持&#xff1a;问题&#xff1a; 改造源码参考资料 uni-combox uni-combox 原本支持&#xff1a; 下拉选择。输入关键字&am…

ATF(TF-A) 威胁模型汇总

安全之安全(security)博客目录导读 目录计划如下&#xff0c;相关内容补充中&#xff0c;待完成后进行超链接&#xff0c;敬请期待&#xff0c;欢迎您的关注 1、通用威胁模型 2、SPMC威胁模型 3、EL3 SPMC威胁模型 4、fvp_r 平台威胁模型 5、RSS-AP接口威胁模型 威胁建模是安全…

TCP服务器实现—多进程版,多线程版,线程池版

目录 前言 1.存在的问题 2.多进程版 3.多线程版 4.线程池版 总结 前言 在上一篇文章中使用TCP协议实现了一个简单的服务器&#xff0c;可以用来服务端和客户端通信&#xff0c;但是之前的服务器存在一个问题&#xff0c;就是当有多个客户端连接服务器的时候&#xff0c;服…

【Unity细节】Unity中的层级LayerMask

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…

MySQL索引介绍 为什么mysql使用B+树

什么是索引&#xff1f; 索引是一种用于快速查询和检索数据的数据结构&#xff0c;常见的索引结构有&#xff1a;B树&#xff0c;B树和Hash。 索引的作用就相当于目录。打个比方&#xff0c;我们在查字典的时候&#xff0c;如果没有目录&#xff0c;那我们就只能一页一页的去…

K8S核心组件etcd详解(上)

1 介绍 https://etcd.io/docs/v3.5/ etcd是一个高可用的分布式键值存储系统&#xff0c;是CoreOS&#xff08;现在隶属于Red Hat&#xff09;公司开发的一个开源项目。它提供了一个简单的接口来存储和检索键值对数据&#xff0c;并使用Raft协议实现了分布式一致性。etcd广泛应用…

Llama 2免费托管及API提供

Llama 2 是 Meta 最新的文本生成模型&#xff0c;目前其性能优于所有开源替代方案。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 1、强大的Llama 2 它击败了 Falcon-40B&#xff08;之前最好的开源基础模型&#xff09;&#xff0c;与 GPT-3.5 相当&#xff0c;仅低…