Redis一主二从三哨兵高可用实践

Ubuntu redis高可用实践

  • 环境与工具
    • 部署环境
    • 部署工具
    • 开发工具
  • Redis高可用配置
  • 修改配置
  • 撰写测试代码
  • 高可用测试

 

环境与工具

部署环境

  • 阿里云Ubuntu 16.04
  • Redis 3.0.6

部署工具

  • Xshell 6
  • Xftp 6

开发工具

  • Intellij IDEA 2017
  • Xftp 6
     

Redis高可用配置

请参考Redis高可用系列实践的前两个链接。


修改配置

  1. 删除默认的redis.confsentinel.conf
    为了确保我们写的conf配置文件不会与默认文件发生冲突,将默认的删除
  2. 修改所有sentinel配置文件的ip
    先停掉所有的节点和哨兵,将所有配置文件(redis-*及sentinel-*)的ip改为自己服务器的ip
    示例:将本图中第一个打码部分改为自己服务器的ip。将#Generated及以下的部分删掉即可。
    Redis一主二从三哨兵高可用实践_第1张图片
    然后将所有服务重启:
    即键入以下内容:
redis-server redis-6379.conf
redis-server redis-6380.conf
redis-server redis-6381.conf
redis-server sentinel-26379.conf --sentinel
redis-server sentinel-26380.conf --sentinel
redis-server sentinel-26381.conf --sentinel

撰写测试代码

在IDEA创建一个java项目,转为maven项目(在项目根目录上点击Add Framework Support即可)
pom文件中添加jedis依赖:

        
            redis.clients
            jedis
            3.1.0-m1
        
        
            org.apache.logging.log4j
            log4j-slf4j-impl
            2.11.2
        

 
在main文件夹下,创建Main.class,键入以下测试用代码:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisSentinelPool;

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class Main {

    public static void main(String[] args) {

        Set sentinels = new HashSet<>();
        sentinels.add("47.100.30.181:26379");
        sentinels.add("47.100.30.181:26380");
        sentinels.add("47.100.30.181:26381");

        //初始化哨兵池
        JedisSentinelPool pool = new JedisSentinelPool("mymaster",sentinels);

        while(true){
            Jedis jedis = null;
            try{
                //获取主库信息
                jedis = pool.getResource();
                String ip = jedis.getClient().getHost();
                int port = jedis.getClient().getPort();

                //生成随机键值对
                String key = "k-" + new Random().nextInt(10000);
                String value = "k-" + new Random().nextInt(10000);
                jedis.set(key,value);

                System.out.println("当前主库为:port = " + port
                        + ",key = " + key + ",value = " + value);

                Thread.sleep(1000);
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                if(jedis != null){
                    jedis.close();
                }
            }
        }
    }

}

运行main函数,可以看到类似如下的输出:
Redis一主二从三哨兵高可用实践_第2张图片看一下redis可视化工具,确实多出很多键值对,说明连接成功:
Redis一主二从三哨兵高可用实践_第3张图片


高可用测试

注:测试过程中一定要保证我们的测试代码一直处于运行状态。
现在测试代码在不断向主库插入数据。我们将主库停机,以测试高可用:

  1. 键入ps -ef | grep redis查看主库进程的pid号:
    Redis一主二从三哨兵高可用实践_第4张图片
  2. 销毁主库进程
    键入 kill 17199 ,查看idea控制台输出:
    Redis一主二从三哨兵高可用实践_第5张图片我们发现在30秒的持续报错之后,主库被切换成了6381,继续运行。

此时查看我们redis-6380,redis-6381,sentinel-26379的部分信息分别如下:
3. 键入 redis-cli -p 6380 info
Redis一主二从三哨兵高可用实践_第6张图片
可以看到master_port从6379转为了6381

  1. 键入 redis-cli -p 6381 info
    7174723466.png)可以看到redis-6381已经变成了主节点,它有一个从节点是6380。6379已经看不到了(被我们kill掉了)
  2. 键入 redis-cli -p 26379 info
    Redis一主二从三哨兵高可用实践_第7张图片这里slaves并没有因为6379的停机而从2变成1。我们可以看一下sentinel-26379的配置文件:
    Redis一主二从三哨兵高可用实践_第8张图片显然这里6379是被修改成了从节点。

以上说明高可用测试成功。

你可能感兴趣的:(Redis)