Sentinel實現Redis集羣的高可用java
redis集羣中有一主一從兩個節點。當主節點down掉的時候須要把從節點提高爲主節點繼續提供服務,從而實現高可用。結構圖以下,git
redis單機多實例主從的安裝和配置請參考:http://my.oschina.net/xinxingegeya/blog/389521redis
下面是具體的搭建過程和一些驗證。這裏咱們創建三個redis節點,其中兩個是slave節點;創建三個sentinel節點,同時監控redis集羣中的master節點。shell
目錄結構以下,服務器
➜ redis tree -L 1 . ├── conf ├── data ├── log ├── redis_7000 ├── redis_7001 ├── redis_7002 ├── redis_8000 ├── redis_9000 └── run 9 directories, 0 files
其中conf存放redis的配置文件,data爲redis的數據存儲目錄,log爲redis的日誌目錄,run爲redis的pid文件目錄。svn
這裏使用了一個master節點,兩個slave節點的結構設計,其中的7000做爲master節點,7001和7002節點做爲slave節點。測試
首先啓動三臺redis服務器,以下,spa
➜ redis_7000 ./src/redis-server ./7000.conf ➜ redis_7001 ./src/redis-server ./7001.conf ➜ redis_7002 ./src/redis-server ./7002.conf ➜ redis ps -ef | grep redis 501 3940 1 0 10:22下午 ?? 0:03.76 ./src/redis-server *:7000 501 4299 1 0 11:30下午 ?? 0:01.34 ./src/redis-server *:7001 501 4594 1 0 12:06上午 ?? 0:00.08 ./src/redis-server *:7002 501 4619 603 0 12:08上午 ttys000 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn redis
能夠看到三臺已經啓動成功。等會再配置他們三個的主從關係。.net
下面咱們再來配置sentinel集羣(單機環境)。設計
首先在redis目錄下創建sentinel目錄,而後在sentinel目錄下創建conf目錄。配置sentinel的配置文件,典型的配置內容以下,
port 27000 daemonize yes sentinel monitor mymaster 127.0.0.1 7000 2 sentinel down-after-milliseconds mymaster 60000 sentinel failover-timeout mymaster 180000 sentinel parallel-syncs mymaster 1
而後複製三份,以下目錄結構,
➜ conf pwd /Users/xinxingegeya/IDE/redis/sentinel/conf ➜ conf tree -L 1 . ├── 27000.conf ├── 27001.conf └── 27002.conf 0 directories, 3 files
而後修改其餘配置文件端口配置。每一個sentinel節點監控同一個master。(sentinel能夠監控多個master)
在啓動三臺sentinel實例以前,首先配置redis節點的主從關係,slaveof 127.0.0.1 7000,而後啓動sentinel,以下,
➜ redis redis-sentinel ./sentinel/conf/27000.conf ➜ redis redis-sentinel ./sentinel/conf/27001.conf ➜ redis redis-sentinel ./sentinel/conf/27002.conf ➜ redis ps -ef | grep sentinel 501 2041 1 0 11:57上午 ?? 0:00.04 redis-sentinel *:27000 [sentinel] 501 2047 1 0 11:57上午 ?? 0:00.03 redis-sentinel *:27001 [sentinel] 501 2053 1 0 11:57上午 ?? 0:00.03 redis-sentinel *:27002 [sentinel] 501 2059 1513 0 11:57上午 ttys003 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn sentinel
ok,啓動成功,測試一下,首先鏈接到其中一個sentinel節點,以下,
sentinel masters :列出全部被監視的redis master節點服務實例,以及這些主服務實例的當前狀態
➜ redis redis-cli -p 27000 127.0.0.1:27000> ping PONG 127.0.0.1:27000> sentinel masters 1) 1) "name" 2) "mymaster" 3) "ip" 4) "127.0.0.1" 5) "port" 6) "7000" 7) "runid" 8) "f88ecba3ead6681d4b1bcf42d2200fbce91f4dc8" 9) "flags" 10) "master" 11) "pending-commands" 12) "0" 13) "last-ping-sent" 14) "0" 15) "last-ok-ping-reply" 16) "523" 17) "last-ping-reply" 18) "523" 19) "down-after-milliseconds" 20) "60000" 21) "info-refresh" 22) "6819" 23) "role-reported" 24) "master" 25) "role-reported-time" 26) "168481" 27) "config-epoch" 28) "0" 29) "num-slaves" 30) "2" 31) "num-other-sentinels" 32) "2" 33) "quorum" 34) "2" 35) "failover-timeout" 36) "180000" 37) "parallel-syncs" 38) "1" 127.0.0.1:27000>
sentinel slaves mymaster查看mymaster主節點下全部slave節點的狀態
127.0.0.1:27000> sentinel slaves mymaster 1) 1) "name" 2) "127.0.0.1:7001" 3) "ip" 4) "127.0.0.1" 5) "port" 6) "7001" 7) "runid" 8) "c1e9d93b0fcbbb227d0ef787132139b4c8cd5670" 9) "flags" 10) "slave" 11) "pending-commands" 12) "0" 13) "last-ping-sent" 14) "0" 15) "last-ok-ping-reply" 16) "421" 17) "last-ping-reply" 18) "421" 19) "down-after-milliseconds" 20) "60000" 21) "info-refresh" 22) "8938" 23) "role-reported" 24) "slave" 25) "role-reported-time" 26) "491839" 27) "master-link-down-time" 28) "0" 29) "master-link-status" 30) "ok" 31) "master-host" 32) "127.0.0.1" 33) "master-port" 34) "7000" 35) "slave-priority" 36) "100" 37) "slave-repl-offset" 38) "104764" 2) 1) "name" 2) "127.0.0.1:7002" 3) "ip" 4) "127.0.0.1" 5) "port" 6) "7002" 7) "runid" 8) "d4616cf835c89454fec5917713c9d0092c8b71f3" 9) "flags" 10) "slave" 11) "pending-commands" 12) "0" 13) "last-ping-sent" 14) "0" 15) "last-ok-ping-reply" 16) "421" 17) "last-ping-reply" 18) "421" 19) "down-after-milliseconds" 20) "60000" 21) "info-refresh" 22) "8938" 23) "role-reported" 24) "slave" 25) "role-reported-time" 26) "491839" 27) "master-link-down-time" 28) "0" 29) "master-link-status" 30) "ok" 31) "master-host" 32) "127.0.0.1" 33) "master-port" 34) "7000" 35) "slave-priority" 36) "100" 37) "slave-repl-offset" 38) "104764" 127.0.0.1:27000>
從上面咱們能夠看到,如今的master節點是:127.0.0.1:7000;而且有兩個slave節點。
而後咱們把該master進程kill掉,而後查看如今的master節點是:
127.0.0.1:27000> sentinel masters 1) 1) "name" 2) "mymaster" 3) "ip" 4) "127.0.0.1" 5) "port" 6) "7001" 7) "runid" 8) "c1e9d93b0fcbbb227d0ef787132139b4c8cd5670" 9) "flags" 10) "master" 11) "pending-commands" 12) "0" 13) "last-ping-sent" 14) "0" 15) "last-ok-ping-reply" 16) "1002" 17) "last-ping-reply" 18) "1002" 19) "down-after-milliseconds" 20) "60000" 21) "info-refresh" 22) "5491" 23) "role-reported" 24) "master" 25) "role-reported-time" 26) "15667" 27) "config-epoch" 28) "1" 29) "num-slaves" 30) "2" 31) "num-other-sentinels" 32) "2" 33) "quorum" 34) "2" 35) "failover-timeout" 36) "180000" 37) "parallel-syncs" 38) "1" 127.0.0.1:27000>
能夠看到如今master節點是127.0.0.1:7001節點。可以自動的進行故障轉移的操做。基本試驗完成。
=============END=============