文章目录[隐藏]
前两天接到领导要求,要把现网上所有的组件都配置热备,即 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 能实现的功能如下:
开始部署
redis安装(略)
装完后设置环境变量
REDIS_HOME=/usr/local/redis
设置变量
可以不设置此脚本,此处只是兼作环境说明。
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 配置
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
source $REDIS_HOME/bin/setEnv.sh
redis-server $REDIS_HOME/conf/redis.conf --port $REDIS_PORT
启动 slave
source $REDIS_HOME/bin/setEnv.sh
redis-server $REDIS_HOME/conf/redis.conf --slaveof $MASTER $REDIS_PORT --port $REDIS_PORT
#注意:--slaveof 参数只使用一次,后续sentinel会把相关配置直接写入conf,无需再次使用此参数,否则可能会报错。
启动 sentinel(三台)
source $REDIS_HOME/bin/setEnv.sh
redis-server $REDIS_HOME/conf/sentinel.conf --sentinel &> $REDIS_HOMT/logs/sentinel.log &
验证
查看 master 状态
source $REDIS_HOME/bin/setEnv.sh
redis-cli -h $MASTER -p $REDIS_PORT INFO
查看 slave 状态
source $REDIS_HOME/bin/setEnv.sh
redis-cli -h $SLAVE -p $REDIS_PORT INFO
查看 sentinel 状态
source $REDIS_HOME/bin/setEnv.sh
redis-cli -h $SENTINEL1 -p $SENTINEL_PORT INFO
测试步骤
到 master 上设置一个 key
source $REDIS_HOME/bin/setEnv.sh
redis-cli -h $MASTER -p $REDIS_PORT
>set xx 00
shutdown master
source $REDIS_HOME/bin/setEnv.sh
redis-cli -h $MASTER -p $REDIS_PORT shutdown
查看 sentinel 日志
tail -100f $REDIS_HOME/logs/sentinel.log
#正确的结果是可以看到sentinel**自动把slave切换为新的master**
到新的 master 上获取 key 并新建一个 key
source $REDIS_HOME/bin/setEnv.sh
redis-cli -h $SLAVE -p $REDIS_PORT
>get xx
#正确的结果为可以获取到“00”
>set yy 11
启动原 master
source $REDIS_HOME/bin/setEnv.sh
redis-server $REDIS_HOME/conf/redis.conf --port $REDIS_PORT
查看 sentinel 日志
tail -100f $REDIS_HOME/logs/sentinel.log
#正确的结果是可以看到sentinel自动识别原master节点,**并自动把它设置为slave**
shutdown 现有的 master
source $REDIS_HOME/bin/setEnv.sh
redis-cli -h $SLAVE -p $REDIS_PORT shutdown
查看 sentinel 日志
tail -100f $REDIS_HOME/logs/sentinel.log
#正确的结果是可以看到sentinel**自动把现有的slave切换为新的master**
#所以,$MASTER又回到了master
查看 key 是否有丢失
source $REDIS_HOME/bin/setEnv.sh
redis-cli -h $MASTER -p $REDIS_PORT
>get xx
>get yy
#正确的结果是,可以获取到“00”和“11”
再次启动 slave
source $REDIS_HOME/bin/setEnv.sh
redis-server $REDIS_HOME/conf/redis.conf --port $REDIS_PORT
测试结束,查看以上的验证步骤,可以看到各功能状态如初。
部署结束!