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

相关文章
相关标签/搜索