精华内容
下载资源
问答
  • 哨兵原理
    2018-11-04 10:55:12

    本博文主要总结关于哨兵的一些理论知识,主要关注点有一下几个方面:

    一、哨兵解决了什么问题?

    二、哨兵是如何解决“问题一”的?

    三、如何使用哨兵?

    四、Redis Sentinel客户端实现的原理是什么?Java如何操作Redis Sentinel?

     

    一、哨兵解决了什么问题?

    这个问题要从Redis主从模式说起。Redis的主从模式可以将主节点的数据改变同步给从节点,从节点就可以起到两个作用:

    (1)作为主节点的一个备份。一旦主节点出现了故障,不可达,从节点可以作为后备,顶上来,保证数据尽量不丢失。

    (2)从节点可以扩展主节点的读能力。如果主节点撑不住大量并发的读操作,此时可以分担主节点的读能力。

    主从复制也随之带来了一下几个问题:

    (1)一旦主节点出现了故障,需要手动的将一个从节点晋升为主节点,同时需要修改应用方(即客户端)的连接主节点的地址和端口号。还需要命令其他从节点去复制新的主节点,这整个过程都需要人工的操作。

    (2)主节点的写能力、存储能力收到单机的限制。

    第(1)个问题就是Redis的高可用问题了,第(2)个问题是Redis分布式的问题。这里主要总结第一个问题,Redis的高可用问题。

    Redis 哨兵就能解决这个问题。其实,哨兵不止解决了自动故障转移问题,还能提供监控Redis主从数据库、提醒的重要功能。

    因此,哨兵具有以下功能:

    监控:哨兵节点定期检测Redis数据节点,其余哨兵节点是否可达;

    通知:哨兵节点会将故障转移的结果通知给应用方;

    主节点故障转移:实现从节点晋升为主节点并维护后续正确的主从关系;

    配置提供者:在Redis哨兵结构中,客户端在初始化的时候连接的哨兵节点集合,从中获取主节点信息。

     

    下一篇:Redis哨兵原理总结(二) 将介绍哨兵是如何解决第(1)个问题。

    更多相关内容
  • 哨兵原理

    2021-04-21 14:12:06
    sdown是主观宕机,就一个哨兵如果自己觉得一个master宕机了,那么就是主观宕机 odown是客观宕机,如果quorum数量的哨兵都觉得一个master宕机了,那么就是客观宕机 sdown达成的条件很简单,如果一个哨兵ping一个...

    1、sdown和odown转换机制

    sdown和odown两种失败状态

    sdown是主观宕机,就一个哨兵如果自己觉得一个master宕机了,那么就是主观宕机

    odown是客观宕机,如果quorum数量的哨兵都觉得一个master宕机了,那么就是客观宕机

    sdown达成的条件很简单,如果一个哨兵ping一个master,超过了is-master-down-after-milliseconds指定的毫秒数之后,就主观认为master宕机

    sdown到odown转换的条件很简单,如果一个哨兵在指定时间内,收到了quorum指定数量的其他哨兵也认为那个master是sdown了,那么就认为是odown了,客观认为master宕机

    2、哨兵集群的自动发现机制

    哨兵互相之间的发现,是通过redis的pub/sub系统实现的,每个哨兵都会往__sentinel__:hello这个channel里发送一个消息,这时候所有其他哨兵都可以消费到这个消息,并感知到其他的哨兵的存在

    每隔两秒钟,每个哨兵都会往自己监控的某个master+slaves对应的__sentinel__:hello channel里发送一个消息,内容是自己的host、ip和runid还有对这个master的监控配置

    每个哨兵也会去监听自己监控的每个master+slaves对应的__sentinel__:hello channel,然后去感知到同样在监听这个master+slaves的其他哨兵的存在

    每个哨兵还会跟其他哨兵交换对master的监控配置,互相进行监控配置的同步

    3、slave配置的自动纠正

    哨兵会负责自动纠正slave的一些配置,比如slave如果要成为潜在的master候选人,哨兵会确保slave在复制现有master的数据; 如果slave连接到了一个错误的master上,比如故障转移之后,那么哨兵会确保它们连接到正确的master上

    4、slave->master选举算法

    如果一个master被认为odown了,而且majority哨兵都允许了主备切换,那么某个哨兵就会执行主备切换操作,此时首先要选举一个slave来

    会考虑slave的一些信息

    (1)跟master断开连接的时长
    (2)slave优先级
    (3)复制offset
    (4)run id

    如果一个slave跟master断开连接已经超过了down-after-milliseconds的10倍,外加master宕机的时长,那么slave就被认为不适合选举为master

    (down-after-milliseconds * 10) + milliseconds_since_master_is_in_SDOWN_state

    接下来会对slave进行排序

    (1)按照slave优先级进行排序,slave priority越低,优先级就越高
    (2)如果slave priority相同,那么看replica offset,哪个slave复制了越多的数据,offset越靠后,优先级就越高
    (3)如果上面两个条件都相同,那么选择一个run id比较小的那个slave

    5、quorum和majority

    每次一个哨兵要做主备切换,首先需要quorum数量的哨兵认为odown,然后选举出一个哨兵来做切换,这个哨兵还得得到majority哨兵的授权,才能正式执行切换

    如果quorum < majority,比如5个哨兵,majority就是3,quorum设置为2,那么就3个哨兵授权就可以执行切换

    但是如果quorum >= majority,那么必须quorum数量的哨兵都授权,比如5个哨兵,quorum是5,那么必须5个哨兵都同意授权,才能执行切换

    6、configuration epoch

    哨兵会对一套redis master+slave进行监控,有相应的监控的配置

    执行切换的那个哨兵,会从要切换到的新master(salve->master)那里得到一个configuration epoch,这就是一个version号,每次切换的version号都必须是唯一的

    如果第一个选举出的哨兵切换失败了,那么其他哨兵,会等待failover-timeout时间,然后接替继续执行切换,此时会重新获取一个新的configuration epoch,作为新的version号

    7、configuraiton传播

    哨兵完成切换之后,会在自己本地更新生成最新的master配置,然后同步给其他的哨兵,就是通过之前说的pub/sub消息机制

    这里之前的version号就很重要了,因为各种消息都是通过一个channel去发布和监听的,所以一个哨兵完成一次新的切换之后,新的master配置是跟着新的version号的

    其他的哨兵都是根据版本号的大小来更新自己的master配置的

    展开全文
  • 本文将要介绍的哨兵,它基于Redis主从复制,主要作用便是解决主节点故障恢复的自动化问题,进一步提高系统的高可用性。(注:文章内容基于Redis3.0版本)在介绍哨兵之前,首先从宏观角度回顾一下Redis实现高可用相关...
  • 一、哨兵机制 1、哨兵的概念 Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器...

    一、哨兵机制 Sentinel

    1、哨兵的概念

    • Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。简单的说哨兵就是带有自动故障转移功能的主从架构
    • 简单来说, 当一个master节点的redis服务挂掉了, sentinel机制会发现, 并从剩余的slave节点的redis服务中, 选举出一个slave, 来充当新的master节点。

    在这里插入图片描述

    • 哨兵(sentinel)是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave连接到新的master。

    在这里插入图片描述

    2、哨兵的作用

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

    注意:

    • 哨兵也是一台redis服务器,只是不提供数据服务
    • 通常哨兵配置数量为单数(选举master防止同票)

    二、启用哨兵机制

    在这里插入图片描述

    在同一个服务器中如何模拟三个哨兵服务呢?

    • 将Redis安装包中的配置文件sentinel.conf拷贝出来, 然后在sentinel.conf中修改端口, 以及设置master的端口地址, 然后通过redis-sentinel sentinel-端口号.conf即可
    • 启动哨兵, redis-cli -p 26379

    在这里插入图片描述
    在这里插入图片描述
    当启动哨兵服务后, 每一个哨兵都会相互注册, 此时sentinel.conf配置文件以及修改了;
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    二、哨兵机制的原理

    主从切换
    • 哨兵在进行主从切换过程中经历三个阶段
      • 监控
      • 通知
      • 故障转移

    1、监控阶段

    就是上面我们启动各个哨兵服务的时候, 不同的哨兵服务的信息会相互监控, 包括master节点的信息以及master节点的slave节点信息; 能拿到master节点信息是因为在哨兵的配置文件sentinel.conf中配置了master节点的ip,端口地址;

    • 一个哨兵服务, 可以监控其他的哨兵, 还可以监控master节点的信息, 以及该master节点下的slave节点的信息。
      在这里插入图片描述
    • 多个哨兵服务之间可以相互通信, 它们是一个小圈子, 它们直接通过 发布订阅 的方式来相互通知
      在这里插入图片描述

    2、通知阶段

    在这里插入图片描述

    3、故障转移阶段

    • 首先sentinel1master发送hello指令, 此时master没有任何反应, 也拿不到它的信息, 标记master为SRI_S_DOWN(主观下线); 此时该sentinel1会在它的小圈子(sentinel系统)中说, master挂掉了; 此时sentinel2、sentinel3也都向master发送hello指令, 也得不到回应(或者超过半数), 此时该master确定挂掉了, 标记为SRI_O_DOWN(客观下线);

    在这里插入图片描述
    下一步就是清理该master了, 也就是将宕机的master下线, 首先要在多个sentinel中选举一个来清理; 在多个sentinel中通过投票来选举出来一个领头的sentinel;
    在这里插入图片描述

    然后领头的sentinel会从多个slave中挑选一个来充当master

    在这里插入图片描述

    具体选举的要求
    • 由推选出来的哨兵对当前的slave进行筛选,筛选条件有:
      • 服务器列表中挑选备选master
      • 在线的
      • 响应慢的
      • 与原master断开时间久的
      • 优先原则
        • 优先级
        • offset
        • runid
      • 发送指令( sentinel )
        • 向新的master发送slaveof no one(断开与原master的连接)
        • 向其他slave发送slaveof 新masterIP端口(让其他slave与新的master相连)

    在这里插入图片描述

    4、详细解读sentinel服务打印的信息

    在这里插入图片描述

    展开全文
  • redis-哨兵原理.png

    2021-07-18 14:11:11
    redis-哨兵原理.png
  • Redis的哨兵架构

    sentinel哨兵是特殊的Redis服务,不提供读写服务,主要用来监控redis实例节点,实现自动故障转移

    一、Redis哨兵架构搭建

    1. 基于主从架构搭建一主两从架构
      在这里插入图片描述

    2. 准备开启三个哨兵节点,这里演示安装26379

    3. 复制sentinel.conf到26379目录下(目录自己指定)
      在这里插入图片描述

    4. 修改sentinel.conf配置

    port 26379
    
    daemonize yes
    
    pidfile "/var/run/redis‐sentinel‐26379.pid"
    
    logfile "26379.log"
    
    dir "/usr/local/redis/26379/"
    
    # sentinel monitor <master‐redis‐name> <master‐redis‐ip> <master‐redis‐port> <quorum>
    # quorum是一个数字,指明当有多少个seninel(值一般为:sentinel总数/2+1)认为一个master失效时master才算失效
    # mymaster 自己定义,客户端访问时需要
    sentinel monitor mymaster 192.168.1.110 6379 2
    
    1. 启动哨兵实例
    ./bin/redis-sentinel ./26379/sentinel/sentinel.conf
    ./bin/redis-sentinel ./26380/sentinel/sentinel.conf
    ./bin/redis-sentinel ./26381/sentinel/sentinel.conf
    
    1. 查看哨兵是否启动成功
      在这里插入图片描述
    2. info命令查看哨兵信息
      在这里插入图片描述
    3. 查看sentinel.conf中的redis节点信息
      在这里插入图片描述

    二、Java中使用哨兵架构

    哨兵架构模式中,客户端访问Redis服务,第一次从哨兵服务中获取Redis主节点信息,后续就会直接访问主节点,不会再通过哨兵代理访问,当主节点发送变化后,哨兵会立即将新的主节点信息通知客户端(客户端一般都订阅了哨兵发布的节点变动信息)

    1. 引入依赖
    <dependency>
       <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>22.0</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <!-- <scope>test</scope>-->
    </dependency>
    
    1. 测试代码
    /**
     * Jedis连接哨兵架构
     */
    public class JedisSentinelTest {
    
        JedisSentinelPool jedisSentinelPool = null;
    
        @Before
        public void connect(){
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(20);
            config.setMaxIdle(10);
            config.setMinIdle(5);
    
            String masterName = "mymaster";
    
            Set<String> sentinels = new HashSet<>();
            sentinels.add(new HostAndPort("192.168.1.110",26379).toString());
            sentinels.add(new HostAndPort("192.168.1.110",26380).toString());
            sentinels.add(new HostAndPort("192.168.1.110",26381).toString());
    
            jedisSentinelPool = new JedisSentinelPool(masterName,sentinels,config,3000,null);
    
        }
    
        @Test
        public void testSentinel(){
            Jedis jedis = null;
    
            try {
                jedis=jedisSentinelPool.getResource();
                System.out.println(jedis.set("sentinel","1"));
                System.out.println(jedis.get("sentinel"));
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (jedis!=null){
                    jedis.close();
                }
            }
        }
    }
    
    
    1. 运行结果
      在这里插入图片描述

    三、哨兵机制原理

    1. 哨兵机制解决了什么问题

    哨兵主要是为了解决主从复制架构中出现宕机的情况,在主节点出现宕机时,哨兵会自动将主节点下的某个从节点升级为新的主节点

    2. 哨兵定时监控

    1. 每个哨兵节点每10秒会向主节点和从节点发送info命令获取最新拓扑结构图,哨兵配置时只需要配置对主节点的监控即可,通过向主节点发送info命令,获取从节点的信息,并且当有新的从节点时可以立马感知到
    2. 每个哨兵节点每2秒会像redis数据节点的指定频道上发送该哨兵节点对于主节点的判断以及当前哨兵节点的信息,同时每个哨兵节点也会订阅该频道,来了解其他哨兵对主节点状态的判断,其实就是通过消息publish/subscribe来完成的
    3. 每一秒每个哨兵会向主节点,从节点,其他哨兵节点发送一次ping命令做一次心跳检测,这个也是哨兵用来判断节点是否正常的重要依据

    3. 主观下线与客观下线

    3.1 主观下线

    主观下线就是单个哨兵认为某个节点下线

    哨兵会以每秒一次的频率向所有与其建立连接的实例(主节点,从节点,其他哨兵节点)发送ping命令,通过判断ping回复是否有效,还是无效来判断实例是否在线

    3.2 客观下线

    当主观下线的节点是主观节点时,认为主节点主观下线的哨兵节点会通过指令sentinel is-masterdown-by-addr寻求其他哨兵节点对主节点的判断,当主观下线的个数超过quorum个数,此时大部分哨兵节点会都同意下线,这就是客观下线

    4. 哨兵leader选举流程

    主节点被判定为客观下线后,就需要选取一个哨兵节点来完成故障转移的工作,选举哨兵leader的流程如下:

    1. 每个在线的哨兵节点都可以成为leader,当它确认主节点下线后,会向其他哨兵发送is-master-down-by-addr命令,征求判断并要求把自己设置为leader
    2. 其他哨兵接收到这个命令后,可以同意或者拒绝它成为领导者
    3. 如果哨兵发现自己在选举的过程中的票数大于等于(sentinel/2 +1)时,它将成为leader,如果没有,继续选举

    5. 自动故障转移

    5.1 选择新的主节点

    哨兵状态数据结构中保存了主服务的所有从服务的信息,哨兵leader会按照一定的规则选择出一个从节点成为新的主节点,选择规则如下:

    1. 过滤掉主观下线的节点
    2. 选择slave-priority最高的节点,如果有就返回,没有就继续选择
    3. 选择出复制偏移量最大的节点,复制偏移量越大则数据复制的越完整,有则返回,没有则继续
    4. 选择run_id最小的节点

    5.2 更新主从状态

    通过slaveof no one命令,让选择出来的从节点变为主节点,并通过slaveof命令让其他节点成为从节点
    将已下线的主节点设置为新主节点的从节点,当它恢复正常时,从新的主节点复制数据
    其他下线的从节点恢复正常时,哨兵会向其发送slaveof命令,让他成为新主的从节点

    展开全文
  • redis 的哨兵原理能介绍一下么? 面试官心理分析 其实问这个问题,主要是考考你,redis 单机能承载多高并发?如果单机扛不住如何扩容扛更多的并发?redis 会不会挂?既然 redis 会挂那怎么保证 redis 是高可用的?...
  • Redis 哨兵模式原理

    千次阅读 2021-03-21 09:20:58
    Redis 哨兵模式原理
  • redis哨兵原理

    2021-11-17 06:15:32
    哨兵是redis集群架构中非常重要的一个组件 主要功能如下: 集群监控,负责监控redis master和slave进程是否正常工作 消息通知,如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员 故障转移,...
  • Redis(一)哨兵模式原理

    千次阅读 2021-12-03 16:05:00
    文章目录Redis哨兵模式原理工作原理如何判断master宕机主观下线(SDOWN)客观下线(ODOWN)哨兵leader选举选举原理选举过程故障转移配置版本号配置传播哨兵和副本的自动发现没有故障转移的情况下哨兵实例的重新配置...
  • redis 的哨兵原理能介绍一下么? 面试官心理分析 其实问这个问题,主要是考考你,redis 单机能承载多高并发?如果单机扛不住如何扩容扛更多的并发?redis 会不会挂?既然 redis 会挂那怎么保证 redis 是高可用的?...
  • 目录一、redis主从复制原理二、哨兵监控集群节点过程三、rsync远程同步 一、redis主从复制原理 1、主节点发送SYNC同步请求 2、主节点收到请求后 ,派生子进程fork,进行全量复制(RDB快照)(注意这时还有数据在不断...
  • Redis哨兵模式原理

    千次阅读 2022-05-12 13:24:38
    Redis哨兵模式原理一、哨兵模式二、配置三、检测异常(主观下线)四、客观下线五、故障转移六、使用七、缺点 一、哨兵模式 哨兵模式是Redis可用性的解决方案;它由一个或多个 sentinel 实例构成 sentinel 系统;该...
  • Redis哨兵机制原理详解

    万次阅读 多人点赞 2021-01-15 23:53:31
    哨兵模式:(心跳检测机制) 前面说到主从模式其实是一种数据的备份方式,如果master宕机了,需要手动切换,并且还要切换客户端的连接数据源。这就无法达到高可用。哨兵模式就可以解决这一问题。 哨兵是特殊的...
  • 一、哨兵简介1、哨兵的介绍 2、哨兵的核心知识 3、为什么redis哨兵集群只有2个节点无法正常工作? 4、经典的3节点哨兵集群 二、数据丢失 1、两种数据丢失的情况 2、解决异步复制和脑裂导致的数据丢失 三、...
  • redis sentinel 哨兵原理,配置和使用

    千次阅读 2017-09-19 10:26:46
    redis sentinel 哨兵原理介绍,安装配置,使用说明,sentinel整合spring配置和使用;以及redis sentinel 常用命令解析和配置文件详解
  • Redis哨兵模式(原理剖析)

    千次阅读 2021-01-01 17:27:45
    文章目录系列文章目录前言一、Sentinel模式概述二、配置哨兵模式1.启动哨兵总结 前言 在Redis中主从复制解决高可用的方案是:当主节点服务器宕机后,需要手动把一台从节点服务器切换为主节点服务器,手动实现老大...
  • redis 哨兵原理

    2020-05-26 21:28:13
    5、quorum(最终要达到的票数)和majority 每次一个哨兵要做主备切换,首先需要quorum数量的哨兵认为odown,然后选举出一个哨兵来做切换,这个哨兵还得得到majority哨兵的授权,才能正式执行切换 如果quorum ,比如5...
  • Redis哨兵原理

    2022-05-06 22:50:25
    本文是对(46条消息) Redis哨兵集群中哨兵挂了,主从库还能切换吗?_码农架构的博客-CSDN博客_redis 哨兵挂了的二次总结 文章目录通信方式哨兵如何为客户端提供可读的从库哨兵进行主从切换过程分为两大步第一步:判定...
  • redis 的哨兵原理能介绍一下么? 面试官心理分析 其实问这个问题,主要是考考你,redis 单机能承载多高并发?如果单机扛不住如何扩容扛更多的并发?redis 会不会挂?既然 redis 会挂那怎么保证 redis 是高可用的?...
  • [redis]哨兵原理解析.

    2021-01-29 16:00:16
    在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制,它有效地解决了主从复制模式下故障转移的这三个问题。 主库真的挂了吗? 该选择哪个从库作为主库? 怎么把新主库的相关信息通知给从库和客户端呢? ...
  • 1,启动 redis master 2,启动多个 slave 3,启动 sentinel 获取所有sentinel信息 获取master uid,ip,所有slave信息 获取所有slave的,uid, role(slave),master host/port,等 4,sentinel 持续互相交流。...
  • 目录   三、如何使用哨兵? 3.1、哨兵环境部署 3.2、主节点、从节点、哨兵节点配置文件解释  ...3.3、哨兵节点日志分析 ...四、Redis Sentinel客户端实现的原理是什么?Java如何操作Redis Sentinel?  ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,309
精华内容 9,723
关键字:

哨兵原理

友情链接: hid-ortek.rar