Java版Redis哨兵
前言:
- 本文将采用文字+代码的方式,讲解redis版哨兵的实现,所有代码都将写在一个类中,每个属性和方法都会结合文字加以说明。
1. 哨兵(Sentinel)主要功能如下:
1、不时的监控redis节点是否良好运行,如果节点不可达就会对节点进行下线标识
2、如果被标识的是主节点,哨兵就会选举一个redis从(slave)节点成为新的主节点继续对外提供读写服务, 进而实现自动故障转移,保证系统的高可用。
3、在redis主节点 和 从节点 进行切换后,主节点配置文件master_redis.conf、从节点配置文件slave_redis.conf都要发生改变。
2. 准备工作:
- Redis集群推荐一主两从,共三个节点。
- jedis-2.9.0.jar 客户端框架
3. 代码实现
JavaSentinel.java
package com.middleware.redis.sentinels;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.*;
/**
* java版哨兵
*
* @author 93733
*
*/
public class JavaSentinel {
// 主节点ip:端口 127.0.0.1:6379
static String masterAddress = "127.0.0.1:6379";
// 所有 slave
static final Vector<String> slaveRedisServers = new Vector<String>();
// 坏掉的实例
static final Vector<String> badRedisServers = new Vector<String>();
// 连接池对象
static JedisPool jedisPool ;
// 连接池配置信息对象
private static JedisPoolConfig config = new JedisPoolConfig();
/**
* 配置连接池信息
* @return
*/
static {
// 最大连接数10
config.setMaxTotal(10);
//最大空闲连接数5
config.setMaxIdle(5);
}
/**
* 获取jedis 实例
* @param
* @return
*/
public Jedis newJedisInstance() {
return jedisPool.getResource() ;
}
volatile static JavaSentinel javaSentinel;
/**
* 创建JavaSentinel对象
* @param isOpenSentinel 是否开启哨兵 true 开启, false 不开启
* @return
*
* 1) 如果开启哨兵, 我们创建一个定时任务, 延迟1秒,间隔3秒执行一次
* 2)每次执行时, 任务如下:
* // 检测 master是否可以
* checkMaster();
* // 更新slave列表
* updateSlaves();
* // 检测坏掉的实例是否恢复正常
* checkBadServer();
*
* 3)初始化 jedisPool 对象 和 javaSentinel对象
*
*/
public static synchronized JavaSentinel getInstance(boolean isOpenSentinel){
// 是否开启java哨兵
if(isOpenSentinel){
// 定时任务
new Timer().schedule(new TimerTask() {
@Override
public void run(