sentinel初始化

sentinel运作

  • 监控:如何获取主服务器,从服务器,其他哨兵的状态信息
  • 提醒:如何与主从服务器沟通
  • 检测下线状态:当有主服务器下线时,如何检测
  • 自动故障迁移

1.Sentinel启动与初始化

启动命令:

redis-sentinel /path/to/your/sentinel.conf

初始化步骤:

  • 启动服务器,使用sentinel专用代码
  • 初始化SentinelState,建立与主服务器的连接

(1)初始化服务器

具体步骤与服务器初始化差不多,但是少了点步骤,比如不会进行RDB/AOF恢复

(2)使用sentinel专用代码

比如:

1.使用 define REDIS_SENTINEL_PORT 26379 作为端口号

2.命令表不一样,只有一些简单的命令

(3)初始化SentinelState

sentinelState专门记录与哨兵有关的状态

sentinelRedisInstance用来记录每个被监视的服务器的消息,这些服务器可以是主服务器,从服务器,或者其他sentinel。其中比较重要的属性有addr(记录这个服务器的ip+端口号),slaves字典(记录它的从服务器),sentinels(监视它的其他sentinels)

struct sentinelState {// 当前纪元,用于实现故障转移uint64_t current_epoch;// 保存了所有被这个 sentinel 监视的主服务器// 字典的键是主服务器的名字// 字典的值则是一个指向 sentinelRedisInstance 结构的指针dict *masters;// 是否进入了 TILT 模式?int tilt;// 目前正在执行的脚本的数量int running_scripts;// 进入 TILT 模式的时间mstime_t tilt_start_time;// 最后一次执行时间处理器的时间mstime_t previous_time;// 一个 FIFO 队列,包含了所有需要执行的用户脚本list *scripts_queue;} sentinel;
struct sentinelRedisInstance {// 标识值,记录了实例的类型,以及该实例的当前状态int flags;// 实例的名字// 主服务器的名字由用户在配置文件中设置// 从服务器以及Sentinel的名字由Sentinel自动设置// 格式为ip:portchar *name;// 实例的运行IDchar *runid;// 配置纪元,用于实现故障转移unit64_t config_epoch;// 实例的地址sentinelAddr *addr;// 实例无响应多少毫秒之后才会被判断为主观下线mstime_t down_after_period;// 判断这个实例为客观下线所需的支持投票数量int quorum;// 在执行故障转移操作时,可以同事对行的主服务器进行同步的从服务器数量int parallel_syncs;// 刷新故障迁移状态的最大时限mstime_t failover_timeout;// 一个主服务器所有从服务器实例dict *slaves;// 监视这个主服务器的所有sentinels实例dict *sentinels;// ...
} sentinelRedisInstance;

(4)连接主服务器

最后一步是创建与主服务器的网络连接。sentinel会创建两个连接:命令连接+订阅连接(__sentinel__:hellp频道)

2.监控

这里监控指:sentinel维护其他主服务器,从服务器,sentinel的状态信息

(1)获取主服务器状态信息

默认每10秒给主服务器发送INFO命令,更新sentinelRedisInstance的信息。

INFO指令返回的信息如下图所示。

(2)获取从服务器状态信息

根据从主服务器那里获取的信息,再对从服务器们创建命令连接和订阅连接,并更新

默认每10秒给从服务器发送INFO命令,获取从服务器信息(如:run_id,角色role,主服务器的ip和端口,连接状态,优先级,偏移量)

(3)获取其他哨兵状态信息

由于Sentinel会用订阅模式给 __sentinel__:hello 频道发信息,每个sentinel收到该信息时:

  • 如果判断出是自己发送的,则忽略
  • 如果是其他sentinel发送的,则将那个sentinel更新到sentinelRedisInstance中

(4)每个主服务器的sentinelRedisInstance如下图所示

3.提醒

这里提醒是指:sentinel向其他发送消息

(1)向主服务器和从服务器发送信息

默认情况下,每2秒发送订阅信息(s_*:自己的信息,m_*:主服务器的信息)

  • 如果发送给主服务器,那么m_*就是它的信息
  • 如果发送给从服务器,那么m_*就是它的主服务器的信息

(2)接受主服务器和从服务器的信息

sentinel订阅了 __sentinel__:hello 频道的信息

4.检测下线状态

检查主观下线(发现某一master可能下线)——> 检查客观下线(询问其他哨兵,确定是否下线) ——> 选举领头

(1)主观下线:自己判断

Sentinel会以每秒1次的频率发送给(从服务器+主服务器+其他哨兵)PING命令。

有效回复为: PONG, LOADING, MASTERDOWN。其他都为无效回复

Sentinel配置文件中的 down-after-milliseconds指定了时间。

eg. sentinel down-after-milliseconds master 50000。

如果master在50秒内都没有进行有效回复,则sentinel认定它已经下线。并把对应的master的flags增加一个标志位 SRI_S_DOWN

(2)客观下线:询问其他

当sentinel主观判断一个主服务器下线后,为了再次确认,会向其他sentinel询问。

2.1 先向其他sentinel发送命令

SENTINEL is-master-down-by-addr <ip> <port> <current_epoch> <runid>
//ip,port为被判断下线的主服务器的ip和port
//current_epoch为配置纪元
//runid:1. * :向其他哨兵检测客观下线
//       2. sentinel的运行id:判断完客观下线后,用于选举领头sentinel

2.2 其他sentinel的回复

<down_state>    //1代表判断主服务器已经下线;0代表未下线<leader_runid>    //*:代表检测下线的回复//runid:用于选举领头哨兵
<leader_epoch>    //当runid=*时:总是为0,无意义//选举时,有效eg.
1) 1
2) *
3) 0这个消息代表其他sentinel也同意服务器下线

2.3 收到其他sentinel的回复

当收到的回复大于一定数量(根据配置信息),该sentinel会认定该主服务器已经客观下线,再增加一个标志位 SRI_O_DOWN

配置: sentinel monitor master 127.0.0.1 6379 5

表示 >=5个时,就认定已经客观下线

(3)选举领头

当一个sentinel主观客观检测都判断主服务器下线后,会继续发送 is-master-down-by-addr 指令。

不过这次的 runid不再是*, 而是自己的id。

每个sentinel在同一个epoch中只能投一票,对最先收到的那个sentinel进行回复投票,内容如 2.2。

当某个sentinel收到的票数>n/2时(比如,n=10,则需要6票),它将成为领头哨兵

5.故障转移

流程:

(1)挑选新的主服务器

(2)让所有从服务器复制新的主服务器

(3)让原来的主服务器变成从服务器

1.选出新的主服务器

领头sentinel会选出新的主服务器,要求如下

(1)必须在线

(2)响应快的(最近与领头sentinel成功通信过的)

(3)最近与原来的主服务器保持联系的(换句话说,从服务器中保存的数据都是比较新的)

(4)如果有多个满足,则排序:优先级——offset——runid

选出新主服务器后,领头sentinel会给其发送 slaveof no one 命令

发送完后,领头sentinel会以每秒一次给它发送INFO命令,当返回的角色从slave变成master后,就确认成功了

2.修改从服务器的复制目标

给其他从服务器发送 slaveof 命令

3.将旧的主服务器变成从服务器

当旧服务器上线时,向其发送 slaveof 命令

Redis——9. 哨兵机制相关推荐

  1. Redis的哨兵机制 或者心跳机制 模式 原理详解

    转载自 https://blog.csdn.net/yswKnight/article/details/78158540 一.什么是哨兵机制? 答:Redis的哨兵(sentinel) 系统用于管理多 ...

  2. Redis的哨兵机制你知道多少撒

    ​有眼光啊,这么多文章你点开了我,缘分,如果我没猜错的话,你是个有梦想的人,是个热爱技术的人,我们一起 手牵手撒 ?(暗示关注~~) 捞一下前面的Redis文章,这是一个系列啊,后续还会出更多Redi ...

  3. (四)Redis——搭建哨兵机制

    一位爱好技术的橘右京的哥哥橘左京 1. 哨兵机制(windows) 1.1 单台哨兵搭建 1.2 哨兵集群搭建 1.3 哨兵集群测试 1.4 哨兵解读 1. 哨兵机制(windows) 为了解决主从复 ...

  4. 缓存框架——Redis的哨兵机制

    文章目录 1. 哨兵任务 2. 哨兵的定时监控任务 2.1 任务1 2.2 任务2 2.3 任务3 3. 主观下线和客观下线 3.1 主观下线 3.2 客观下线 3.3 领导者哨兵选举流程 4. 故障 ...

  5. redis的哨兵机制

    redis哨兵 Redis Sentinel,即Redis哨兵.哨兵的核心功能是主节点的自动故障转移.对比主从复制 redis主从复制 来说,哨兵不需要手动修改主从关系以及配置文件端口等信息,一个节点 ...

  6. Redis支持的数据类型以及使用场景,持久化,哨兵机制,缓存击穿,缓存穿透

    Redis支持的数据类型以及使用场景,持久化,哨兵机制,缓存击穿,缓存穿透 简单介绍一个redis? redis是内存中的数据结构存储系统,一个key-value类型的非关系型数据库,可持久化的数据库 ...

  7. redis 哨兵_Redis哨兵机制的原理介绍

    php中文网最新课程 每日17点准时技术干货分享 本篇文章给大家带来的内容是介绍Redis的哨兵机制,让大家了解哨兵机制的原理和如何实现.有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. ...

  8. Redis高可用方案哨兵机制------ 配置文件sentinel.conf详解

    Redis的哨兵机制是官方推荐的一种高可用(HA)方案,我们在使用Redis的主从结构时,如果主节点挂掉,这时是不能自动进行主备切换和通知客户端主节点下线的. Redis-Sentinel机制主要用三 ...

  9. redis主从复制和哨兵机制

    一.Redis主从复制 主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点保证数据的一致性 1. 主从复制的相关操作 a,配置主从复制方式一.新增redis6380.conf, ...

最新文章

  1. msf反弹shell
  2. 支持向量机学习笔记1
  3. Please use HDF reader for matlab v7.3 files
  4. python进行图片的定位切割_python3 实现对图片进行局部切割的方法
  5. 1.10 梯度消失与梯度爆炸-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  6. VTK:简单操作之ProjectPointPlane
  7. Linux包管理速查表
  8. 什么是HDMI视频光端机?
  9. Dell Latitude D630 无法wubi安装Kubuntu
  10. selenium和PhantomJS的使用
  11. CS231N课程笔记学习一——图像分类
  12. nginx limit_req限速设置
  13. 《HBase权威指南》读书笔记3
  14. 【论文解读】VDN( Variational Denoising Network )变分去噪网络
  15. 三角函数中和差角公式的编辑方法
  16. 浅析大数据与传统经济学
  17. FFplay文档解读-47-多媒体过滤器一
  18. 制图操作案例:ArcGIS Pro鹰眼图快速制图
  19. 初识C语言之详解char类型
  20. 为什么硬盘明明还有空间,linux却说硬盘空间不足?inode;mkdir: 无法创建目录shen1: 设备上没有空间

热门文章

  1. 页面禁止保存、复制、右键、查看源代码、下载、嵌套等【js禁用】【js屏蔽快捷键】
  2. 跨模态语义关联对齐检索-图像文本匹配(Image-Text Matching)CVPR2022
  3. 计算机应用期刊查重嘛,关于期刊投稿,你所碰到的几件事
  4. Tmux 学习摘要3--使用脚本定制 tmux 环境
  5. CoreOS 系统安装后的简单配置-允许root以ssh登录等(二)
  6. thinkphp5多级控制器及其使用
  7. 第七章 在Linux搭建简单的web服务器
  8. Ledger增加浏览器扩展,将硬件钱包与Web 3应用程序连接起来
  9. 从高德上同步省市区行政区划数据到本地数据库demo
  10. 隔离型串口服务器和西门子1500PLC和通讯案例