Redis Sentinel机制与用法 【redis主从】

运行Sentinel

运行sentinel有两种方式:redis

  • 第一种网络

    redis-sentinel /path/to/sentinel.conf
  • 第二种spa

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

    以上两种方式,都必须指定一个sentinel的配置文件sentinel.conf,若是不指定,将没法启动sentinel。sentinel默认监听26379端口,因此运行前必须肯定该端口没有被别的进程占用。code

Sentinel的配置

Redis源码包中包含了一个sentinel.conf文件做为sentinel的配置文件,配置文件自带了关于各个配置项的解释。典型的配置项以下所示:server

sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1

sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5

上面的配置项配置了两个名字分别为mymaster和resque的master,配置文件只须要配置master的信息就好啦,不用配置slave的信息,由于slave可以被自动检测到(master节点会有关于slave的消息)。须要注意的是,配置文件在sentinel运行期间是会被动态修改的,例如当发生主备切换时候,配置文件中的master会被修改成另一个slave。这样,以后sentinel若是重启时,就能够根据这个配置来恢复其以前所监控的redis集群的状态。进程

接下来咱们将一行一行地解释上面的配置项ip

sentinel monitor mymaster 127.0.0.1 6379 2

这一行表明sentinel监控的master的名字叫作mymaster,地址为127.0.0.1:6379,行尾最后的一个2表明什么意思呢?咱们知道,网络是不可靠的,有时候一个sentinel会由于网络堵塞而误觉得一个master redis已经死掉了,当sentinel集群式,解决这个问题的方法就变得很简单,只须要多个sentinel互相沟通来确认某个master是否真的死了,这个2表明,当集群中有2个sentinel认为master死了时,才能真正认为该master已经不可用了。(sentinel集群中各个sentinel也有互相通讯,经过gossip协议)。内存

除了第一行配置,咱们发现剩下的配置都有一个统一的格式:get

sentinel <option_name> <master_name> <option_value>

接下来咱们根据上面格式中的option_name一个一个来解释这些配置项:同步

  • down-after-milliseconds
    sentinel会向master发送心跳PING来确认master是否存活,若是master在“必定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了(subjectively down, 也简称为SDOWN)。而这个down-after-milliseconds就是用来指定这个“必定时间范围”的,单位是毫秒。

不过须要注意的是,这个时候sentinel并不会立刻进行failover主备切换,这个sentinel还须要参考sentinel集群中其余sentinel的意见,若是超过某个数量的sentinel也主观地认为该master死了,那么这个master就会被客观地(注意哦,此次不是主观,是客观,与刚才的subjectively down相对,此次是objectively down,简称为ODOWN)认为已经死了。须要一块儿作出决定的sentinel数量在上一条配置中进行配置。

  • parallel-syncs
    在发生failover主备切换时,这个选项指定了最多能够有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,可是若是这个数字越大,就意味着越多的slave由于replication而不可用。能够经过将这个值设为 1 来保证每次只有一个slave处于不能处理命令请求的状态。

其余配置项在sentinel.conf中都有很详细的解释。
全部的配置均可以在运行时用命令SENTINEL SET command动态修改。

 

package cn.com.redis;

import redis.clients.jedis.Jedis;

public class MasterAndSlaveTest {
    public static void main(String[] args) throws InterruptedException {
        Jedis jedis_M = new Jedis("192.168.248.129",6379);//主机
        Jedis jedis_S = new Jedis("192.168.248.129",6380);//从机
        
        //遵循“配从不配主”的模式
        jedis_S.slaveof("192.168.248.129",6379);
    
        jedis_M.set("class", "8888");//主机去写
        
        //内存中读写太快,防止读在写以前先完成而出现null的状况,这里作一下延迟
        Thread.sleep(2000);
        
        String result = jedis_S.get("class");//从机去读
        System.out.println(result);
    }
}
相关文章
相关标签/搜索