redis哨兵集群:一主(6380)两从(6381、6382)三哨兵(26379、26349、26359)
下载redis windows版应用包,如redis3.2;
删除多余文件
删除redis-server.pdb, redis-cli.pdb, redis-check-aof.pdb, redis-benchmark.pdb
删除Windows Service Documentation.docx, Redis on Windows.docx, Redis on Windows Release Notes.docx
删除redis.windows-service.conf
更名redis.windows.conf为redis.conf
创建sentinel.conf
#端口号
port 6380
#开放外网访问权限
bind 0.0.0.0
#关闭protected-mode模式,此时外部网络可以直接访问;开启protected-mode保护模式,需配置bind ip或者设置访问密码
protected-mode yes
#访问密码
requirepass 123456
#访问主库密码
masterauth 123456
#端口号
port 6381
#开放外网访问权限
bind 0.0.0.0
protected-mode yes
#主库ip及端口
slaveof 192.168.1.1 6380
requirepass 123456
masterauth 123456
其中slaveof 对应的为主库IP及端口
与6381一样,配置6382服务器,仅需要修改其中的port参数即可
在redis一主两从三个服务文件夹内各创建一个sentinel.conf文件,配置内容如下
#端口号
port 26379
#绑定ip
protected-mode yes
#对外网开放
bind 0.0.0.0
#监听master主库地址及端口,并且配置认为主库宕机的阈值,mymaster主服务器名称
sentinel monitor mymaster 192.168.194.94 6380 1
#心跳阈值3秒
sentinel down-after-milliseconds mymaster 3000
#过期时间
sentinel failover-timeout mymaster 10000
#访问主库密码
sentinel auth-pass mymaster 123456
#打印日志地址,如果注释掉则打印在控制台
logfile "G:/rediscluster/6380/sentinel.log"
(1)shutdown主服务器
(2)使用info replication查看另外两台服务器的主从状态
#启动redis服务
redis-server redis.conf
#启动对应sentinel哨兵服务
redis-server sentinel.conf --sentinel
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<description>JedisSentinelPooldescription>
<bean id="jedisPool" class="com.util.redis.JedisSentinelPoolUtil" init-method="init" destroy-method="destroy">
<constructor-arg type="java.lang.String" value="mymaster" index="0"/>
<constructor-arg type="java.lang.String" value="123456" index="1"/>
<constructor-arg>
<list>
<value>192.168.1.1:26379value>
<value>192.168.1.1:26479value>
<value>192.168.1.1:26579value>
list>
constructor-arg>
bean>
<bean id="redisClient" class="com.util.redis.RedisClient">
<constructor-arg name="jedisPool" ref="jedisPool"/>
<property name="expire" value="3000"/>
bean>
beans>
在ApplicationContext.xml配置文件中注入以上配置文件
<import resource="classpath*:spring/RedisSentinel.xml"/>
package com.util.redis;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;
/**
* 测试Redis哨兵模式
*
* @author liu
*/
public class JedisSentinelPoolUtil {
// jdeis工具接口
public JedisSentinelPool pool = null;
private Integer maxActive = 10000;
private Integer maxIdle = 100;
private Integer maxWait = 100;
private Integer timeBetweenEvictionRunsMillis = 30000;
private Integer numTestsPerEvictionRun = -1;
private boolean testOnBorrow = true;
private String masterName = "mymaster";
private String password = "123456";
private List<String> sentinelIPS = new ArrayList<String>();
public JedisSentinelPoolUtil() {
super();
}
public JedisSentinelPoolUtil(String masterName, String password,
List<String> sentinelIPS) {
super();
this.masterName = masterName;
this.password = password;
this.sentinelIPS = sentinelIPS;
}
public void init() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(maxActive);
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMinIdle(maxWait);
jedisPoolConfig.setTestOnBorrow(testOnBorrow);
jedisPoolConfig
.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun);
// 哨兵信息
Set<String> sentinels = new HashSet<>(sentinelIPS);
if (pool == null) {
// 创建连接池
pool = new JedisSentinelPool(masterName, sentinels,
jedisPoolConfig, password);
}
}
public void destroy() {
if (pool != null) {
pool.destroy();
}
if (pool != null) {
pool.close();
}
}
}
3.3 应用的使用RedisClient
public class RedisClient extends RedisManager {
// 线程池
private JedisSentinelPool jedisPool = null;
public RedisClient(JedisSentinelPoolUtil jedisPool) {
this.jedisPool = jedisPool.pool;
}
public void init() {
super.init();
}
}