概述
sentinel哨兵是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。如果redis的主节点挂掉,利用哨兵机制,可以从剩下的从节点中选出主节点,弥补了上一节讲的主从复制架构不能自动选举主节点的难处。
有了sentinel哨兵之后,客户端第一次不会主动去找redis的主节点,而是去访问哨兵主节点的ip与端口,之后客户端就直接访问redis的主节点。
当redis的主节点发生变化,哨兵会第一时间感知到,并且将新的redis 主节点通知给client端。
redis的主目录下有sentinel哨兵的配置文件,src目录下有哨兵的启动服务。
redis哨兵架构搭配步骤
1.
#复制一份sentinel.conf文件
cp sentinel.conf sentinel_26379.conf
2.
#将相关配置修改为如下值:
port 26379
daemonize yes
pidfile "/var/run/redis‐sentinel_26379.pid"
logfile "26379.log"
dir "/usr/local/redis‐5.0.2/data"
# sentinel monitor <master‐name> <ip> <redis‐port> <quorum>
# quorum是一个数字,指明当有多少个sentinel认为一个master失效时(值一般为:sentinel总数/2 + 1),master才算真正失效
sentinel monitor mymaster 192.168.20.136 6379 2
3.
#启动sentinel哨兵实例
src/redis‐sentinel sentinel‐26379.conf
4.
#查看sentinel的info信息
src/redis‐cli ‐p 26379
127.0.0.1:26379>info
可以看到Sentinel的info里已经识别出了redis的主从
5.可以自己再配置两个sentinel,端口26380和26381,注意上述配置文件里的对应数字都要修改
搭建结果
一个主节点,两个从节点,三个哨兵
哨兵的Jedis连接代码
public class JedisSentinelTest {
public static void main(String[] args) {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(20);
jedisPoolConfig.setMaxIdle(10);
jedisPoolConfig.setMinIdle(5);
Set<String> sentinels = new HashSet<>();
sentinels.add(new HostAndPort("192.168.20.136", 26379).toString());
sentinels.add(new HostAndPort("192.168.20.136", 26380).toString());
sentinels.add(new HostAndPort("192.168.20.136", 26381).toString());
//JedisSentinelPool其实本质跟JedisPool类似,都是与redis主节点建立的连接池
//JedisSentinelPool并不是说与sentinel建立的连接池,而是通过sentinel发现redis主节点并与其建立连接
//masterName需要与哨兵的配置文件中配置的主节点名称一致
String masterName = "mymaster";
JedisSentinelPool jedisSentinelPool = new JedisSentinelPool(masterName, sentinels,
jedisPoolConfig, 3000, null);
Jedis jedis = null;
try {
jedis = jedisSentinelPool.getResource();
System.out.println(jedis.set("sentinel", "zhangsan"));
System.out.println(jedis.get("sentinel"));
} catch (Exception e) {
e.printStackTrace();
} finally {
//注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。
if(null != jedis)
jedis.close();
}
}
}