Sentinel实现Redis集群的高可用
redis集群中有一主一从两个节点。当主节点down掉的时候需要把从节点提升为主节点继续提供服务,从而实现高可用。结构图如下,
redis单机多实例主从的安装和配置请参考:http://my.oschina.net/xinxingegeya/blog/389521
下面是具体的搭建过程和一些验证。这里我们建立三个redis节点,其中两个是slave节点;建立三个sentinel节点,同时监控redis集群中的master节点。
目录结构如下,
➜ 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文件目录。
这里使用了一个master节点,两个slave节点的结构设计,其中的7000作为master节点,7001和7002节点作为slave节点。
首先启动三台redis服务器,如下,
➜ 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
可以看到三台已经启动成功。等会再配置他们三个的主从关系。
下面我们再来配置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=============