在实践(二)中,部署了高可用集群和哨兵,那么如何在这种情况下进行应用的开发呢,jedis提供了相应的api,可以实现。本次实践就是验证一下如何进行的。
一、目标
通过java小程序,来验证当redis发生主从切换后,对应用是透明的,数据的存储和读写可以正常工作
二、环境
1、还是使用144,155 上部署的redis集群,1主1从,3个哨兵
2、本地eclipse环境里,建立java工程,进行应用连接和读写
三、步骤
(1)验证步骤描述
1、客户端,获取redis连接池
2、客户端写入 key1,value1
3、客户端休眠30秒
4、客户端休眠开始后,在服务端,手工shutdwon 144的redis实例
5、客户端休眠30秒后,写入 key2,value2,并且读取key1,key2
(2) 代码如下:
package com.cwqsolo.redis.test;
import java.util.HashSet;
import java.util.Set;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisSentinelPool;
public class RedisSentinelDemo {
// redis 采用1主1从方式, 主:192.168.136.144 从:192.168.136.155
// sentinel 采用3哨兵, 144上部署2个,155上部署1个
public static void main(String[] args) {
// 创建哨兵池
Set sentinels = new HashSet();
sentinels.add(new HostAndPort("192.168.136.144", 16379).toString());
sentinels.add(new HostAndPort("192.168.136.144", 26379).toString());
sentinels.add(new HostAndPort("192.168.136.155", 16379).toString());
JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster",
sentinels);
System.out.println("Current master: "
+ sentinelPool.getCurrentHostMaster().toString());
Jedis master = sentinelPool.getResource();
master.set("username1", "cwqsolo");
System.out.println("set->username1:cwqsolo ");
sentinelPool.returnResource(master);
// 这里休眠30秒 ,将144 主redis杀掉,按哨兵机制,将发现主redis状态down
// 重新选举新的slave为主master
try {
System.out.println("sleep 30s begin");
Thread.sleep(30000);
System.out.println("sleep 30s end!!!");
} catch (Exception Exc) {
Exc.printStackTrace();
System.exit(0);
}
// 重新获得jedis
Jedis master2 = sentinelPool.getResource();
String value = master2.get("username1");
System.out.println("get->username1: " + value);
master2.set("username2", "newland");
System.out.println("set->username2:newland ");
String value2 = master2.get("username2");
System.out.println("get->username2: " + value);
master2.close();
sentinelPool.destroy();
}
}
(3) 过程记录
下面是休眠30s开始后,服务端shutdown 144master, 哨兵发现后,进行主从切换
在144上,可以看到144原来的redis实例已经不在。
下面是客户端应用执行情况,redis的主从切换对于客户端应用是透明的。
从服务端可以看到应用设置的数据情况: