Sentinel實現Redis集羣的高可用

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=============

相關文章
相關標籤/搜索