【十八】redis之sentinel哨兵模式概述与安装配置,Java连接redis sentinel

概述

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

Java连接redis sentinel,哨兵模式下不要直连master,要连sentinel,master挂了才会自动故障转移

String masterName = "mymaster";
Set<String> sentinelSet =new HashSet<String>();
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();
    }
}

猜你喜欢

转载自blog.csdn.net/jy02268879/article/details/81464128