您的位置:首页 > 数据库 > Redis

Redis实践(四)高可用的集群+哨兵部署 下的jedis开发

2017-08-02 16:57 846 查看
在实践(二)中,部署了高可用集群和哨兵,那么如何在这种情况下进行应用的开发呢,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) 代码如下:

      

[java] view
plain copy

<span style="font-family:Microsoft YaHei;font-size:14px;">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();  

    }  

}</span>  

      (3) 过程记录

        下面是休眠30s开始后,服务端shutdown 144master, 哨兵发现后,进行主从切换



       在144上,可以看到144原来的redis实例已经不在。



   下面是客户端应用执行情况,redis的主从切换对于客户端应用是透明的。



    从服务端可以看到应用设置的数据情况:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: