1. 程式人生 > >Redis+Keepalived高可用環境部署記錄

Redis+Keepalived高可用環境部署記錄

db文件 做了 ini 一個 keepalive red off -o BE

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)

Redis+Keepalived高可用環境部署記錄