C++ 全栈知识体系C++ 全栈知识体系
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
  • 数据库原理

    • 数据库原理 - MySQL概述
    • 数据库原理 - 数据库是如何工作的
  • SQL语言

    • SQL语言 - 知识体系结构
    • SQL语言 - 语法
    • SQL语言 - 约束
    • SQL语言 - 函数
    • SQL语言 - 连接查询
    • SQL语言 - 多表查询
    • SQL语言 - 子查询
    • SQL语言 - 使用技巧
  • SQL - MySQL

    • MySQL基础

      • ♥MySQL语言知识体系详解♥
      • MySQL基础 - 基本概念
      • MySQL基础 - 三范式
      • MySQL基础 - 数据类型
      • MySQL基础 - 视图
      • MySQL基础 - 存储过程
    • MySQL进阶

      • MySQL进阶 - 存储引擎
      • MySQL进阶 - InnoDB引擎
      • MySQL进阶 - 索引基础
      • MySQL进阶 - 聚簇索引和非聚簇索引
      • MySQL进阶 - 索引使用
      • MySQL进阶 - SQL性能分析
      • MySQL进阶 - SQL性能优化
      • MySQL进阶 - 锁
      • MySQL进阶 - 触发器
      • MySQL进阶 - 事务
      • MySQL进阶 - 管理工具
    • MySQL运维

      • MySQL运维 - 主从复制
      • MySQL运维 - 分库分表
      • MySQL运维 - 读写分离
      • MySQL进阶 - 日志分析
    • MySQL实战

      • MySQL实战 - 一条 SQL 的执行过程详解
      • MySQL实战 - SQL是如何解析的
      • MySQL实战 - MyCat使用
  • NoSQL - Redis

    • Redis基础 - 简介
    • Redis基础 - 命令
    • Redis进阶 - 持久化
    • Redis进阶 - 事务
    • Redis进阶 - 删除策略
    • Redis进阶 - 主从复制
    • Redis进阶 - 哨兵模式
    • Redis应用 - 集群概念以及应用
    • Redis应用 - 企业级解决方案
  • NoSQL - ElasticSearch

    • ElasticSearch集群 - 概念
    • ElasticSearch集群 - 安装
    • ElasticSearch集群 - 部署
    • ElasticSearch数据 - 分析与处理
    • ElasticSearch数据 - 搜索
    • ElasticSearch数据 - 存储
    • ElasticSearch应用 - ES与MySQL数据同步

Redis进阶 - 哨兵模式

  • 简介
  • 启动哨兵模式
  • 哨兵工作原理
    • 监控阶段
    • 通知阶段
    • 故障转移阶段
  • 三个阶段总结

简介

在主从复制下,redis服务器存在一个master和多个slave同时在工作。如果这时候,主机宕机,会发生什么情况,即数据写服务没人复制,且从机的数据也无法实现同步。

针对上述场景,引入了哨兵模式的概念,哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,

哨兵模式

哨兵的作用:

  1. 监控
  • 不断的检查master和slave是否正常运行。
  • master存活检测、 master与slave运行情况检测
  1. 通知(提醒)
  • 当被监控的服务器出现问题时,向其他(哨兵间,客户端) 发送通知。
  1. 自动故障转移
  • 断开master与slave连接,选取一个slave作为master,将其他slave连接到新的master,并告知客户端新的服务器地址

哨兵模式

Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:

  • 主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线。

  • 客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。

哨兵模式

启动哨兵模式

配置哨兵:

  1. 配置一拖二的主从结构
  2. 配置三个哨兵
  3. 启动哨兵
启动顺序,先主机,后从机,最后哨兵
 
cd /home/believe123/myproject/redis/sentinel/
 
分别开三个窗口,启动主从机
redis-server ./redis-6379.conf
redis-server ./redis-6380.conf
redis-server ./redis-6381.conf
 
分别开三个窗口,启动三个哨兵
redis-sentinel ./sentinel-26379.conf
redis-sentinel ./sentinel-26380.conf
redis-sentinel ./sentinel-26381.conf
 
当主机宕机时,例如6379下线,6381被投票选举为主机,等待6379上线的时,它就变成了6381的从机。

手动杀死master服务器,6381变为master:

手动杀死master

重新连接6379,6379就作为6381的从机进行数据同步:

6379重新连接

配置文件内容如下:

哨兵配置文件

且运行过程中sentinel*.conf文件会被重写:

sentinel配置文件重写

哨兵工作原理

哨兵在进行主从切换过程中经历三个阶段:

  • 监控阶段
  • 通知阶段
  • 故障转移阶段

监控阶段

监控阶段

sentinel与master之间维持着cmd连接,来通过info获取其状态信息,通过定时ping操作维护各个 sentinel的通信。

通知阶段

通知阶段

每个时段,挑选出一个 sentinel 来获取master和slave的info,并通过sentinel之间的pulish和subcribe操作,将信息广播给其他sentinel。

故障转移阶段

故障转移阶段

当其中一个哨兵sentinel1发现master下线时,通知其他哨兵(sentinel2、sentinel3),然后其他哨兵尝试给master发送消息,如果发现master真的下线,则将flags:SRI_S_DOWN转换为flags:SRI_O_DOWN。

该策略实现是配置:
sentinel monitor mymaster 127.0.0.1 6379 2
 
说明:设置哨兵监听的主服务器信息,最后的参数决定了最终参与选举的服务器数量

通过投票先选举出哪个ID的sentinel去选举master:

投票选举

选举新的master,选举规则:

服务器列表中挑选备选master:

  • 在线的
  • 响应快的
  • 与原master断开时间短的
  • 优先原则
    • 优先级
    • offset
    • runid

发送指令( sentinel )

  • 向新的master发送slaveof no one
  • 向其他slave发送slaveof 新masterIP端口

三个阶段总结

  1. 监控阶段

    • 同步信息
  2. 通知阶段

    • 保持联通
  3. 故障转移阶段

    • 发现问题
    • 竞选负责人
    • 优选新master
    • 新master上任,其他slave切换master,原master作为slave故障回复后连接
Last Updated:
Contributors: klc407073648
Prev
Redis进阶 - 主从复制
Next
Redis应用 - 集群概念以及应用