学习总结录 学习总结录
首页
归档
分类
标签
  • Java基础
  • Java集合
  • MySQL
  • Redis
  • JVM
  • 多线程
  • 计算机网络
  • 操作系统
  • Spring
  • Kafka
  • Elasticsearch
  • Python
  • 面试专题
  • 案例实践
  • 工具使用
  • 项目搭建
  • 服务治理
  • ORM框架
  • 分布式组件
  • MiniSpring
  • 设计模式
  • 算法思想
  • 编码规范
友链
关于
GitHub (opens new window)
首页
归档
分类
标签
  • Java基础
  • Java集合
  • MySQL
  • Redis
  • JVM
  • 多线程
  • 计算机网络
  • 操作系统
  • Spring
  • Kafka
  • Elasticsearch
  • Python
  • 面试专题
  • 案例实践
  • 工具使用
  • 项目搭建
  • 服务治理
  • ORM框架
  • 分布式组件
  • MiniSpring
  • 设计模式
  • 算法思想
  • 编码规范
友链
关于
GitHub (opens new window)
  • Java基础

  • Java集合

  • MySQL

  • Redis

    • Redis核心技术01-基础数据结构
    • Redis核心技术02-线程IO模型
    • Redis核心技术03-持久化
    • Redis核心技术04-数据同步
    • Redis核心技术05-哨兵机制
    • Redis核心技术06-哨兵集群
      • Redis核心技术06-哨兵集群
      • 基于pub/sub机制的哨兵集群
      • 基于pub/sub机制的客户端事件通知
      • 主从切换是那个哨兵执行
      • 参考
    • Redis核心技术07-切片集群
    • Redis核心技术08-String
    • Redis核心技术09-keys统计案例与方案
    • Redis核心技术10-GEO
    • Redis核心技术11-时间序列数据存储
    • Redis核心技术12-消息队列
    • Redis核心技术13-异步机制
    • Redis核心技术14-CPU结构对Redis性能影响
    • Redis核心技术15-应对变慢的Redis
    • Redis核心技术16-删除数据后内存占用率还是很高
    • Redis核心技术17-缓冲区
    • Redis核心技术18-Redis缓冲是如何工作的
    • Redis核心技术19-缓冲替换策略
    • Redis核心技术20-缓冲异常
    • Redis核心技术21-缓存污染
    • Redis核心技术22-无锁原子操作
    • Redis核心技术23-分布式锁
    • Redis核心技术24-事务机制
    • Redis核心技术25-主从同步与故障切换的坑
    • Redis核心技术26-脑裂问题
    • Redis核心技术27-Redis在秒杀场景的关键技术
  • JVM

  • 多线程

  • 计算机网络

  • Spring

  • Kafka

  • Elasticsearch

  • Python

  • 面试专题

  • 知识库
  • Redis
旭日
2023-03-31
目录
Redis核心技术06-哨兵集群
基于pub/sub机制的哨兵集群
基于pub/sub机制的客户端事件通知
主从切换是那个哨兵执行
参考

Redis核心技术06-哨兵集群

# Redis核心技术06-哨兵集群

相关文章:

Redis深入-哨兵机制 (opens new window)

哨兵机制有三个任务:监控、选主、通知。

其中监控、选主又涉及到决策问题,由于一个哨兵会因为网络原因对某一些决策产生误判,所以为了降低误判率就需要引入多个哨兵,来组成类似一个评审小组。

之前我们重点讨论的是如果主从挂掉之后,如何通过主从切换来保证Redis服务不中断,那么如果哨兵实例在运行时发生故障,主从库还能正常切换吗?

实际上,一旦多个实例组成了哨兵集群,即使有哨兵实例出现故障挂掉了,其他哨兵还能继续协作完成主从库切换的工作,包括判定主库是不是处于下线状态,选择新主库,以及通知从库和客户端。

在配置哨兵的信息时,我们只需要用到下面的这个配置项,设置主库的 IP 和端口,并没有配置其他哨兵的连接信息。

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

但是这些哨兵并不知道彼此的地址,那么是如何组成集群的呢?

# 基于pub/sub机制的哨兵集群

哨兵实例之间可以相互发现,要归功于 Redis 提供的 pub/sub 机制,也就是发布 / 订阅机制。

哨兵只要和主库建立起了连接,就可以在主库上发布消息了,比如发布自己的连接信息(IP和端口)。同时,它也可以从主库上订阅消息,获得其他哨兵发布的连接消息。通过这种方式,当多个哨兵在主库上做了发布和订阅操作后,它们之间就能知道彼此的IP地址和端口。

除了哨兵实例,我们自己编写的应用程序也可以通过 Redis 进行消息的发布和订阅。所以,为了区分不同应用的消息,Redis 会以频道的形式,对这些消息进行分门别类的管理。所谓的频道,实际上就是消息的类别。当消息类别相同时,它们就属于同一个频道。反之,就属于不同的频道。只有订阅了同一个频道的应用,才能通过发布的消息进行信息交换。

在主从集群中,主库上有一个名为_ sentinel _:hello的频道,不同哨兵就是通过它来相互发现,实现互相通信的。

image-20220605104151409

哨兵1将自己连接相关信息发送到_ sentinel _:hello频道上,哨兵2和哨兵3通过订阅_ sentinel _:hello频道上的消息,得知到哨兵1的信息,然后建立连接,形成哨兵集群。

哨兵除了在彼此之间建立连接形成集群外,还需要和从库建立连接。这是因为,在哨兵的监控任务中,它需要对主从库都进行心跳判断,而且在主从库切换完成后,它还需要通知从库,让它们和新主库进行同步。

哨兵是如何知道从库的IP地址和端口呢

哨兵通过给主库发送INFO命令,主库会返回给从库列表的信息。然后,哨兵就可以通过这些列表信息和每个从库建立连接,并开始对这些从库通过发送PING命令进行持续的监控。

image-20220605104824029

通过pub/sub机制,哨兵之间可以建立连接形成哨兵集群,同时,哨兵通过INFO命令可以获得从库连接信息,和从库建立连接并监控。

在之前学习中,哨兵的通知是不光通知从库去和新主库进行连接,还要通知客户端,把发送的请求发送到新的主库上,所以哨兵还需要完成把新主库的信息告诉客户端这个任务。

也就是说客户端要能够获取到哨兵集群在监控、选主、切换这个过程中发生的各种事件。

# 基于pub/sub机制的客户端事件通知

从本质来说,哨兵是一个运行在特殊模式下的Redis进程。只是哨兵不服务请求操作,只负责监控、选主、通知的任务。因此,每个哨兵实例也提供pub/sub机制,客户端可以从哨兵订阅消息。哨兵提供的消息订阅频道有很多,不同频道包含了主从库切换过程中的不同关键事件。

image-20220605110355308

客户端读取哨兵的配置文件后,可以获得哨兵的地址和端口,和哨兵建立网络连接。然后,我们可以在客户端执行订阅命令,来获取不同的事件消息。

有了这些事件通知,客户端不仅可以在主从切换后得到新主库的连接信息,还可以监控到主从库切换过程中发生的各个重要事件。这样,客户端就可以知道主从切换进行到哪一步了,有助于了解切换进度。

通过pub/sub机制,哨兵和哨兵之间、哨兵和主库之间、哨兵和从库之间、哨兵和客户端之间就能建立起连接,再加上主库下线判断和选主依据,哨兵集群的监控、选主和通知三个任务就基本可以正常工作了。

# 主从切换是那个哨兵执行

在进行主从切换的时候,是由多个哨兵进行决策的,采用少数服从多数的原则。多个哨兵的主观下线的仲裁结果就相当于哨兵集群的客观下线。

任何一个实例只要自身判断主库“主观下线”后,就会给其他实例发送 is-master-down-by-addr 命令。接着,其他实例会根据自己和主库的连接情况,做出 Y 或 N 的响应,Y 相当于赞成票,N 相当于反对票。

image-20220605111328363

一个哨兵获得了仲裁所需的赞成票数后,就可以标记主库为“客观下线”。这个所需的赞成票数是通过哨兵配置文件中的 quorum 配置项设定的。

例如现在有5个哨兵,quorum 配置的是 3,那么,一个哨兵需要 3 张赞成票,就可以标记主库为“客观下线”了

此时,这个哨兵相当于征求其他哨兵意见的过程已经结束了,那么这个哨兵还会去征求一次意见让其他哨兵投票给自己去执行主从切换。这个投票过程称为“Leader 选举”。因为最终执行主从切换的哨兵称为 Leader,投票过程就是确定 Leader。

在投票过程中,任何一个想成为 Leader 的哨兵,要满足两个条件:第一,拿到半数以上的赞成票;第二,拿到的票数同时还需要大于等于哨兵配置文件中的 quorum 值。

image-20220605112230547

每个哨兵节点只能投票一次,包括投给自己的也算。

# 参考

Redis核心技术与实战 (opens new window)

#Redis
上次更新: 2024/06/29, 15:13:44
Redis核心技术05-哨兵机制
Redis核心技术07-切片集群

← Redis核心技术05-哨兵机制 Redis核心技术07-切片集群→

最近更新
01
基础概念
10-31
02
Pytorch
10-30
03
Numpy
10-30
更多文章>
Theme by Vdoing | Copyright © 2021-2025 旭日 | 蜀ICP备2021000788号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式