Redis主從配置及HA方案

首先說下主從同步Replication的原理html

在Slave啓動並鏈接到Master以後,它將主動發送一條SYNC命令。此後Master將啓動後臺存盤進程,同時收集全部接收到的用於修改數據集的命令,在後臺進程執行完畢後,Master將傳送整個數據庫文件到Slave,以完成一次徹底同步。而Slave服務器在接收到數據庫文件數據以後將其存盤並加載到內存中。此後,Master繼續將全部已經收集到的修改命令,和新的修改命令依次傳送給Slaves,Slave將在本次執行這些數據修改命令,從而達到最終的數據同步。redis

若是Master和Slave之間的連接出現斷連現象,Slave能夠自動重連Master,可是在鏈接成功以後,一次徹底同步將被自動執行。數據庫

 

服務器名稱 內網IP服務器

Master 172.30.21.96
Slave1 172.30.21.88
Slave2 172.30.21.89
Slave3 172.30.21.90
Slave4 172.30.21.91架構


master配置分佈式

logfile 「/tmp/redis6379.log」
# slaveof
<masterip> <masterport> #master這個地方註釋不打開,保持默認

啓動master測試

./redis-server ../redis.conf &

slave配置ui

logfile 「/tmp/redis6379.log」
slaveof 172.30.21.96 6379 

啓動slavespa

./redis-server ../redis.conf &

檢查啓動結果.net

在各自服務器上用 redis-cli客戶端鏈接redis,輸入info指令,便可查看主從的狀態。

master:

slave:

 

主從切換

Redis的主從架構,若是沒有設置哨兵,那麼若是master出現故障,須要手動將slave切換成master繼續服務。下面先說明如何進行手動切換:

#在新的master上執行:
SLAVEOF NO ONE
#在其餘的slave上執行:
SLAVEOF <新的masterip> <新的masterport>

原來的主redis恢復正常了,要從新切換回去。從新切回的步驟以下:

1 將如今的主redis的數據進行保存(save指令)
2 將如今的主redis根目錄下dump.rdb文件拷貝覆蓋到原來主redis的根目錄
3 啓動原來的主redis
4 在如今的主redis中切換 SLAVEOF <舊的masterip> <舊的masterport>
5 在其餘的slave節點切換 SLAVEOF <舊的masterip> <舊的masterport>
6 完畢

自動切換(高可用方案配置)

  手動的方式容易形成失誤,容易致使數據丟失,並且若是主從節點不少,切換起來也很麻煩。自動切換通常經過設置哨兵實現。哨兵能夠對master和slave進行監控,並在master出現故障的時候,能自動將slave切換成master。

  redis哨兵(Redis Sentinel)的啓動和redis實例的啓動沒有關係。因此能夠在任何機器上啓動redis哨兵。Redis Sentinel 是一個分佈式系統,能夠在整個redis主從架構中運行多個 Sentinel 進程(progress)。建議至少要保證有兩個哨兵在運行,要否則物理機宕機後哨兵進程也不存在了,就沒法進行主從切換。

  咱們這裏有5臺redis服務器(1主4從),因此啓動5個哨兵。每一個哨兵的配置以下:

 修改sentinel.conf的配置:

logfile "/tmp/sentinel.log"
sentinel monitor mymaster 172.30.21.96 6379 2 #這個2表明,當集羣中有2個sentinel認爲master掛了時,才能真正認爲該master已經不可用了

啓動sentinel(默認端口號26379)

./redis-sentinel ../sentinel.conf &

 

關於sentinel能夠看官方文檔,有不少的說明。這裏列出一些主要的配置屬性:

# 指明日誌文件名
logfile "/tmp/sentinel.log"
# 哨兵監控的master,主從配置同樣,這裏只用輸入redis主節點的ip/port和法定人數。
sentinel monitor mymaster 172.30.21.96 6379 1
# master或slave多長時間(默認30秒)不能使用後標記爲s_down狀態。
sentinel down-after-milliseconds mymaster 5000
# 若sentinel在該配置值內未能完成failover操做(即故障時master/slave自動切換),則認爲本次failover失敗。
sentinel failover-timeout mymaster 18000
# 設置master和slaves驗證密碼
sentinel auth-pass mymaster 123456 
# 指定了在執行故障轉移時, 最多能夠有多少個從服務器同時對新的主服務器進行同步
sentinel parallel-syncs mymaster 1

 

經過哨兵查看集羣的信息:

$ redis-cli -p 26379
sentinel master mymaster//查看master的狀態 
SENTINEL slaves mymaster //查看salves的狀態
SENTINEL sentinels mymaster //查看哨兵的狀態
SENTINEL get-master-addr-by-name mymaster//獲取當前master的地址
info sentinel//查看哨兵信息

 

寫個代碼測試下:

public static void main(String[] args) {
        Set<String> sentinels = new HashSet<String>();
        sentinels.add(new HostAndPort("172.30.21.96", 26379).toString());
        sentinels.add(new HostAndPort("172.30.21.88", 26379).toString());
        sentinels.add(new HostAndPort("172.30.21.89", 26379).toString());
        sentinels.add(new HostAndPort("172.30.21.90", 26379).toString());
        sentinels.add(new HostAndPort("172.30.21.91", 26379).toString());
        JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster", sentinels);

        System.out.println("Current master: " + sentinelPool.getCurrentHostMaster().toString());

        Jedis master = sentinelPool.getResource();
        //master.set("username","jager");

        System.out.println(master.get("username"));

        sentinelPool.close();
        sentinelPool.destroy();
    }

 

參考文檔:

http://blog.csdn.net/quiet_boy/article/details/53885406

http://www.cnblogs.com/Xrinehart/p/3502198.html

http://www.cnblogs.com/clor001/p/5409891.html

http://www.cnblogs.com/lulu/archive/2013/04/14/3021261.html

相關文章
相關標籤/搜索