Redis ·

Redis Sentinel(哨兵):集群Failover解决方案

Redis sentinel(哨兵)模块已经被集成在redis2.6+以上版本实现了,原理不是很复杂,现在来一起分享下。

sentinel主要功能就是为Redis M-S(master,slaves)集群提供了1)master存活检测 2)集群中M-S服务监控 3) 自动故障转移,M-S角色转换等能力,从一个方面说是提高了redis集群的可用性.

一般情况下,最小M-S单元各有一个maste和slave组成,当master失效后,sentinel可以帮助我们自动将slave提升为master;有了sentinel组件,可以减少系统管理员的人工切换slave的操作过程.

sentinel的一些设计思路和zookeeper非常类似,事实上,你可以不使用sentinel,而是自己开发一个监控redis的zk客户端也能够完成相应的设计要求.

一.环境部署

准备3个redis服务,简单构建一个小的M-S环境;它们各自的redis.conf配置项中,除了port不同外,要求其他的配置完全一样(包括aof/snap,memory,rename以及授权密码等);原因是基于sentinel做故障转移,所有的server运行机制都必须一样,它们只不过在运行时"角色"不同,而且它们的角色可能在故障时会被转换;slave在某些时刻也会成为master,尽管在一般情况下,slave的数据持久方式经常采取snapshot,而master为aof,不过基于sentinel之后,slave和master均要采取aof(通过bgsave,手动触发snapshot备份).

1)  redis.conf:

##redis-0,默认为master

port 6379

##授权密码,请各个配置保持一致

requirepass 012_345^678-90

masterauth 012_345^678-90

##暂且禁用指令重命名

##rename-command

##开启AOF,禁用snapshot

appendonly yes

save “”

##slaveof no one

slave-read-only yes

##redis-1,通过启动参数配置为slave,配置文件保持独立

port 6479

slaveof 127.0.0.1 6379

##-----------其他配置和master保持一致-----------##

##redis-2,通过启动参数配置为slave,配置文件保持独立

port 6579

slaveof 127.0.0.1 6379

##-----------其他配置和master保持一致-----------##

2) sentinel.conf

请首先在各个redis服务中sentinel.conf同目录下新建local-sentinel.conf,并将复制如下配置信息.

##redis-0

##sentinel实例之间的通讯端口

port 26379

sentinel monitor def_master 127.0.0.1 6379 2

sentinel auth-pass def_master 012_345^678-90

sentinel down-after-milliseconds def_master 30000

sentinel can-failover def_master yes

sentinel parallel-syncs def_master 1

sentinel failover-timeout def_master 900000
##redis-1

port 26479

##--------其他配置同上-------##
##redis-2

port 26579

##--------其他配置同上-------#

3) 启动与检测


##redis-0(默认为master)

[leo@tojsp.com ~]$ ./redis-server --include ../redis.conf

##启动sentinel组件

[leo@tojsp.com ~]$ ./redis-sentinel ../local-sentinel.conf

按照上述指令,依次启动redis-0,redis-1,redis-2;在启动redis-1和redis-2的时候,你会发现在redis-0的sentinel控制台会输出"+sentinel ..."字样,表示有新的sentinel实例加入到监控.不过此处需要提醒,首次构建sentinel环境时,必须首先启动master机器.

此后你可以使用任意一个"redis-cli"窗口,输入"INFO"命令,可以查看当前server的状态:

[leo@tojsp.com ~]$ ./redis-cli -h 127.0.0.1 -p 6379

##如下为打印信息摘要:

#Replication

role:master

connected_salves:2

slave0:127.0.0.1,6479,online

slave1:127.0.0.1.6579,online

"INFO"指令将会打印完整的服务信息,包括集群,我们只需要关注"replication"部分,这部分信息将会告诉我们"当前server的角色"以及指向它的所有的slave信息.可以通过在任何一个slave上,使用"INFO"指令获得当前slave所指向的master信息.

"INFO"指令不仅可以帮助我们获得集群的情况,当然sentinel组件也是使用"INFO"做同样的事情.

当上述部署环境稳定后,我们直接关闭redis-0,在等待"down-after-milliseconds"秒之后(30秒),redis-0/redis-1/redis-2的sentinel窗口会立即打印"+sdown""+odown""+failover""+selected-slave""+promoted-slave""+slave-reconf"等等一系列指令,这些指令标明当master失效后,sentinel组件进行failover的过程.

当环境再次稳定后,我们发现,redis-1被提升("promoted")为master,且redis-2也通过"slave-reconf"过程之后跟随了redis-1.

如果此后想再次让redis-0加入集群,你需要首先通过"INFO"指令找到当前的masterip + port,并在启动指令中明确指明slaveof参数:

[leo@tojsp.com ~]$ ./redis-server --include ../redis.conf --slaveof 127.0.0.1 6479

sentinel实例需要全程处于启动状态,如果只启动server而不启动相应的sentinel,仍然不能确保server能够正确的被监控和管理.

参与评论