2-23 5,020 views
使用Keepalived+Redis搭建Redis高可用主从,其中Keepalived配置为每隔2秒执行脚本检查Redis服务是否可用:
1 2 3 4 5 |
vrrp_script chk_redis { script "/usr/local/keepalived/scripts/redis_check.sh 127.0.0.1 6379" interval 2 weight -2 } |
redis_check.sh脚本如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/bin/bash LOGFILE="/var/log/keepalived-redis-check.log" if [ "`/usr/local/bin/redis-cli -h $1 -p $2 PING`" == "PONG" ]; then : exit 0 else sleep 1 if [ "`/usr/local/bin/redis-cli -h $1 -p $2 PING`" == "PONG" ]; then : exit 0 else date >> $LOGFILE echo "Failed:redis-cli -h $1 -p $2 PING" >> $LOGFILE 2>&1 exit 1 fi fi |
使用过程中发现虚IP会经常从主服务器漂移至从服务器,而此时主服务器Keepalived和Redis进程都在。查看/var/log/messages中的Keepalived日志:
发现是由于检查Redis服务是否可用的脚本超时,减少了主服务器Keepalived的权重,从而导致主从服务器状态切换、虚IP漂移,而脚本执行超时时间默认与执行间隔相等(2秒)。脚本主要执行Redis的PING操作,为什么有时候执行PING操作会超过2秒,进一步检查发现是该Redis在某些时间段读写频率非常高,QPS达到6万,造成PING操作响应慢。
针对这个问题,解决方法就是搭建多个Redis主从,通过代理或直接在客户端将请求分摊到各个Redis主从上,减少单个Redis主从压力,避免PING操作响应慢,另外就是增大脚本执行间隔,增大执行超时时间。