模拟redis出现宕机情况下redis-sentinel的故障转移。
1、java代码以下实现方式
//倘若创建maven项目需要在pom.xml中引入依赖,不是maven项目需要引入对应jar包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>redisDemo</groupId>
<artifactId>redisDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.6</version>
</dependency>
</dependencies>
</project>
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisSentinelPool;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* @author: ltj
* date: 2019-04-03-0:53
* jedisSentinel故障转移的测试
**/
public class RedisSentinelFailoverTest {
//打印日志
private static Logger logger = LoggerFactory.getLogger(RedisSentinelFailoverTest.class);
public static void main(String[] args){
//主服务器的名称
String masterName = "mymaster";
//创建set对象,存储redis-sentinel的IP和端口,本实例创建创建了三个redis-sentinel来监控redis的运行情况
Set<String> set = new HashSet<String>();
set.add("1**.77.87.1**:26379");
set.add("1**.77.87.1**:26380");
set.add("1**.77.87.1**:26381");
//创建JedisSentinelPool
JedisSentinelPool sentinelPool = new JedisSentinelPool(masterName,set);
int count=0;
//测试死循环的情况下主服务器出现宕机的情况下sentinel发生故障转移的测试
while(true){
count ++;
Jedis jedis = null;
try{
jedis = sentinelPool.getResource();
int index = new Random().nextInt();
//对redis保存key和value
String key = "k-" + index;
String value = "v-" + index;
jedis.set(key,value);
if(count%100 ==0){
//打印日志信息
logger.info("key:{},value:{}",key,jedis.get(key));
}
//睡眠时间
TimeUnit.MILLISECONDS.sleep(10);
}catch (Exception e){
logger.error(e.getMessage(),e);
}finally {
if (jedis!=null){
jedis.close();
}
}
}
}
}
2、配置redis和redis-sentinel服务器(博主分别创建了三个)
3、启动redis
4、启动redis-sentinel
5、运行java文件(控制台中出现需求日志)
6、kill掉redis主服务器(java控制台报错)
7、过一段时间后java控制台正常运行
8、redis-sentinel实现了redis宕机情况下的故障转移结束
注意:一开始运行java文件就报端口错误:此处需要注意redis-sentinel中配置的redis中的IP和端口的正确
具体的redis-sentinel的实现过程可以查看sentinel和redis的日志文件
redis-sentinel的配置文件可参考以下链接内容
https://blog.csdn.net/weixin_42739916/article/details/88859380
redis的配置文件可参考以下链接内容