redis2.8开始的sentinel哨兵模式建立在主从结构之上,多了几个sentinel节点。
sentinel不会存储数据,它的作用是完成对redis的故障判断、故障转移、通知客户端。
多个sentinel可达到对redis故障判断的公平性,还能保证高可用。
即使一个sentinel节点挂了,也能保证sentinel机制的存在。
客户端不会直接从redis中获取信息,而是从sentinel获取信息。
sentinel会对所有的master和slave监控。
自动故障转移,仅限master。如果做了读写分离,slaver没有自动故障转移,需要自己写代码实现(做一个所有slaver的资源池,订阅对应频道获取slaver升为master、slaver被主观下线的信息)
当多个sentinel发现master挂了,会内部选举出一个sentinel作为领导。
被选举出的sentinel领导会选出一个slave作为新的master,同时通知slave复制新的master,通知客户端新的master是谁。
如果老的master复活了,它会变成一个slave去复制新的master。
一套sentinel可以监控多套master-slave,有效节省资源。
每套master-slave会使用一个master-name配置作为标识。
sentinel的默认端口是26379
sentinel中有3个定时任务
1.每个sentinel每10秒会对每个master、slave执行info。这样可以:发现slave节点、确认主从关系。
2.每2秒,每个sentinel通过master节点的channel交换信息(发布/订阅)。信息中包括当前sentinel节点的信息和它对master、slave做的判断。可以知道有哪些sentinel也在监控这套master-slave,可以知道其他sentinel对这套master-slave的判断。
channel的名字__sentinel__:hello
3.每1秒,每个sentinel会对其他sentinel、和master、slave执行ping操作。
node1 | node2 | node3 | node4 | |
sentinel | Y | Y | Y | |
master | Y | |||
slave | Y | Y |
先按照单机配置配置node1作为master:【一】linux安装redis(单机版)、3种启动方式、及配置文件介绍。
把node1的redis文件一起拷贝到node2 node3 node4
cd /app
scp -r redis root@node2:/app
scp -r redis root@node3:/app
scp -r redis root@node4:/app
按照主从结构配置node2,node3作为slave:【十七】redis之主从复制概述及部署
配置node2,node3,node4(注意关闭node4的slaveof配置)作为sentinel
cd /app/redis/config
拷贝sentinel的配置文件模板,去掉文件中所有注释
cat /app/redis/sentinel.conf | grep -v "#" | grep -v "^$" > redis-sentinel-26379.conf
vi redis-sentinel-26379.conf
daemonize yes
dir /app/redis/data
logfile "26379.log"
# 其中mymaster是监控的这一套master-slave的名字,2是2个sentinel认为master有问题就故障转移
sentinel monitor mymaster node1 6379 2
# sentinel失去master3万毫秒就认为master有问题了
sentinel down-after-milliseconds mymaster 30000
# 每个时间点只有1个slave对新master进行复制,不并发
sentinel parallel-syncs mymaster 1
# 故障转移时间
sentinel failover-timeout mymaster 180000
在node1 node2 node3中启动redis-server
cd /app/redis/src
./redis-server /app/redis/config/redis-6379.conf
在node2 node3 node4中启动redis-sentinel
cd /app/redis/src
./redis-sentinel /app/redis/config/redis-sentinel-26379.conf
查看是否启动
ps -ef | grep redis
进入sentinel的命令行客户端
node2
cd /app/redis/src
./redis-cli -p 26379
info
String masterName = "mymaster";
Set sentinelSet =new HashSet();
sentinelSet.add("node2:26379");
sentinelSet.add("node3:26379");
sentinelSet.add("node4:26379");
JedisSentinelPool sentinelPool = new JedisSentinelPool(masterName,sentinelSet,poolConfig,timeout);
Jedis jedis = null;
try{
jedis = sentinelPool.getResource();
}catch(Exception e){
logger.error(e.getMessage(),e);
}finally{
if(jedis != null){
jedis.close();
}
}