Redis+keepalived安裝及配置:
1.ip規划:
服務器 |
Ip地址 |
VIP |
應用軟件 |
Redis主 |
192.168.1.102 |
192.168.1.120 |
Redis+ keepalived |
Redis備 |
192.168.1.103 |
Redis+ keepalived |
2.服務器基礎配置安裝
先安裝好基礎裝機環境,具體參考 服務器基礎環境配置 文檔
redis安裝:
1.#下載redies安裝包
wget http://download.redis.io/releases/redis-3.2.0.tar.gz tar -xf redis-3.2.0.tar.gz
2.#編譯安裝
cd redis-3.2.0
make
3.#添加相關文件及命令
mkdir /usr/local/redis/bin/ -p
cd src
cp redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel /usr/local/redis/bin/
cd ..
cp redis.conf /etc/
4.#添加啟動腳本
echo '#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
' > /etc/init.d/redis
添加執行權限:
chmod +x /etc/init.d/redis
5.#設置開機自啟動
chkconfig --add redis
chkconfig redis on
6.#創建redis狀態日志
mkdir /var/log/redis/
touch /var/log/redis/redis.log
Keepalived安裝:
1.獲取安裝包
wget http://www.keepalived.org/software/keepalived-1.2.20.tar.gz
2.解壓安裝
tar -xf keepalived-1.2.20.tar.gz
cd keepalived-1.2.20
yum -y install openssl openssl-devel
./configure && make && make install
3.文件配置
mkdir /etc/keepalived
mkdir /usr/local/keepalived/scripts/ -p
cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/sbin/keepalived /usr/sbin
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
4.添加開機自啟動
chmod +x /etc/init.d/keepalived
chkconfig --add keepalived
chkconfig keepalived on
以上操作主從都要執行
redis +keepalived配置:
1.配置redis master高可用配置文件:
vim /etc/keepalived/keepalived
! Configuration File for keepalived
global_defs {
router_id redis103
}
vrrp_script chk_redis
{
script "/usr/local/keepalived/scripts/redis_check.sh 127.0.0.1 6379" #監控腳本
interval 2 #監控時間
timeout 2 #超時時間
fall 3
}
vrrp_instance redis {
state BACKUP # master set to SLAVE also
interface eth0
lvs_sync_daemon_interface eth0
virtual_router_id 202
priority 150 #權重值
nopreempt # no seize,must add
advert_int 1
authentication { #all node must same
auth_type PASS #加密
auth_pass 1111 #密碼
}
virtual_ipaddress {
192.168.1.120 #VIP
}
track_script {
chk_redis
}
notify_master "/usr/local/keepalived/scripts/redis_master.sh 127.0.0.1 192.168.1.103 6379"
notify_backup "/usr/local/keepalived/scripts/redis_backup.sh 127.0.0.1 192.168.1.103 6379"
notify_fault /usr/local/keepalived/scripts/redis_fault.sh
notify_stop /usr/local/keepalived/scripts/redis_stop.sh
}
2.配置slave高可用配置文件(可從線上拷貝再做修改)
[root@www scripts]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id redis104
}
vrrp_script chk_redis
{
script "/usr/local/keepalived/scripts/redis_check.sh 127.0.0.1 6379" #監控腳本
interval 2 #監控時間
timeout 2 #超時時間
fall 3 #
}
vrrp_instance redis {
state BACKUP #設置為BACKUP
interface eth0 #監控網卡
lvs_sync_daemon_interface eth0 #
virtual_router_id 202
priority 100 #權重值
nopreempt # no seize,must add
advert_int 1
authentication { #all node must same
auth_type PASS #加密
auth_pass 1111 #密碼與102的相同
}
virtual_ipaddress {
192.168.1.120 # VIP
}
track_script {
chk_redis
}
notify_master "/usr/local/keepalived/scripts/redis_master.sh 127.0.0.1 192.168.1.102 6379"
notify_backup "/usr/local/keepalived/scripts/redis_backup.sh 127.0.0.1 192.168.1.102 6379"
notify_fault /usr/local/keepalived/scripts/redis_fault.sh
notify_stop /usr/local/keepalived/scripts/redis_stop.sh
}
3.在master和slave上創建監控腳本:
1).配置master腳本文件(可從線上拷貝再做修改)
腳本目錄 /usr/local/keepalived/scripts
以下用於監控Redis的腳本
/usr/local/keepalived/scripts/redis_check.sh
[root@www scripts]# cat redis_check.sh
#!/bin/bash
ALIVE=`/usr/local/redis/bin/redis-cli -h $1 -p $2 PING`
LOGFILE="/var/log/keepalived-redis-check.log"
echo "[CHECK]" >> $LOGFILE
date >> $LOGFILE
if [ $ALIVE == "PONG" ]; then :
echo "Success: redis-cli -h $1 -p $2 PING $ALIVE" >> $LOGFILE 2>&1
exit 0
else
echo "Failed:redis-cli -h $1 -p $2 PING $ALIVE " >> $LOGFILE 2>&1
exit 1
fi
以下負責運作的關鍵腳本:
notify_master /usr/local/keepalived/scripts/redis_master.sh
notify_backup /usr/local/keepalived/scripts/redis_backup.sh
notify_fault /usr/local/keepalived/scripts/redis_fault.sh
notify_stop /usr/local/keepalived/scripts/redis_stop.sh
因為Keepalived在轉換狀態時會依照狀態來呼叫:
當進入Master狀態時會呼叫notify_master
當進入Backup狀態時會呼叫notify_backup
當發現異常情況時進入Fault狀態呼叫notify_fault
當Keepalived程序終止時則呼叫notify_stop
首先,在Redis Master上創建notity_master與notify_backup腳本:
[root@www scripts]# cat redis_master.sh
#!/bin/bash
REDISCLI="/usr/local/redis/bin/redis-cli -h $1 -p $3"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE 2>&1
echo "Run SLAVEOF cmd ... " >> $LOGFILE
$REDISCLI SLAVEOF $2 $3 >> $LOGFILE 2>&1
#echo "SLAVEOF $2 cmd can't excute ... " >> $LOGFILE
sleep 10 #延遲10秒以后待數據同步完成后再取消同步狀態
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
[root@www scripts]# cat redis_backup.sh
#!/bin/bash
REDISCLI="/usr/local/redis/bin/redis-cli"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[BACKUP]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >> $LOGFILE 2>&1
echo "Run SLAVEOF cmd ..." >> $LOGFILE 2>&1
$REDISCLI SLAVEOF $2 $3 >> $LOGFILE
sleep 100 #延遲100秒以后待數據同步完成后再取消同步狀態
exit(0)
接着,在Redis Slave上創建notity_master與notify_backup腳本(因為是雙主腳本和slave一致):
然后在Master與
[root@www scripts]# cat redis_fault.sh
#!/bin/bash
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[fault]" >> $LOGFILE
date >> $LOGFILE
[root@www scripts]# cat redis_stop.sh
#!/bin/bash
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[stop]" >> $LOGFILE
date >> $LOGFILE
給腳本都加上可執行權限:
$ sudo chmod +x /etc/keepalived/scripts/*.sh
2).Redis配置文件說明/etc/redis.conf:
參考文檔 redis配置文件參數詳解
3).設置環境變量:
echo “export PATH=$PATH:/usr/local/redis/bin” >> /root/.bash_profile
source /root/.bash_profile
4).重啟服務:
/etc/init.d/keepalived restart
/etc/init.d/redis restart
redis測試:
腳本創建完成以后,我們開始按照如下流程進行測試:
1.啟動Master上的Redis
$ /etc/init.d/redis start
2.啟動Slave上的Redis
$ /etc/init.d/redis start
3.啟動Master上的Keepalived
$ /etc/init.d/keepalived start
4.啟動Slave上的Keepalived
$ /etc/init.d/keepalived start
5.嘗試通過VIP連接Redis:
$ redis-cli -h 192.168.1.120 INFO
role:master
$ redis-cli -h 192.168.1.102 INFO
role:master
$ redis-cli -h 192.168.1.103 INFO
role:slave
連接成功,Slave也連接上來了。
6.嘗試插入一些數據:
$ redis-cli -h 192.168.1.120 SET Hello Redis
OK
從VIP讀取數據
$ redis-cli -h 192.168.1.120 GET Hello
"Redis"
從Master讀取數據
$ redis-cli -h 192.168.1.102 GET Hello
"Redis"
從Slave讀取數據
$ redis-cli -h 192.168.1.103 GET Hello
"Redis"
下面,模擬故障產生:
將Master上的Redis進程殺死:
$ killall -9 redis-server
查看Master上的Keepalived日志
$ tailf /var/log/keepalived-redis-state.log
同時Slave上的日志顯示:
$ tailf /var/log/keepalived-redis-state.log
然后我們可以發現,Slave已經接管服務,並且擔任Master的角色了。
$ redis-cli -h 192.168.1.120 INFO
$ redis-cli -h 192.168.1.104 INFO
role:master
然后我們恢復Master的Redis進程
$ /etc/init.d/redis start
查看Master上的Keepalived日志
$ tailf /var/log/keepalived-redis-state.log
同時Slave上的日志顯示:
$ tailf /var/log/keepalived-redis-state.log