Redis Sentinel

cxyAtuo 2019-09-25 原文

Redis Sentinel

 这节介绍Redis的高可用解决方案:Sentinel

1.介绍

 Sentinel是Redis官方推荐的高可用(HA)解决方案,当用Redis做master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换。

 Sentinel本身是一个运行在特殊模式下的Redis服务器,它能监控多个master-slave集群,发现master宕机后能进行自动切换。

2.获取信息方式

 sentinel通过配置项中的

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

选项来获取master节点的信息。

 在启动后sentinel会建立同master节点的命令连接和订阅连接。以便通过命令连接向主节点发送命令,通过订阅连接订阅服务器的 sentinel:hello 频道。

file

 sentinel每10秒会向master节点发送INFO命令,通过分析命令的返回结果能够知道主节点和从节点的信息。对于每个从节点,sentinel也会向它建立一个命令连接和订阅连接。

 sentinel每2秒通过命令连接向所监听的节点发送订阅命令,如

    PUBLISH _sentinel_:hello …..

其中的信息包括了sentinel本身的信息以及自己记录的主节点信息。同时,sentinel也会订阅_sentinel_:hello频道,所以sentinel能够以这种方式同其他的sentinel节点通信,以同步信息,见goosip协议

 当sentinel从订阅信息中发现一个新的sentinel节点时,会向该新发现的节点建立命令连接,最后监视同一主服务器的各个sentinel节点会形成互相连接的网络。

file

3.节点失效

 配置项

    sentinel down-after-milliseconds <主节点名> <中断时间ms>

设置了sentinel主观下线的时间。sentinel每隔一秒就会向主节点发送PING命令,如果master在“中断时间”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了(SDOWN)。

 当sentinel判断主节点已经处于主观下线状态后,会向其他sentinel发送

 is-master-down-by-add

命令,以询问其他sentinel的状态,确认该主节点是否处于下线状态(主观下线或者客观下线)。当回复的下线状态的数量达到配置项中的quorum值时,则该sentinel会将主节点标记为客观下线状态(ODOWN)。

 当sentinel判断主节点处于客观下线状态后,会触发故障转移。

4.故障转移

 发生故障转移时,会从监听主节点的sentinel中选举出主的sentinel来处理故障转移的过程。选举的过程类似于Raft协议,由标记客观下线的sentinel节点充当candidate,向其他sentinel节点(follower)发起投票,当某个candidate从follower获得的票数超过一半后,该候选者就会成为leader。而sentinel中的epoch,配置纪元类似于Raft中的term,每次选举后都会自增。主要过程为:

  1. 每个充当candidate的sentinel节点都会要求其他sentinel节点发送is-master-down-addr命令,将自己设置为leader。

  2. 收到命令的sentinel节点,如果当前epoch和candidate传给他的epoch一样,说明他已经把自己的票投给了其他candidate。投过票给别的sentinel后,在当前epoch内自己就只能成为follower。如果该节点还没投过票,会采取先到先得的规则,将自己的票投给请求的candidate节点。

  3. 收到回复的candidate节点,会检查响应的epoch值和leader_runid值是否同自身的值一致,是的话则表示获得了一票。

  4. 当某个candidate节点获得半数以上的票数时,该节点便成为了leader节点。

  5. 如果一定时间内没法选举出leader节点,则每个candidate节点会等待随机时间后再次发起选举,知道选出leader节点为止。

 选举出领头sentinel节点后,将由该节点处理故障转移,过程如下:

  1. 在已下线主节点的所有从节点中,选出一个从节点,将其转换为主节点。

     主sentinel会按照下面的规则选择适合的slave节点上升为master节点:

    1) 去除已下线的slave节点

    2) 去除最近五秒内没有回复过主sentinel节点INFO信息的slave节点

    3) 去除与已下线主节点连接断开超过down-after-milliseconds*10毫秒的slave节点

    4) 根据各slave节点的优先级,从小到大排序,选择优先级最小的节点。对于相同优先级的节点,选择复制偏移量最大和runid最小的节点。

     最后向被选择出来的slave节点发送SLAVE OF NO ONE命令。

  2. 向已下线主节点下的所有从节点发送SLAVE OF命令,改为复制新的主节点。

  3. 将已下线主节点设置为新主节点的从节点。

 其中,上面步骤1)中的slave节点优先级由redis配置文件中的slave-priority N选项控制。0作为一个特殊的优先级,标识这个slave不能作为master,所以一个优先级为0的slave永远不会被
哨兵挑选提升为master。

 上步骤2) 中,从节点需要同步新的主节点的信息,期间会导致从节点不可用,可以通过

    sentinel parallel-syncs mymaster <n>

来控制同时进行同步的从节点的数量。这个数字越小,完成故障转移所需的时间就越长,但是如果这个数字越大,就意味着越多的slave因为复制而不可用。

5.脑裂时的数据一致性

 Redis不保证强一致性,在发生网络故障时,有可能出现脑裂。从脑裂发生到网络恢复正常,复制结束的这段时间里,异常主节点写入的数据将丢失。为了避免数据的丢失,可以对主节点增加如下配置:

    min-slaves-to-write 1   #执行写操作所需的最少slave服务器数量,如果数量少于设定的值,写操作将被拒绝
    
    min-slaves-max-lag 10   #网络延迟的最大时间,当写操作延迟大于所设定的时间,写操作将被拒绝

file

个人公众号:啊驼

发表于
2019-09-25 06:20 啊驼 阅读() 评论() 编辑 收藏

 

版权声明:本文为cxyAtuo原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/cxyAtuo/p/11582178.html

Redis Sentinel的更多相关文章

  1. Redis3集群安装

    1. 什么是Redis Redis是目前一个非常优秀的key-value存储系统。和Memcached类似,它 […]...

  2. Redis 字典结构细谈

    Redis 字典底层基于哈希表实现。 一、哈希表结构 1、dictht: typedef struct dic […]...

  3. 8套JAVA架构师全套视频。集群、高可用、高可扩展、高性能、高并发、性能优化 Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战

    大多程序员在工作三、四年后,就会对自工作有所懈怠,因为程序员在工作三四年后,项目开发所需要的知识基本已经从工作 […]...

  4. Redis全方位讲解–主从复制和哨兵模式

    前言   前面介绍了redis持久化和容灾备份,这篇会介绍redis主从复制和redis持久化在主从复制中的一 […]...

  5. 非关系型数据库redis-java基本操作

    概述       redis是一个key-value的nosql数据库(非关系型数据库)。支持存储的value […]...

  6. 源码分析 Sentinel 之 Dubbo 适配原理

    在Alibaba Sentinel 限流与熔断初探(技巧篇) 的示例中我选择了 sentinel-demo-a […]...

  7. Redis 命令执行过程(下)

    在上一篇文章中《Redis 命令执行过程(上)》中,我们首先了解 Redis 命令执行的整体流程,然后细致分析 […]...

  8. 五、Python操作redis

    五、Python操作redis一、python对redis基本操作(1)连接redis# 方式1import redisr = redis.Redis(host='127.0.0.1', port=6379)r.set('foo'...

随机推荐

  1. Dockerfile 实践及梳理

    Dockerfile 是一个文本文件,我们可以通过组合一条条的指令 (Instruction),来构建满足我们 […]...

  2. fastdfs集群存储节点服务启动脚本

    线上环境集群storage节点启动脚本 #!/bin/bash #chkconfig: 2345 15 85 […]...

  3. 美学设计—黄金分割与九宫格 – analyzer

    构图一词是英语COMPOSITION的译音,为造型艺术的术语。在《辞海》中,谈到“构图”为艺术家为了表现作品的 […]...

  4. Keil共存的方法 – Keil MDK兼容Keil C51,实操可行

    记录一下成功使Keil MDK和Keil C51共存的过程! 之前一直用Keil C51开发,最近需要用到AR […]...

  5. iphone开发笔记(三) – Tracy E

    iphone开发笔记(三) 2010-08-21 20:35  Tracy E  阅读(1338)  评论(4 […]...

  6. Captcha验证码

    验证码 URL url(r\'^captcha/$\', views.CaptchaView.as_view( […]...

  7. 用WPF实现大数据展示,超炫的效果

    开头语         经过一段时间研究,终于实现CS和BS相同效果的大数据展示平台了。首先来看看实现的效果, […]...

  8. git server“丢失”commit问题探究

    1 背景 gitlab某仓库有同事发现部分代码文件内容丢失,具体表现 A. dev分支commit信息是连续的 […]...

展开目录

目录导航