一个 Sentinel 可以与其他多个 Sentinel 进行连接, 各个 Sentinel 之间可以互相检查对方的可用性, 并进行信息交换。
你无须为运行的每个 Sentinel 分别设置其他 Sentinel 的地址, 因为 Sentinel 可以通过发布与订阅功能来自动发现正在监视相同主服务器的其他 Sentinel , 这一功能是通过向频道 sentinel:hello 发送信息来实现的
ADDR=`pwd`
for i in {1..3}
do
cat > ./sentinel${i}.conf <<EOF
daemonize yes
port 800${i}
sentinel monitor mymaster 192.168.133.131 6379 2 # 这里必须是具体的地址
dir ${ADDR}
bind 0.0.0.0
protected-mode no
sentinel down-after-milliseconds mymaster 6000
sentinel failover-timeout mymaster 18000
sentinel parallel-syncs mymaster 1
logfile ${ADDR}/${i}_sentinel.log
EOF
done
# 最后两行手动打,哨兵的配置文件里的提示不多,可以直接参考 redis.conf 里的说明文档
# 注意故障转移后,你的主从配置文件会被追加配置,建议拷贝一份自己的主从配置
这段脚本不会有问题,注意ip 地址,如果是127.0.0.1,那么即使在虚拟机里配置完成可用,在Java里配置JedisSentinelPool 也会有问题
public static void main(String[] args) throws InterruptedException {
//连接池配置
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(10);
jedisPoolConfig.setMaxIdle(5);
jedisPoolConfig.setMinIdle(5);
//哨兵信息
Set<String> sentinels = new HashSet<String>(Arrays.asList(
"192.168.133.131:8001",
"192.168.133.131:8002",
"192.168.133.131:8003"
));
//创建连接池 注意这里的mymaster 就是上面配置的mymaster
JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels, jedisPoolConfig);
//获取客户端
Jedis jedis = pool.getResource();
//执行两个命令
jedis.set("k1", "myvaluex");
System.out.println(jedis.get("k1"));