redis-sentinel

sentinel 是什么?


    sentinel是一个高可用性的解决方案,可以提供redis 监控、故障转换、主备切换的哨兵服务。

sentinel 原理:


    1、sentinel 对redis master进行监控并定时与master 进行通信,如发现msater 出现故障时则开始进行故障转换
    2、多个sentinel 确认master 有问题
    3、选举一个sentinel 作为领导
    4、从多个slave 节点中选举一个升级为master 节点
    5、通知其他slave 节点成为新master 的slave
    6、通知客户端主从变化
    7、等待老的master 复活成为新的master 的slave

redis主从配置:


    主节点:redis-7000.config

        port 7000
        daemonize yes
        pidfile /var/run/redis-7000.pid
        logfile "7000.log"
        dir "/opt/soft/redis/data/"


    从节点:redis-7001.config &redis-7001.config
        

        port 7001
        daemonize yes
        pidfile /var/run/redis-7001.pid
        logfile "7001.log"
        dir "/opt/soft/redis/data/"
        slaveof 127.0.0.1 7000
        

        port 7002
        daemonize yes
        pidfile /var/run/redis-7002.pid
        logfile "7002.log"
        dir "/opt/soft/redis/data/"
        slaveof 127.0.0.1 7000

三个sentinel 配置

    # 2 表示当有两个sentinel 节点认为master 节点有问题才算有问题
    # down-after-milliseconds sentinel 对master 的监控失去连接30000 ms则认为是故障

    # parallel-syncs 当月切换到新的master 节点后,slave 请求全量复制只能一个一个来

    # failover-timeout mymaster

    # 这里没有配置slave 相关信息,因为从master 中的 info replication 命令可以获取到

    port 26379

    daemonize yes
    sentinel monitor mymaster 120.0.0.1 7000 2
    sentinel down-after-milliseconds mymaster 30000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 180000

 

    port 26381

    daemonize yes
    sentinel monitor mymaster 120.0.0.1 7000 2
    sentinel down-after-milliseconds mymaster 30000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 180000

 

    port 26380

    daemonize yes
    sentinel monitor mymaster 120.0.0.1 7000 2
    sentinel down-after-milliseconds mymaster 30000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 180000

相关命令:

    # 将redis-sentinel-26379.conf 内的26379内容替换成26380,并保存为redis-sentinel-26380.conf

    sed "s/26379/26380/g" redis-sentinel-20379.conf > redis-sentinel-26380.conf

   # 启动sentinel 
    redis-sentinel redis-sentinel-26379.conf

    # 连接sentinel

    redis-cli -p 26379 

    # 查询sentinel 相关信息

    info

java 客户端连接

    客户端通过sentinel 集合中任意一个可用节点,获取master 信息然后连接,当redis master 节点出现故障时sentinel 会通知客户端新的master 信息,然后再重新连接新的master 节点

    1、sentinel 地址集合,配置sentinel 的所有节点#{ip:port}

    2、masterName 使用masterName 来区分,这里masterName为:mymaster

    3、不是代理模式

    4、jedis ,如果服sentinel 务器在远程需要设置密码或者设置protected-mode no 才可以连接

        Set<String> sentinelSet = new HashSet<>();
        sentinelSet.add("127.0.0.1:26379");
        sentinelSet.add("127.0.0.1:26380");
        sentinelSet.add("127.0.0.1:26381");
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        JedisSentinelPool sentinelPool = new JedisSentinelPool(MASTER_NAME,sentinelSet,jedisPoolConfig,72000);

        Jedis jedis =null;
        try {
            jedis = sentinelPool.getResource();
            jedis.set("hello","123");
            System.out.println(jedis.get("hello"));
        }catch (Exception e){
            log.error("",e);
        }finally {
            if(jedis!=null){
                jedis.close();
            }
        }

三个定时器

    1、sentinel 每10秒对个master 和 slave节点执行info

        发送slave节点

        主从关系确认

    2、每2秒每个sentinel 通过节点的channel 交换信息(pub/sub)

        通过__sentinel__:hello 频道交互

        交互对节点的“看法”和自身信息

    3、每1秒每个sentinel 对其他sentinel 和redis执行ping

        心跳检测过程、为故障提供依据

主观下线与客观下线

    sentinel monitor <masterName> <ip> <port> <quorum>

    sentinel monitor mymaster 127.0.0.1 26379 2

    quorum:主观下线投票的法定人数,一般设置公式为:节点数/2+1

    sentinel down-after-milliseconds <masterName><timeout>

    sentinel down-after milliseconds mymaster 30000

    timeout 与第三个定时任务对应,如果连续30秒都没有响应,则对master 进行主观下线判断

    主观下线:sentinel 对master 的偏见,因为在实际环境中,有可能因为网络问题导致sentinel 对master无法ping 通导致的

    客观下线:所有sentinel 节点对redis节点失败“达成共识”(超过quorum个统一) 就可以确认做下线操作了

领导者选举

    1、原因:只有一个sentinel 节点完成故障转移

    2、选举:通过sentinel is-master-down-by-addr 命令并希望成为领导者

    3、每个主观下线的sentinel 节点向其他sentinel 节点发送命令,要求将它设置为领导者

    4、收到命令的sentinel 节点如果没有同意过其他sentinel 节点发送的命令,那么将同意该请求,否则拒绝

    5、如果该sentinel 节点发布自己的票数超过sentinel 集合半数且超过qurum ,那么将成为领导者

    6、如果此过程有多个sentinel 节点成为了领导者,那么将等待一段时间重新进行选举

故障转移 (sentinel领导者节点完成)

    1、从slave 节点中选出一个“合适的”节点作为新的master节点

    2、对上面的slave 节点执行slaveof no one 命令让其成为master 节点

    3、向其他的slave节点发送命令,让它们成为新的master节点的slave节点复制规则与parallel-syncs参数有关

        选择slave-priority(slave节点优先)最高的slave节点,如果存在则返回,不存在则继续

        选择复制偏移量最大的slave节点(复制的最完整)如果存在则返回,不存在则继续,与master数据最接近

        选择runId 最小的slave节点,启动最早的slave节点

节点上下线:

    1、任意sentinel 节点执行:sentinel failover <masterNaame>

    2、在slave 节点 slaveof 即可

 

常见问题

    slave节点只读不写

    建议所有节点内存配置一致,确保数据完整性

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值