Redis+Keepalived高可用环境部署记录

Keepalived 实现VRRP(虚拟路由冗余)协议,从路由级别实现VIP切换,可以完全避免类似heartbeat脑裂问题,可以很好的实现主从、主备、互备方案,尤其是无状态业务,有状态业务就需要额外花些功夫了。既然Mysql可以使用Keepalived很好的做到主从切换,那么Redis自然可以使用这种方式实现高可用。

Redis主从实现完全没有Mysql成熟,仅仅是可用而已,经过测试主从也不是那么完全不靠谱,主要问题在于同步连接断开之后需要重新全量同步,如果频繁进行会对主服务带来很大性能影响。 但现实中主从机器往往要求放在一个机柜同一台交换设备下,网络闪断情况极低;再者主从同步在同步数量量大情况下,需要将缓存区调得足够大,不然也容易造成连接断开。
实现切换逻辑如下:A和B两台机器
1)A 、B机器依次启动,A机作为主、B机为从
2)主A机挂掉,B机接管业务并作为主。
3)A机起来,作为从SLAVEOF B
4)B机挂掉,A机再切回主

在Keepalived 有两个角色:Master(一个)、Backup(多个),如果设置一个为Master,但Master挂了后再起来,必然再次业务又一次切换,这对于有状态服务是不可接受的。解决方案就是两台机器都设置为Backup,而且优先级高的Backup设置为nopreemt 不抢占。

部署记录:

0)服务器信息

192.168.10.205    redis-master     需要安装redis(3.2.0版本)、keepalived(1.3.2版本)
192.168.10.206    redis-slave      需要安装redis(3.2.0版本)、keepalived(1.3.2版本)
192.168.10.230    VIP

1)安装redis服务(两个节点机都要操作)

[root@redis-master ~]# cd /usr/local/src/
[root@redis-master src]# wget http://download.redis.io/releases/redis-3.2.0.tar.gz
[root@redis-master src]# tar -zvxf redis-3.2.0.tar.gz
[root@redis-master src]# cd redis-3.2.0
[root@redis-master redis-3.2.0]# make

添加相关文件及命令
[root@redis-master redis-3.2.0]# mkdir -p /usr/local/redis/bin/ 
[root@redis-master redis-3.2.0]# cd src
[root@redis-master src]# cp redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel /usr/local/redis/bin/
[root@redis-master src]# cd ../
[root@redis-master redis-3.2.0]# cp redis.conf /etc/

添加redis启动脚本
[root@redis-master redis-3.2.0]# vim /etc/init.d/redis 
#!/bin/bash
#chkconfig: 2345 10 90
#description: Start and Stop redis

REDISPORT=6379

EXEC=/usr/local/redis/bin/redis-server

REDIS_CLI=/usr/local/redis/bin/redis-cli 

PIDFILE=/var/run/redis.pid

CONF="/etc/redis.conf"

case "$1" in

start)

if [ -f $PIDFILE ]

then

echo "$PIDFILE exists, process is already running or crashed"

else

echo "Starting Redis server..."

$EXEC $CONF

fi

if [ "$?"="0" ]

then

echo "Redis is running..."

fi

;;

stop)

if [ ! -f $PIDFILE ]

then

echo "$PIDFILE does not exist, process is not running"

else

PID=$(cat $PIDFILE)

echo "Stopping ..."

$REDIS_CLI -p $REDISPORT SHUTDOWN

while [ -x ${PIDFILE} ]

do

echo "Waiting for Redis to shutdown ..."

sleep 1

done

echo "Redis stopped"

fi

;;

restart|force-reload)

${0} stop

${0} start

;;

*)

echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2

exit 1

esac

添加执行权限
[root@redis-master redis-3.2.0]# chmod 755 /etc/init.d/redis

设置开机自启动
[root@redis-master redis-3.2.0]# chkconfig --add redis
[root@redis-master redis-3.2.0]# chkconfig redis on

创建redis状态日志
[root@redis-master redis-3.2.0]# mkdir /var/log/redis/
[root@redis-master redis-3.2.0]# touch /var/log/redis/redis.log

redis主从配置(先看下redis-master主节点的配置)
[root@redis-master redis-3.2.0]# vim /etc/redis.conf
.......
port 6379
.......
daemonize yes              #这个修改为yes
.......
bind 0.0.0.0               #绑定的主机地址。说明只能通过这个ip地址连接本机的redis。最好绑定0.0.0.0;注意这个不能配置成127.0.0.1,否则复制会失败!用0.0.0.0或者本机ip地址都可以
.......
pidfile /var/run/redis.pid
.......
logfile /var/log/redis/redis.log
.......
dir  /var/redis/redis      #redis数据目录
....... 
appendonly yes              #启用AOF持久化方式
appendfilename "appendonly.aof"       #AOF文件的名称,默认为appendonly.aof
appendfsync everysec        #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,是受推荐的方式。
.....
save 900 1                 #启用RDB快照功能,默认就是启用的
save 300 10
save 60 10000              #即在多少秒的时间内,有多少key被改变的数据添加到.rdb文件里
.......
slave-serve-stale-data yes    #默认就会开启
slave-read-only yes
......
dbfilename dump.rdb       #快照文件名称
......

另一个从节点redis-slave的redis.conf配置和上面基本差不多,只是多了下面一行配置:
slaveof 192.168.10.205 6379

接着创建redis的数据目录
[root@redis-master redis-3.2.0]# mkdir -p /var/redis/redis

然后启动两个节点的redis服务
[root@redis-master redis-3.2.0]# /etc/init.d/redis start
Starting Redis server...
Redis is running...
[root@redis-master redis-3.2.0]# lsof -i:6379
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 17265 root    4u  IPv4  59068      0t0  TCP *:6379 (LISTEN)

猜你喜欢

转载自www.cnblogs.com/kevingrace/p/9001975.html