redis哨兵的启动和redis实例的启动没有关系。因此能够在任何机器上启动redis哨兵。至少要保证有两个哨兵在运行,要否则宕机后哨兵会找不到主节点。java
配置步骤:redis
1.在redis的配置文件中添加鉴权和验证(添加requirepass和masterauth),redis主从都须要配置,配置的密码通常相同。服务器
2.redis通常都在内网运行,因此注释掉#bind 127.0.0.1测试
3.关闭保护模式,protected-mode 把yes改成noui
4.添加sentinel.conf配置文件:spa
#sentinel端口 port 26379 #工做路径,注意路径不要和主重复 dir "/usr/local/redis-6379" # 守护进程模式 daemonize yes #关闭保护模式 protected-mode no # 指明日志文件名 logfile "./sentinel.log" #哨兵监控的master,主从配置同样,这里只用输入redis主节点的ip/port和法定人数。 sentinel monitor mymaster 192.168.125.128 6379 1 # master或slave多长时间(默认30秒)不能使用后标记为s_down状态。 sentinel down-after-milliseconds mymaster 5000 #若sentinel在该配置值内未能完成failover操做(即故障时master/slave自动切换),则认为本次failover失败。 sentinel failover-timeout mymaster 18000 #设置master和slaves验证密码 sentinel auth-pass mymaster 123456 sentinel parallel-syncs mymaster 1//指定了在执行故障转移时, 最多能够有多少个从服务器同时对新的主服务器进行同步
Sentinel参数在运行时能够使用SENTINEL SET命令更改日志
上面配置中的mymaster为该主从的名字,代码中会使用。code
经过哨兵查看集群的信息:server
$ redis-cli -p 26379 sentinel master mymaster//查看master的状态 SENTINEL slaves mymaster //查看salves的状态 SENTINEL sentinels mymaster //查看哨兵的状态 SENTINEL get-master-addr-by-name mymaster//获取当前master的地址 info sentinel//查看哨兵信息
启动哨兵:blog
方式一:redis-sentinel /path/to/sentinel.conf(推荐,这种方式启动和redis实例没有任何关系)
方式二:redis-server /path/to/sentinel.conf --sentinel
java测试代码:
public static void main(String[] args) { Set<String> sentinels = new HashSet<String>(); sentinels.add(new HostAndPort("192.168.125.128", 26379).toString()); sentinels.add(new HostAndPort("192.168.125.129", 26379).toString()); sentinels.add(new HostAndPort("192.168.125.130", 26379).toString()); JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster", sentinels); System.out.println("Current master: " + sentinelPool.getCurrentHostMaster().toString()); Jedis master = sentinelPool.getResource(); master.auth("pwdisadmin"); master.set("username","cczz"); Jedis master2 = sentinelPool.getResource(); master2.auth("pwdisadmin"); String value = master2.get("username"); System.out.println("username: " + value); master2.close(); sentinelPool.close(); sentinelPool.destroy(); }