Redis分布式系统:哨兵机制

这篇具有很好参考价值的文章主要介绍了Redis分布式系统:哨兵机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Redis分布式系统:哨兵机制,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分布式系统:哨兵机制,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

Redis分布式系统:哨兵机制,redis,数据库

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

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

        使用命令:

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

Redis分布式系统:哨兵机制,redis,数据库        

搭建环境

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

容器编排:        

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

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

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

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

Redis分布式系统:哨兵机制,redis,数据库

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

Redis分布式系统:哨兵机制,redis,数据库

创建数据节点

# 创建容器并启动
docker-compose up -d

#停⽌并删除刚才创建好的容器.
docker-compose down

# 查看容器内日志
docker-compose logs

Redis分布式系统:哨兵机制,redis,数据库

Redis分布式系统:哨兵机制,redis,数据库

创建哨兵sentinel节点

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

Redis分布式系统:哨兵机制,redis,数据库

        我们再使用docker-compose up统一创建并启动容器。        Redis分布式系统:哨兵机制,redis,数据库

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

Redis分布式系统:哨兵机制,redis,数据库

局域网互联 

Redis分布式系统:哨兵机制,redis,数据库

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

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

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

Redis分布式系统:哨兵机制,redis,数据库

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

Redis分布式系统:哨兵机制,redis,数据库

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


Redis哨兵选举流程

(1) 从现象感知

        现在,在我们的docker容器中,正启动着六个redis服务。我们现在动手将主节点干掉!        Redis分布式系统:哨兵机制,redis,数据库

docker stop redis-master

Redis分布式系统:哨兵机制,redis,数据库

        观察哨兵日志:

Redis分布式系统:哨兵机制,redis,数据库

Redis分布式系统:哨兵机制,redis,数据库 Redis分布式系统:哨兵机制,redis,数据库

Redis分布式系统:哨兵机制,redis,数据库

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

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

(2) 选举原理

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

Redis分布式系统:哨兵机制,redis,数据库

🎃 主观下线

        当 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集群分布息息相关。

本篇到此结束,感谢你的阅读。文章来源地址https://www.toymoban.com/news/detail-822197.html

祝你好运,向阳而生~
Redis分布式系统:哨兵机制,redis,数据库

到了这里,关于Redis分布式系统:哨兵机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分布式项目08 redis的扩容,预备redis宕机的哨兵处理 和 最后集大成redis集群

    01.redis扩容 由于redis的容量也是有限的,所以,就会有扩容的操作。也就好像内存中扩容一样。redis有分片这种说法,具体实现操作如下: 第一步:首先在/usr/local/src中去找到redis文件夹。cd /usr/local/src 而后进入redis文件夹。使用的linux命令是 cd redis 。 第二步: 01.使用查看当前

    2024年02月05日
    浏览(40)
  • redis集群和分片-Redis Cluster:分布式环境中的数据分片、主从复制和 Sentinel 哨兵

    当涉及到 Redis 中的集群、分片、主从复制和 Sentinel 哨兵时,这些是构建分布式 Redis 环境中非常重要的概念和组件。下面详细介绍这些概念以及它们在分布式环境中的作用。 Redis Cluster 是 Redis 官方提供的分布式解决方案,用于管理和维护多个 Redis 节点的分布式数据存储。R

    2024年02月13日
    浏览(61)
  • Redis学习(三)持久化机制、分布式缓存、多级缓存、Redis实战经验

    单节点Redis存在着: 数据丢失问题:单节点宕机,数据就丢失了。 并发能力和存储能力问题:单节点能够满足的并发量、能够存储的数据量有限。 故障恢复问题:如果Redis宕机,服务不可用,需要一种自动的故障恢复手段。 RDB持久化 RDB(Redis database backup file,Redis数据库备份

    2024年02月16日
    浏览(55)
  • 分布式天梯图算法在 Redis 图数据库中的应用

    Redis是一个高性能的键值对数据库,支持常用的数据结构和分布式操作,被广泛应用于缓存、消息队列和排行榜等场景。除了基本的数据结构,Redis还支持图数据结构并提供了一些算法支持。 天梯图算法是一种基于贪心的图搜索算法,在寻找最短路径问题中具有很高的效率。

    2024年02月14日
    浏览(35)
  • Redis分布式系统:集群

    \\\"还不如留给花园,多一瞬色彩~\\\"          当我们聊到“集群”这一个词,我们脑中构想出的画面,一定是多台机器,构成的分布式系统,这可以被称为一个“集群”。其实,在前篇的哨兵机制下,奇数个监控哨兵,以及多组主从结构的数节点所构成的大的环境,就是一个“

    2024年01月24日
    浏览(43)
  • Java中利用Redis,ZooKeeper,数据库等实现分布式锁(遥遥领先)

    1.1 什么是分布式锁 在我们进行单机应用开发涉及并发同步的时候,我们往往采用synchronized或者ReentrantLock的方式来解决多线程间的代码同步问题。但是当我们的应用是在分布式集群工作的情况下,那么就需要一种更加高级的锁机制,来处理种跨机器的进程之间的数据同步问题

    2024年02月03日
    浏览(51)
  • 动力节点Redis7笔记-第六章Redis分布式系统

    Redis分布式系统,官方称为Redis Cluster,Redis集群,其是Redis 3.0开始推出的分布式解决方案。其可以很好地解决不同Redis节点存放不同数据,并将用户请求方便地路由到不同Redis的问题。 分布式数据库系统会根据不同的数据分区算法,将数据分散存储到不同的数据库服务器节点上

    2024年02月07日
    浏览(40)
  • 分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)

    什么是分布式 一个系统各组件分别部署在不同服务器。彼此通过网络通信和协调的系统。 也可以指多个不同组件分布在网络上互相协作,比如说电商网站 也可以一个组件的多个副本组成集群,互相协作如同一个组件,比如数据存储服务中为了数据不丢失而采取的多个服务备

    2024年04月11日
    浏览(50)
  • 在Spring中,可以使用不同的方式来实现分布式锁,例如基于数据库、Redis、ZooKeeper等

    在Spring中,可以使用不同的方式来实现分布式锁,例如基于数据库、Redis、ZooKeeper等。下面是两种常见的实现方式: 使用Redis实现分布式锁: 使用自定义注解实现本地锁: 以上是两种常见的在Spring中实现分布式锁的方式。第一种方式使用Redis作为分布式锁的存储介质,通过

    2024年03月17日
    浏览(46)
  • 分布式存储系统举例剖析(elasticsearch,kafka,redis-cluster)

    1. 概述 对于分布式系统,人们首先对现实中的分布式系统进行高层抽象,然后做出各种假设,发展了诸如CAP, FLP 等理论,提出了很多一致性模型,Paxos 是其中最璀璨的明珠。我们对分布式系统的时序,复制模式,一致性等基础理论特别关注。 在共识算法的基础上衍生了选举

    2024年02月12日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包