运行sentinel有两种方式:redis
第一种网络
redis-sentinel /path/to/sentinel.conf
第二种spa
redis-server /path/to/sentinel.conf --sentinel
以上两种方式,都必须指定一个sentinel的配置文件sentinel.conf,若是不指定,将没法启动sentinel。sentinel默认监听26379端口,因此运行前必须肯定该端口没有被别的进程占用。code
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); } }