1. 程式人生 > >redis 主從備份自動切換+java程式碼實現類

redis 主從備份自動切換+java程式碼實現類

閱讀本文您會學會: 1.redis 主從備份並自動切換(master slaver)模式的搭建 2.java 中 配合redis主從備份的方法 【實現目標】: master redis 正常執行 slaver redis 自動備份 master 的所有資料 當master redis 冗掉 slaver 自動升級為master 接替原來master 的工作 當原master 重啟後 自動加入主從備份,原master 會變成新的slaver。 【環境配置】: 此類叢集配置需要至少三臺機器(當然,可以是虛擬機器),三臺機器分別安裝同樣的redis 環境,並配置好ip,及port ip分別為:

* 192.168.9.17(redis sentinel 叢集監控)
* 192.168.9.18(redis 主)
* 192.168.9.19(redis 從)

chmod 【redis 配置】 主:

* 主的redis 配置檔案,使用預設的配置檔案就可以,當然配置一下更好
* 
    * 此處主要配置的有埠號   port 6379
    * 後臺啟動   daemonize yes
    * 日誌位置,注意要自己新建.log型別檔案     logfile"home\oracle\redis\text.log"

從:

* 從的redis 配置檔案
* 
    * 同主的三個配置屬性
    * 增加master 配置     slaveof 192.168.9.18 6379

sentinel:

* 從安裝檔案目錄下複製 sentinel.conf 檔案到軟體目錄
* 編輯該檔案,可將原來的檔案中屬性文字等清空,再加上下列文字

redis-0##sentinel例項之間的通訊埠

port 26379#master1 sentinel monitor master1 192.168.9.18 6379 1 sentinel down-after-milliseconds master1 5000 sentinel failover-timeout master1 900000 sentinel parallel-syncs master1 2

master2 可以新增多組主從的redis監聽…….

… .. ..

【啟動】

* 一定要按順序啟動redis,先啟動主,再啟動從,最後啟動sentinel
* 
    * ./redis-server ./redis.conf
    * ./redis-sentinel ./sentinel.conf --sentinel 
    * ps:如果提示-bash 許可權不夠 則使用chmod 777 ./redis.conf 這個命令 執行所有需要執行的檔案  然後再正常啟動就可以了。

* 啟動後 可以檢視redis 的資訊
* ./redis-cli -h 192.168.9.18 -p 6379 info 檢視redis資訊

Replication

role:slave #代表192.168.9.18:6379 這臺redis是主 master_host:192.168.9.18 master_port:6379 master_link_status:up master_last_io_seconds_ago:4 master_sync_in_progress:0 slave_priority:100 slave_read_only:1 connected_slaves:0

* ./redis-cli -h 192.168.9.17 -p 26379 info  檢視sentinel 叢集資訊,如下則表示配置成功

Sentinel

sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 master0:name=master1,status=ok,address=192.168.9.18:6379,slaves=1,sentinels=1 【故障演示】

* 主redis 冗掉後    ./redis-cli -h 192.168.9.18 -p 6379 shutdown 
* 則發現redis 自動把slaver機器升級為master ,而重新啟動原來的master服務,則原master服務會變成新的slaver。
* 注意:如果master 發生遷移後,需要重新啟動所有redis 的情況下,必須最先啟動“新的”master節點,否則sentinel 會一直找不到master。如果想要停止sentinel,可輸入./redis-cli -p 26379 shutdown
  • 【程式碼處配合自動切換】

上述部分是伺服器部分自動切換,還需要程式處修改redis配置,此處我們使用jedis 進行演示。 使用以下配置類即可 核心程式碼在於 Set sentinels = new HashSet(); // 此處放置ip及埠為 sentinel // 服務地址,如果有多個sentinel 則逐一add即可 sentinels.add(“80.27.112.118:26379”); jedisPool = new JedisSentinelPool(“master1”,sentinels); 以下程式碼為工具類 通過配置後可以直接使用

package com.aisino.redis;

import java.util.HashSet; import java.util.List; import java.util.Set;

import com.aisino.spring.util.SystemConfig;

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

public class JedisClusterUtil {

static {
    // redis 屬性配置 start
    JedisPoolConfig config = new JedisPoolConfig();
    config.setMaxTotal(5000);
    config.setMaxIdle(256);
    config.setMaxWaitMillis(5000L);
    config.setTestOnBorrow(true);
    config.setTestOnReturn(true);
    config.setTestWhileIdle(true);
    config.setMinEvictableIdleTimeMillis(60000L);
    config.setTimeBetweenEvictionRunsMillis(3000L);
    config.setNumTestsPerEvictionRun(-1);
    // redis 屬性配置 end

    Set<String> sentinels = new HashSet<String>();
    sentinels.add("80.27.112.118:26379"); // 此處放置ip及埠為 sentinel
                                            // 服務地址,如果有多個sentinel 則逐一add即可
    jedisPool = new JedisSentinelPool("master1", sentinels, config);
}

private static JedisSentinelPool jedisPool;

public static String get(String key) {
    String value = null;
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        value = jedis.get(key);
    } catch (Exception e) {
        jedisPool.returnBrokenResource(jedis);
        e.printStackTrace();
    } finally {
        close(jedis);
    }
    return value;
}

public static void close(Jedis jedis) {
    try {
        jedisPool.returnResource(jedis);
    } catch (Exception e) {
        if (jedis.isConnected()) {
            jedis.quit();
            jedis.disconnect();
        }
    }
}

public static byte[] get(byte[] key) {
    byte[] value = null;
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        value = jedis.get(key);
    } catch (Exception e) {
        jedisPool.returnBrokenResource(jedis);
        e.printStackTrace();
    } finally {
        close(jedis);
    }

    return value;
}

public static void set(String key, String value) {
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        jedis.set(key, value);
    } catch (Exception e) {
        jedisPool.returnBrokenResource(jedis);
        e.printStackTrace();
    } finally {
        close(jedis);
    }
}

public static void set(String key, String value, int time) {
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        jedis.set(key, value);
        jedis.expire(key, time);
    } catch (Exception e) {
        jedisPool.returnBrokenResource(jedis);
        e.printStackTrace();
    } finally {
        close(jedis);
    }
}

public static void set(byte[] key, byte[] value, int time) {
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        jedis.set(key, value);
        jedis.expire(key, time);
    } catch (Exception e) {
        jedisPool.returnBrokenResource(jedis);
        e.printStackTrace();
    } finally {
        close(jedis);
    }
}

public static void hset(byte[] key, byte[] field, byte[] value) {
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        jedis.hset(key, field, value);
    } catch (Exception e) {
        jedisPool.returnBrokenResource(jedis);
        e.printStackTrace();
    } finally {
        close(jedis);
    }
}

public static void hset(String key, String field, String value) {
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        jedis.hset(key, field, value);
    } catch (Exception e) {
        jedisPool.returnBrokenResource(jedis);
        e.printStackTrace();
    } finally {
        close(jedis);
    }
}

public static String hget(String key, String field) {
    String value = null;
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        value = jedis.hget(key, field);
    } catch (Exception e) {
        jedisPool.returnBrokenResource(jedis);
        e.printStackTrace();
    } finally {
        close(jedis);
    }

    return value;
}

public static byte[] hget(byte[] key, byte[] field) {
    byte[] value = null;
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        value = jedis.hget(key, field);
    } catch (Exception e) {
        jedisPool.returnBrokenResource(jedis);
        e.printStackTrace();
    } finally {
        close(jedis);
    }

    return value;
}

public static void hdel(byte[] key, byte[] field) {
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        jedis.hdel(key, new byte[][] { field });
    } catch (Exception e) {
        jedisPool.returnBrokenResource(jedis);
        e.printStackTrace();
    } finally {
        close(jedis);
    }
}

public static void lpush(String key, String value) {
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        jedis.lpush(key, new String[] { value });
    } catch (Exception e) {
        jedisPool.returnBrokenResource(jedis);
        e.printStackTrace();
    } finally {
        close(jedis);
    }
}

public static void rpush(byte[] key, byte[] value) {
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        jedis.rpush(key, new byte[][] { value });
    } catch (Exception e) {
        jedisPool.returnBrokenResource(jedis);
        e.printStackTrace();
    } finally {
        close(jedis);
    }
}

public static void rpoplpush(byte[] key, byte[] destination) {
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        jedis.rpoplpush(key, destination);
    } catch (Exception e) {
        jedisPool.returnBrokenResource(jedis);
        e.printStackTrace();
    } finally {
        close(jedis);
    }
}

public static List<byte[]> lpopList(byte[] key) {
    List list = null;
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        list = jedis.lrange(key, 0L, -1L);
    } catch (Exception e) {
        jedisPool.returnBrokenResource(jedis);
        e.printStackTrace();
    } finally {
        close(jedis);
    }

    return list;
}

public static String rpop(String key) {
    String bytes = null;
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        bytes = jedis.rpop(key);
    } catch (Exception e) {
        jedisPool.returnBrokenResource(jedis);
        e.printStackTrace();
    } finally {
        close(jedis);
    }

    return bytes;
}

public static List<byte[]> lrange(byte[] key, int from, int to) {
    List result = null;
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        result = jedis.lrange(key, from, to);
    } catch (Exception e) {
        jedisPool.returnBrokenResource(jedis);
        e.printStackTrace();
    } finally {
        close(jedis);
    }

    return result;
}

public static void del(String key) {
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        jedis.del(key);
    } catch (Exception e) {
        jedisPool.returnBrokenResource(jedis);
        e.printStackTrace();
    } finally {
        close(jedis);
    }
}

public static long llen(byte[] key) {
    long len = 0L;
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        jedis.llen(key);
    } catch (Exception e) {
        jedisPool.returnBrokenResource(jedis);
        e.printStackTrace();
    } finally {
        close(jedis);
    }
    return len;
}
  • }