基于zookeeper的redis高可用
一. 程序设计
(一) 基于zookeeper的节点在客户端监测redis集群的状态,并获取主服务器IP
1. 编写zookeeper对监测redis集群客户端
2. 实现redis的高可用(保证redis的主从结构与实时状态的报汇报)
(二) 基于zookeeper的节点在zookeeper监测redis集群的状态
1. 编写客户端对redis集群的客户端(获取集群IP信息)
2. 根据IP集合,随机使用一个IP发起远程调用
(三) 使用 Echarts实现界面实时显示整个redis集群的状态
二. 程序部署图
三. 代码实现
1. 集群监控程序
代码设计思路:
职责:监测该服务器的redis状态和与zookeeper服务器的连接状态,并与之保存通讯
两个子程序:
①redis状态监测程序
定时执行redis的ping操作,异常则通知zookeeper集群,若有异常,则删除正常标志的瞬时节点,并生成异常状态标志的瞬时节点——记录IP
②服务器监测程序
保存与zookeeper集群的连接状态(正常状态标志节点——记录IP),(若有断开,在zookeeper服务器则不存在正常状态标记的瞬时节点,达到监测集群目的)
核心代码:
/**
* 监测redis的运行状态 若出现异常,则向zookeeper服务器发出异常信息节点
*/
@Override
public void run() {
while(true){
try{
//redis心跳监测
String living = heartbeatWatch();
//若数据库断开
if(null==jd){
if(status==true){
//删除正常状态的记录节点
if(null != normalRecord)deleteNode(normalRecord,zk);
createNode(errorNode,zk,url);
//zk.create(errorNode, url.getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
status=false;
run();
}
}
//或者返回非正常状态(如redis无法连接)
if(!living.equals("PONG")&&status==true){
//删除正常状态的瞬时节点
if(null != normalRecord)deleteNode(normalRecord,zk);
//创建异常状态的瞬时节点通知zookeeper
createNode(errorNode,zk,url);
//zk.create(errorNode, (Constant.ZK_ERROR_RESULT+url).getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
status=false;
run();
}else{
status=false;</