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