使用 sentinel 实现高可用 redis HA

前两天接到领导要求,要把现网上所有的组件都配置热备,即 master down 掉后, slave 可以自动接管处理请求。

hbase 就不说了,比较简单,直接再开一个 master ,系统会自动归入 backup master ,在主 master 挂掉后,会自动接管旗下的 servers 。

redis 由于之前研究较少,所以比较纠结,之前一直都是用 slaveof 来同步数据,但是在 master 挂掉后,无法自动接管,还是 slave 状态,得手动切换,不符合热备的要求。

逼不得已去查看官方文档,找到了 High Availability: Redis Sentinel is the official high availability solution for Redis. 这个功能,遂发现了 sentinel 这个高端货。(后来才发现,这个功能好早就有了,是我太 out 了。 @!@)

根据文档说明, sentinel 能实现的功能如下:

sentinel功能

开始部署

redis安装(略)

装完后设置环境变量

REDIS_HOME=/usr/local/redis

设置变量

可以不设置此脚本,此处只是兼作环境说明。

1
2
3
4
5
6
7
8
9
10
11
vi $REDIS_HOME/bin/setEnv.sh

########
readonly MASTER=192.168.1.2
readonly SLAVE=192.168.1.3
readonly SENTINEL1=192.168.1.4
readonly SENTINEL2=192.168.1.5
readonly SENTINEL3=192.168.1.6
readonly REDIS_PORT=6379
readonly SENTINEL_PORT=26379
########

设置 sentinel 配置

1
2
3
4
5
6
7
8
9
vi $REDIS_HOME/conf/sentinel.conf

########
port 26379
sentinel monitor mymaster 192.168.1.2 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
########

为了拷贝方便以及切换方便,以上步骤在所有主机上执行。(也可以在一台主机上执行后分发到各主机。)

启动

启动 master

1
2
source $REDIS_HOME/bin/setEnv.sh
redis-server $REDIS_HOME/conf/redis.conf --port $REDIS_PORT

启动 slave

1
2
3
source $REDIS_HOME/bin/setEnv.sh
redis-server $REDIS_HOME/conf/redis.conf --slaveof $MASTER $REDIS_PORT --port $REDIS_PORT
#注意:--slaveof 参数只使用一次,后续sentinel会把相关配置直接写入conf,无需再次使用此参数,否则可能会报错。

启动 sentinel(三台)

1
2
source $REDIS_HOME/bin/setEnv.sh
redis-server $REDIS_HOME/conf/sentinel.conf --sentinel &> $REDIS_HOMT/logs/sentinel.log &

验证

查看 master 状态

1
2
source $REDIS_HOME/bin/setEnv.sh
redis-cli -h $MASTER -p $REDIS_PORT INFO

查看 slave 状态

1
2
source $REDIS_HOME/bin/setEnv.sh
redis-cli -h $SLAVE -p $REDIS_PORT INFO

查看 sentinel 状态

1
2
source $REDIS_HOME/bin/setEnv.sh
redis-cli -h $SENTINEL1 -p $SENTINEL_PORT INFO

测试步骤

到 master 上设置一个 key

1
2
3
source $REDIS_HOME/bin/setEnv.sh
redis-cli -h $MASTER -p $REDIS_PORT
>set xx 00

shutdown master

1
2
source $REDIS_HOME/bin/setEnv.sh
redis-cli -h $MASTER -p $REDIS_PORT shutdown

查看 sentinel 日志

1
2
tail -100f $REDIS_HOME/logs/sentinel.log
#正确的结果是可以看到sentinel**自动把slave切换为新的master**

到新的 master 上获取 key 并新建一个 key

1
2
3
4
5
source $REDIS_HOME/bin/setEnv.sh
redis-cli -h $SLAVE -p $REDIS_PORT
>get xx
#正确的结果为可以获取到“00”
>set yy 11

启动原 master

1
2
source $REDIS_HOME/bin/setEnv.sh
redis-server $REDIS_HOME/conf/redis.conf --port $REDIS_PORT

查看 sentinel 日志

1
2
tail -100f $REDIS_HOME/logs/sentinel.log
#正确的结果是可以看到sentinel自动识别原master节点,**并自动把它设置为slave**

shutdown 现有的 master

1
2
source $REDIS_HOME/bin/setEnv.sh
redis-cli -h $SLAVE -p $REDIS_PORT shutdown

查看 sentinel 日志

1
2
3
tail -100f $REDIS_HOME/logs/sentinel.log
#正确的结果是可以看到sentinel**自动把现有的slave切换为新的master**
#所以,$MASTER又回到了master

查看 key 是否有丢失

1
2
3
4
5
source $REDIS_HOME/bin/setEnv.sh
redis-cli -h $MASTER -p $REDIS_PORT
>get xx
>get yy
#正确的结果是,可以获取到“00”和“11”

再次启动 slave

1
2
source $REDIS_HOME/bin/setEnv.sh
redis-server $REDIS_HOME/conf/redis.conf --port $REDIS_PORT

测试结束,查看以上的验证步骤,可以看到各功能状态如初。

部署结束!