郑文峰的博客 郑文峰的博客
首页
  • python之路
  • go之路
  • 其他
  • redis
  • mysql
  • docker
  • k8s
读书破万卷
周刊
关于
  • 导航 (opens new window)
  • 代码片段 (opens new window)
  • 收藏
  • 友链
  • 外部页面

    • 开往 (opens new window)
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)

zhengwenfeng

穷则变,变则通,通则久
首页
  • python之路
  • go之路
  • 其他
  • redis
  • mysql
  • docker
  • k8s
读书破万卷
周刊
关于
  • 导航 (opens new window)
  • 代码片段 (opens new window)
  • 收藏
  • 友链
  • 外部页面

    • 开往 (opens new window)
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)
  • mysql

  • redis

    • redis之五种基本数据类型
    • redis之持久化
    • redis之主从库同步
    • redis之哨兵机制
      • 0. 前言
      • 1. 哨兵如何保证高可用?
        • 1.1 监控
        • 1.2 选择新主库
        • 1.3 通知
      • 2. 哨兵集群的组建
        • 2.1 哨兵与从库建立连接
        • 2.2 哨兵与客户端建立连接
      • 3. 由哪个哨兵来执行主从切换 ?
      • 4. 参考文章
    • redis之分片集群
    • redis之缓存
  • 数据库
  • redis
zhengwenfeng
2022-12-01
目录

redis之哨兵机制

# 0. 前言

我们知道,只有主库才能有写操作,而从库只能进行读操作,那么当主库宕机后,如何保证服务的正常进行呢?

本文主要介绍的是 Redis 提供的哨兵机制,通过哨兵监控主库的状况,如果发现主库下线,则会从从库中选择一个状态优秀的当做主库,从而保证服务的高可用。

# 1. 哨兵如何保证高可用?

# 1.1 监控

哨兵进程会发送 PING 命令给主从库检测网络连接,如果超时,则判断为"主观下线"。

但是如果哨兵误判可能会导致主从切换,导致性能的额外开销,所以引入了哨兵集群,只有多数哨兵认为主库已经主观下线,主库会被标记为"客观下线",这时才会进行主从切换。

# 1.2 选择新主库

通过一定的筛选条件,把不符合条件的从库去掉,再按照一定规则给从库打分,得分最高的为新主库

筛选条件:

  • 当前从库的状态
  • 之前一段时间的网络状态

打分规则:

  • 用户可以给从库 slave-priority 配置优先级
  • 主从库同步程度
  • ID 号小的得分高

# 1.3 通知

哨兵会把新主库的连接信息发给其他从库,让它们执行 replicaof 命令,和新主库建立连接,并进行数据复制。同时,哨兵会把新主库的连接信息通知给客户端,让它们把请求操作发到新主库上。

# 2. 哨兵集群的组建

哨兵实例之间互相发现是基于 Redis 提供的 pub/sub 机制,发布/订阅机制。

哨兵只要与主库建立连接,会在主库 __sentinel__:hello 频道上发布消息,比如自己的 ip 地址和端口信息,订阅了该频道的其他哨兵会获取到发布消息哨兵的 IP 和端口,即可以与其建立网络连接,之后相互间就可以通过网络连接进行通信。

# 2.1 哨兵与从库建立连接

哨兵还需要和从库建立连接,这样才能监控从库的连接状态,当主库下线后,才能从它们中选举出新的主库。

哨兵使用 INFO 命令发送给主库,主库会返回从库列表连接信息,这样也能和从库建立连接并进行监控

# 2.2 哨兵与客户端建立连接

当主库下线后,客户端需要得知主库下线的消息,写操作需要切换到新的主库中,所以哨兵需要与客户端建立连接,并及时通知客户端。

客户端可以从哨兵订阅消息,获取到主从切换的各种事件。

客户端读取哨兵的配置文件,获取哨兵的地址和端口,建立连接,然后即可订阅消息。

# 3. 由哪个哨兵来执行主从切换 ?

任何一个哨兵判断主库 主观下线 就会向其他哨兵发送 is-master-down-by-addr 命令。其他实例会更具自己与主库的连接情况投出赞成票或反对票。当多数哨兵投赞成票时,则主库被认为 客观下线。

此时,该哨兵再发命令给其他哨兵进行 leader选举,希望由自己来进行主从切换。在这个过程中,任何一个哨兵都可以参与选举,只要票数半数以上并且大于等于 quorum 值,则可以成为 leader

# 4. 参考文章

  • 本文主要是学习《极客时间-redis 核心技术与实战》专栏总结而来
#redis#数据库
上次更新: 2023/01/15, 15:47:48
redis之主从库同步
redis之分片集群

← redis之主从库同步 redis之分片集群→

最近更新
01
django rest_framework 分页
03-20
02
学习周刊-第03期-第09周
03-03
03
学习周刊-第02期-第08周
02-24
更多文章>
Theme by Vdoing | Copyright © 2022-2023 zhengwenfeng | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式