Redis高可用之Sentinel哨兵模式

news2024/11/15 19:24:52

一、背景与简介

        Redis关于高可用与分布式有三个与之相关的运维部署模式。分别是主从复制master-slave模式、哨兵Sentinel模式以及集群Cluster模式。

        这三者都有各自的优缺点以及所应对的场景、对应的业务使用量与公司体量。

 1、主从master-slave模式

   【介绍】

            这种模式可以采用一主一从、一主多从、以及树形结构的嵌套复制结构都是支持的。

   【优点】

            1、配置以及运维相对简单,可以支持读写分离,master节点负责写操作、slave负责进行读操作,同时slave作为master节点数据的一个备份,避免由于master节点挂掉,整个服务不可用。

    【缺点】

           1、master节点发生故障时需要人工进行介入,增加运维成本。通知客户端修改master的IP地址与端口,让slave节点顶上来作为主节点。那么之前的slave节点变成了主节点,等之前的old-master节点恢复后,反过来作为之前slave节点的从节点。 即使你可以把这个故障切主的过程进行自动脚本化,但是怎么确保多个slave中选择哪个slave成为新的主节点以及各种异常情况都能hold得住?  自己写的这个脚本就会变得很复杂。

          2、切主暂且不说自动化脚本还能解决,但是你让业务方切换IP+端口这个事情万万是不能被接受的用到这个Redis的地方太多了,你想改也改不过来,改了要发新配置代码,还有就是怕漏改。即使你使用Nacos等配置中心,也是一件让人头疼的事情

        基于以上的几点考虑,官方推出了哨兵Sentinel模式,将这个过程自动化。切换流程不需要我们自己编写脚本,哨兵模式会可靠地帮我们完成这个故障切换过程,同时客户端也无须改变任何IP端口,无感进行故障切换。

     【适应的公司体量】      小公司、创业公司或者业务量不是特别大的公司

2、哨兵Sentinel模式

    【介绍 】

             哨兵Sentinel模式其实是将master-slave主从模式故障切换从人工介入换成了自动化切换的过程,哨兵节点会高效、快速、可靠的从剩余的slave节点中选择出1个合适的节点作为新的master主节点,之后将剩余的slave节点切主到这个新的master节点。同时,客户端要获取master节点信息要通过连接sentinel来获取master的IP和端口,这样每次切主的过程,程序会自动完成,无感迁移。

     【优点】

            1、官方原生支持高可用方案,比第一种master-slave手动写切换脚本以及通知业务方更换IP+端口更加方便、可靠、稳定

     【缺点】

            1、虽然哨兵解决了高可用问题,但是无法解决高容量、高并发的需求。 因为一个哨兵始终只是维护master-slave的高可用而已,不能解决高并发、高容量问题。 这个后续的Cluster集群模式可以来解决。

             2、切主的过程,可能会存在客户端短时间内连接不上master的情况,这个时间取决于故障迁移恢复时间。因为master节点挂了,哨兵在做故障迁移没结束之前,哨兵存储的master的信息还是挂掉的IP+端口,自然客户端继续连接挂掉的主机IP+端口就无法进行正常数据读写。 

    【适应的公司体量】    稍微有点业务体量与规模的公司

3、集群Cluster模式

   【介绍】

            集群Cluster模式支持分布式部署,采用虚拟槽的设计思路,将存储的key进行CRC16($key)%16383的方式对数据进行分片存储和读取。 一共存在0-16383的slot虚拟槽位, 一个虚拟槽位slot理论上可以支持一个master+N个slave的主从架构模式。 那就是理论上可以支持16383个master+slave的主从架构模式, 这样的量就已经很牛逼了。  

          同时集群模式本身就支持高可用,一旦slot节点的master-slave主从结构的主节点挂了,那么会从它所属的slot的master-slave主从结构中进行重新切主操作。

          不过官方推荐整个Redis集群不超过1000个节点。 想想一下,就算是1000个,如果按照一台服务器16G内存的情况计算,如果一半的内存进行存储也就是8G,整个集群的容量高达80TB。 这种基本上除了一线互联网大厂能玩得转,我看其它公司也没这个运维能力以及需求量了。

    【优点】

           1、支持高容量、高并发访问量的需求,官方原生支持、可靠稳定

           2、同时支持高可用模式,自动切主,实现故障迁移。  虽然故障迁移期间,客户端也可能会出现无法正常访问Redis集群的情况,但是只会影响落到这个slot的这些key, 其它的key还是能正常访问的,具体还得按照实际情况计算,节点越多,单个slot故障影响越小,可能只存在20-30%无法访问,可以理解只是挂了部分。但是,哨兵模式切主过程中产生不可用的情况就不一样,哨兵模式是故障迁移期间整体100%都无法访问。

    【缺点】

          1、对公司运维团队要求很高,运维成本高、同时成本也会变高

   【适应的公司体量】  一线或者二线的互联网大厂

二、哨兵Sentinel-简单实验

1、主从配置是Sentinel、Cluster的基础

        例如存在A节点作为master节点,存在2个slave节点分别是A1、A2.

        那么在A1、A2分别执行

slaveof $master_ip $master_port

        即可完成A作为master节点,A1、A2作为其slave节点的一主两从的拓扑结构。

        这个过于简单就不再演示,今天重点做Sentinel哨兵的故障模拟和迁移实验

2、环境搭建与测试

1、环境介绍

        我们准备3个sentinel节点, 以及一个一主两从的结构。 让这个3个sentinel哨兵节点对整个一主两从进行监听与负责故障转移。

hostnameIP端口角色备注
s1192.168.32.326379sentinel哨兵节点
s2192.168.32.226379sentinel哨兵节点
s3192.168.32.426379sentinel哨兵节点
master192.168.32.76379master节点
slave1192.168.32.56379slave节点主节点是master
slave2192.168.32.66379slave节点主节点是master

        docker-compose.yaml文件内容如下:

version: "3"
services:
  s1:
    image: redis:5.0
    hostname: s1
    volumes:
      - "./redis-sentinel-26379.conf:/data/redis-sentinel-26379.conf"
    entrypoint: [ "tail", "-f", "/dev/null" ]
  s2:
    image: redis:5.0
    hostname: s2
    volumes:
      - "./redis-sentinel-26379.conf:/data/redis-sentinel-26379.conf"
    entrypoint: [ "tail", "-f", "/dev/null" ]
  s3:
    image: redis:5.0
    hostname: s3
    volumes:
      - "./redis-sentinel-26379.conf:/data/redis-sentinel-26379.conf"
    entrypoint: [ "tail", "-f", "/dev/null" ]

  master:
    image: redis:5.0
    hostname: master
    entrypoint: ["tail", "-f", "/dev/null"]
  slave1:
    image: redis:5.0
    hostname: slave1
    entrypoint: ["tail", "-f", "/dev/null"]
  slave2:
    image: redis:5.0
    hostname: slave2
    entrypoint: ["tail", "-f", "/dev/null"]
2、Sentinel哨兵的配置文件

redis-sentinel-26379.conf:

port 26379
daemonize yes
logfile "26379.log"
dir /data/
sentinel monitor mymaster master 6379 2  #Sentinel监控集群别名mymaster,监控的master这个用的host别名,可以写IP形式: 192.168.32.7,  6379是端口, 2是指投票个数
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 180000
 3、首先启动1主2从结构
docker-compose up -d --build #启动所有容器


# master节点
docker-compose exec master bash #进入master容器
redis-server &> /dev/null &  #运行redis-server进入后台


# slave1节点
docker-compose exec slave1 bash #进入slave1容器
redis-server &> /dev/null &  #运行redis-server进入后台
redis-cli  #进入控制台
slaveof master 6379  #切主
info replication #查看主从复制情况


# slave2节点
docker-compose exec slave2 bash #进入slave2容器
redis-server &> /dev/null &  #运行redis-server进入后台
redis-cli  #进入控制台
slaveof master 6379  #切主
info replication #查看主从复制情况

  查看master节点的集群节点信息: info replication

可以看到存在2个slave节点,分别是192.168.32.5(slave1)、192.168.32.6(slave2)正常连接运行

4、依次启动s1、s2、s3的Sentinel节点
redis-sentinel redis-sentinel-26379.conf  #后台运行sentinel节点程序
5、通过Sentinel API命令查看当前的master信息
sentinel masters

 查询结果如下:

6、模拟master节点故障,将master容器进行docker-compose stop操作

再次进入s1 sentinel节点运行redis-cli,  执行sentinel masters指令查看当前master的信息:

此时可以看到,本来master是192.168.32.7是主节点,后来模拟故障将这个节点进行stop操作。此时故障迁移已经完成, 从192.168.32.5、192.168.32.6选择了192.168.32.5做为新的master节点.

同时我们进入192.168.32.5(slave1)查看当前info replication信息:

7、恢复刚才的master容器,此时slave1再运行info replication会多出从节点

从slave1节点运行info replication,此时可以看到192.168.32.7从一开始的主节点反过来变成了slave1的从节点, slave1已经变成了新的master主节点:

三、总结

        选择简单主从模式、哨兵模式、或者集群模式,可以根据自己公司的业务量以及运维团队规模进行评估,选择合适的方案。 高可用一直和成本成反比关系,想要高可用那么付出的成本要变高,无论是运维成本还是资金成本, 反之,如果降低成本,那么可用性就会降低。

        公司体量还很小,处于起步阶段,推荐简单主从模式基本上够用了,成本也不会很高。

        如果已经稍微上规模了,还是推荐使用哨兵模式,这样故障迁移的过程就会自动化,无须人工介入更加稳定。

        如果已经是发展到哨兵模式都无法满足业务需求了,再考虑使用Cluster集群模式,能够满足更高容量、高并发访问量的需求。

       上面的这些模式都是基于IDC自己运维的机房或者自行搭建的机房环境,如果上云,自己想追求高可用性和可靠性,但是又没那么多运维精力的话,可以直接买云厂商的Redis服务即可,付钱买服务即可。

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

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

相关文章

win10、11系统安装班智达藏文输入法并正常使用(完美解决)

1. 结果图 2. 先闲聊两句 班智达输入法对于藏语初学者可谓是太好用了(哈哈)特别是联想提示的功能。不禁为开发团队点个赞。 表扬完了该批评批评了。班智达输入法的安装难度真是一言难尽。也许是开发者没有继续维护的缘故吧。想当年,哪个藏语…

视频的关键知识

1 引言 视频技术发展到现在已经有100多年的历史,虽然比照相技术历史时间短,但在过去很长一段时间之内都是最重要的媒体。 由于互联网在新世纪的崛起,使得传统的媒体技术有了更好的发展平台,应运而生了新的多媒体技术。而多媒体技…

MVSNeRF:多视图立体视觉的快速推广辐射场重建

MVSNeRF:多视图立体视觉的快速推广辐射场重建 摘要1 引言 摘要 在2021年,作者提出了MVSNeRF,一种新的神经渲染方法,在视图合成中可以有效地重建神经辐射场。与之前对神经辐射场的研究不同,我们考虑了对密集捕获的图像…

【模电】放大电路的组成原则

放大电路的组成原则 组成原则常用的两种共射放大电路 组成原则 通过对基本共射放大电路的简单分析可以总结出,在组成放大电路时必须遵循以下几个原则:    1. 必须根据所用放大管的类型提供直流电源,以便设置合适的静态工作点,并…

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-B

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-B 目录 2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-B 需要环境或者解析可以私信 (二)A 模块基础设施设置/安全加固(200 分&…

EI级 | Matlab实现TCN-GRU-Multihead-Attention多头注意力机制多变量时间序列预测

EI级 | Matlab实现TCN-GRU-Multihead-Attention多头注意力机制多变量时间序列预测 目录 EI级 | Matlab实现TCN-GRU-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【EI级】Matlab实现TCN-GRU-Multihead-Attention…

探索 SSO 的世界:简化登录流程的最佳实践(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

深度学习项目基于Tensorflow卷积神经网络人脸年龄预测系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 系统介绍 基于Tensorflow的卷积神经网络人脸年龄预测系统是一种先进的深度学习应用,能够通过对大量人脸…

『亚马逊云科技产品测评』活动征文|基于亚马逊EC2云服务器安装Prometheus数据可视化监控

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器(Elastic Compute Cloud)是亚马…

思维模型 路径依赖定律

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。难以摆脱的惯性。 1 路径依赖定律的应用 1.1 打破路径依赖定律的苹果 在 20 世纪 80 年代,苹果公司推出了 Macintosh 电脑,这是一款具有图形用户界面和鼠标的创新产…

在intelliJ spring boot gradle插件3.2.0中未找到匹配的变量

我正在尝试使用spring启动Gradle插件的版本3.2.0。这是我的build.gradle文件: plugins {id javaid org.springframework.boot version 3.2.0id io.spring.dependency-management version 1.1.4 }group com.yaxin version 0.0.1-SNAPSHOTjava {sourceCompatibilit…

【unity3D】创建游戏物体的三种方式

💗 未来的游戏开发程序媛,现在的努力学习菜鸡 💦本专栏是我关于游戏开发的学习笔记 🈶本篇是在unity中创建游戏物体的三种方式 unity中创建游戏物体 使用构造函数创建一个空的游戏对象根据现有的预制体资源或者场景中已有的物体进…

三大兼容 | 人大金仓兼容+优化MySQL用户变量特性

目前,KingbaseES对MySQL的兼容性,已从功能兼容阶段过渡到强性能兼容、生态全面兼容阶段,针对客户常常遇到的用户变量问题,KingbaseES在兼容MySQL用户变量功能的基础上,优化了MySQL用户变量的一些原生问题,使…

.Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)

机缘 不知不觉,.NET8都已经面世,而我们一直还停留在.netframework4.5开发阶段,最近准备抽空研究一下.Net6,一是为了提高技术积累,一方面想着通过这次的学习,看有没有可能将老的FX版本替换到.Net6开发上,经过查找官方资料,对.Net6支持的系统版本做一个分享,方便大家后期…

python-ATM机

编写程序,实现一个具有开户、查询、取款、存款、转账、锁定、解锁、退出功能的银行管理系统。 结果展示 1.Main主方法 from zzjmxy.class7.atm import ATM from zzjmxy.class7.manager import Manager # 主面板,实现主要逻辑if __name__"__main__…

你的AI生成物侵权了吗?

你的AI生成物侵权了吗? 本文目录: 一、前置背景 1.1、什么是版权 1.2、什么是作品 1.3、什么是创作 1.4、什么是肖像权 1.5、什么是名誉 二、AI生成的作品是否具备版权?如果具备,版权应该属于谁? 三、AI 学习时…

Hadoop进阶学习---Yarn资源调度架构

1.Yarn执行MR流程 1.客户端提交一个MR程序给ResourceManager(校验请求是否合法…) 2.如果请求合法,ResourceManager随机选择一个NodeManager用于生成appmaster(应用程序控制者,每个应用程序都单独有一个appmaster) 3.appmaster会主动向ResourceManager的应用管理器(applicatio…

启动 AWS Academy Learner Lab【教学】(Hadoop实验)

🔥博客主页: A_SHOWY🎥系列专栏:力扣刷题总结录 数据结构 云计算 第一部分 创建实例过程 首先,需要创建3台EC2,一台作主节点 (master node),两台作从节点 (slaves node)。 1.镜像选择 EC2&…

金蝶云星空表单插件单据体批量删除,序号自增

文章目录 金蝶云星空表单插件单据体批量删除,序号自增字段标识说明表单插件获取单据体数据包移除物料为空的行其他移除物料为空的行的方式,但是测试不通过,不建议使用序号重新生成测试 金蝶云星空表单插件单据体批量删除,序号自增…

Hadoop进阶学习---HDFS分布式文件存储系统

1.hdfs分布式文件存储的特点 分布式存储:一次写入,多次读取 HDFS文件系统可存储超大文件,时效性较差. HDFS基友硬件故障检测和自动快速恢复功能. HDFS为数据存储提供很强的扩展能力. HDFS存储一般为一次写入,多次读取,只支持追加写入,不支持随机修改. HDFS可以在普通廉价的机器…