zoukankan      html  css  js  c++  java
  • Redis哨兵机制

    点击上方“ 码农编程进阶笔记 ”,选择“置顶或者星标

    文末有干货,每天定时与您相约!

    如果master异常,则会进行master-slave切换,将其中一个slave作为master,将之前的master作为slave。

    哨兵作用

    哨兵是Redis集群架构中非常重要的一个组件,主要功能如下:

    • 集群监控:负责监控redis master和slave进程是否正常

    • 消息通知:如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员

    • 故障转移:如果master节点挂掉了,会自动转移到slave节点上

    • 配置中心:如果故障转移发生了,通知client客户端新的master地址

    哨兵的核心知识

    • 故障转移时,判断一个master节点是否宕机了,需要大部分的哨兵都同意才行,涉及到了分布式选举的问题

    • 哨兵至少需要3个实例,来保证自己的健壮性

    • 哨兵+redis主从的部署架构,是不会保证数据零丢失的,只能保证redis集群的高可用性

    sdown和odown

    • sdown和odown两种失败的状态

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

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

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

    • odown达成条件:如果一个哨兵在指定的时间内,收到了quorum指定数量的其他哨兵也认为那个master是宕机了,那么就认为是odown了,客观认为master宕机了

    quorum和majority

    1. quorum:确认odown的最少哨兵数量

    2. majority:授权进行主从切换的最少哨兵数量

    3. 每一个哨兵要做主备切换,首先需要quorum数量的哨兵认为odown,然后选举出一个哨兵来做切换,这个哨兵还得得到majority哨兵的特权,才能进行切换。

    4. 如果quorum<majority,比如5个哨兵,majority就是3,quorum·设置为2,那么3个哨兵授权可以执行切换,但是如果quorum>majority,那么必须quorum数量的哨兵都授权,比如5个哨兵,quorum是5,那么必须5个哨兵都同意授权才能执行。(谁多听谁的)

    为什么哨兵至少3个节点?

    哨兵集群必须部署两个以上节点。如果哨兵集群仅仅部署了2个哨兵实例,那么它的majority就是2(2的majority=2,3的majority=2,5的majority=3,4的majority=2),如果其中一个哨兵宕机了,就无法满足majority>=2这个条件,那么master发生故障时也就无法进行主从切换了。


    工作原理

    1. 每个Sentienl以每秒钟一次的频率向他所知的Master,Slave以及其他的Sentinel实例发送一个ping命令

    2. 如果一个实例距离最后一次有效回复ping命令的时间超过了down-after-milliseconds选项所指的值,则这个实例会被Sentinel标记为主观宕机

    3. 如果一个master被标记为主观宕机,则正在监视这个master的所有sentinel要以每一秒一次的频率确认Master的确进入了主观宕机状态

    4. 当有足够数量的Sentinel(大于等于配置文件所指的值)在指定的时间范围内确认master的确进入了主观宕机状态,则master会被标记为客观状态

    5. 在一般情况下,每个Sentinel会以1次/10秒的频率向他一致的所有master,slave发送INFO命令

    6. 当master被Sentinel标记为客观宕机是,Sentinel向下线的master的所有slave发送INFO命令的频率会从1次/10秒改为1次/秒

    7. 若没有足够数量的Sentinel同意master已经下线,master的客观宕机状态就会被移除;若master重新想Sentinel的ping命令返回有效回复,master的主观宕机状态就会被移除。

    哨兵模式的配置

    首先配置redis的主从服务器,修改redis.conf文件如下

    # 使得Redis服务器可以跨网络访问
    bind 0.0.0.0
    # 设置密码
    requirepass "123456"
    # 指定主服务器,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
    slaveof 192.168.11.128 6379
    # 主服务器密码,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
    masterauth 123456

    上述内容主要是配置Redis服务器,从服务器比主服务器多了一个slaveof的配置和密码

    配置3个哨兵,每个哨兵都是一样的。在Redis安装目录下有一个sentinel.conf文件,copy一份进行修改

    # 禁止保护模式
    protected-mode no
    # 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,192.168.11.128代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
    sentinel monitor mymaster 192.168.11.128 6379 2
    # sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
    # sentinel auth-pass <master-name> <password>
    sentinel auth-pass mymaster 123456

    启动服务器和哨兵,进入Redis安装目录的src目录

    # 启动Redis服务器进程
    ./redis-server ../redis.conf
    # 启动哨兵进程
    ./redis-sentinel ../sentinel.conf

    注意启动顺序:首先是主机(192.168.11.128)的Redis服务进程,然后启动丛机的服务进程,最后启动3个哨兵的服务进程

    Java中使用哨兵模式

    /**
     * 测试Redis哨兵模式
     * @author liu
     */
    public class TestSentinels {
        @SuppressWarnings("resource")
        @Test
        public void testSentinel() {
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            jedisPoolConfig.setMaxTotal(10);
            jedisPoolConfig.setMaxIdle(5);
            jedisPoolConfig.setMinIdle(5);
            // 哨兵信息
            Set<String> sentinels = new HashSet<>(Arrays.asList("192.168.11.128:26379",
                    "192.168.11.129:26379","192.168.11.130:26379"));
            // 创建连接池
            JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels,jedisPoolConfig,"123456");
            // 获取客户端
            Jedis jedis = pool.getResource();
            // 执行两个命令
            jedis.set("mykey", "myvalue");
            String value = jedis.get("mykey");
            System.out.println(value);
        }
    }

  • 相关阅读:
    vs2012 切换语言
    extjs 多维数组支持
    Extjs: 对象不支持“createContextualFragment”属性或方法
    Servlet学习五——流的分发
    Servlet学习四——传输文本
    Servlet学习三——传输文件
    Servlet学习二——doGet和doPost
    Java处理Excel整理篇
    ORA-01033: ORACLE 正在初始化或关闭 进程 ID: 0 会话 ID: 0 序列号: 0
    Servlet学习一
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15452876.html
Copyright © 2011-2022 走看看