SuSE11環境下Redis+Keepalived實現高可用技術
Redis部署使用兩臺服務器,實現Redis+keepalived,提供redis服務高可用,當主redis進程或服務器宕機之後,備redis進程或服務器繼續提供服務。
實現目的:主MASTER宕機後,從BACKUP接管VIP提供服務,升為MASTER,主MASTER恢復後狀態變為從BACKUP,不搶占回VIP,待新MASTER宕機後繼續接替VIP,重新升為MASTER
MASTER-->BACKUP-->MASTER 依次輪詢接管服務
服務器配置信息如下所示:
主機名/IP
端口
用途
JZSHPT-APP5/
10.133.214.15
6379
Redis主服務器
JZSHPT-APP6/
10.133.214.16
6379
Redis從服務器
2.Redis主服務器搭建
2.1.安裝redis
JZSHPT-APP5:/soft # tar -zxf redis-3.2.1.tar.gz -C /usr/local
JZSHPT-APP5:/soft # cd /usr/local/redis-3.2.1/
JZSHPT-APP5:/usr/local/redis-3.2.1 # make
JZSHPT-APP5:/usr/local/redis-3.2.1 # cd src && make install
JZSHPT-APP5:/usr/local # mv /usr/local/redis-3.2.1/ /usr/local/redis
1)redis配置文件修改
JZSHPT-APP5:/usr/local # vim /usr/local/redis/redis.conf
修改文件相關內容為:
protected-mode no
port 6379
daemonize yes
pidfile /usr/local/redis/redis.pid
logfile "/usr/local/redis/redis.log"
2)redis啟動腳本編寫(非必須)
JZSHPT-APP5:/usr/local/redis # vim /etc/init.d/redisd
#!/bin/sh
#chkconfig 345 86 14
#description Startup and Shutdown script for Redis-3.2.1
progdir=/usr/local/redis/src
progname=redis-server
daemon=$progdir/$progname
config=/usr/local/redis/redis.conf
pidfile=/usr/local/redis/redis.pid
desc="redis daemon"
scriptname=/etc/init.d/redisd
start()
{
if test -x $daemon;
then
echo -e "Starting $desc:$progname"
if $daemon $config
then
echo -e "Start OK!!!"
else
echo -e "Start failed!!!"
fi
else
echo -e "Couldn‘t find Redis Server($daemon)"
fi
}
stop()
{
if test -e $pidfile;
then
echo -e "Stopping $desc:$progname"
if kill `cat $pidfile`
then
echo -e "stop OK!!!"
else
echo -e "Stop failed!!!"
fi
else
echo -e "No Redis Server($daemoon) running"
fi
}
restart()
{
echo -e "Restarting $desc:$progname"
stop
start
}
status()
{
ps aux | grep $progname
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo "Usage:$scriptnme{start|stop|restart|status}" >&2
exit 1
;;
esac
exit 0
JZSHPT-APP5:/usr/local/redis # chmod +x /etc/init.d/redisd
JZSHPT-APP5:/usr/local/redis # chkconfig --add redisd
2.2.安裝Keepalived
安裝keepalived前請自行安裝解決依賴關系(可能會涉及的軟件包為libopenssl-devel、zlib-devel、ipvsadm內核模塊等)
JZSHPT-APP5:/soft # tar -zxf keepalived-1.2.23.tar.gz
JZSHPT-APP5:/soft # cd keepalived-1.2.23/
JZSHPT-APP5:/soft/keepalived-1.2.23 # ./configure --prefix=/usr/local/keepalived/
JZSHPT-APP5:/soft/keepalived-1.2.23 # make && make install
1) keepalived配置文件編輯
JZSHPT-APP5:~ # mkdir -p /etc/keepalived/{scripts,log}
JZSHPT-APP5:~ # vim /usr/local/keepalived/etc/keepalived/
! Configuration File for keepalived
global_defs {
router_id Redis1_DEVEL
}
vrrp_script chk_redis {
script "/etc/keepalived/scripts/redis_check.sh"
interval 2
timeout 2
fall 3
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
nopreempt
priority 200
advert_int 5
authentication {
auth_type PASS
auth_pass redis
}
virtual_ipaddress {
10.133.214.50
}
track_script {
chk_redis
}
notify_master /etc/keepalived/scripts/redis_master.sh
notify_backup /etc/keepalived/scripts/redis_backup.sh
notify_fault /etc/keepalived/scripts/redis_fault.sh
notify_stop /etc/keepalived/scripts/redis_stop.sh
}
2)keepalived啟動腳本配置
JZSHPT-APP5:~ # cp /soft/keepalived-1.2.23/keepalived/etc/init.d/keepalived.suse.init /etc/init.d/keepalived.suse
JZSHPT-APP5:~ # cp /usr/local/keepalived/sbin/keepalived /usr/local/sbin/
JZSHPT-APP5:~ # cp /usr/local/keepalived/etc/keepalived/ /etc/keepalived/
3)定義監控腳本
JZSHPT-APP5:~ # vim /etc/keepalived/scripts/redis_check.sh
#!/bin/sh
###/etc/keepalived/scripts/redis_check.sh
ALIVE=/usr/local/bin/redis-cli PING
if [ "$ALIVE" == "PONG" ]; then
echo $ALIVE
exit 0
else
echo $ALIVE
exit 1
fi
4)定義狀態切換為master時執行的腳本
JZSHPT-APP5:~ # vim /etc/keepalived/scripts/redis_master.sh
#!/bin/sh
###/etc/keepalived/scripts/redis_master.sh
REDISCLI="redis-cli"
LOGFILE="/etc/keepalived/log/redis-state.log"
pid=$$
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[slaver]" >> $LOGFILE
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[slaver] Run ‘SLAVEOF 10.133.214.16 6379‘" >> $LOGFILE
$REDISCLI SLAVEOF 10.133.214.16 6379 >> $LOGFILE 2>&1
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[slaver] wait 10 sec for data sync from old master" >> $LOGFILE
sleep 10
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[slaver] data rsync from old mater ok..." >> $LOGFILE
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[master] Run slaveof no one,close master/slave" >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[master] wait other slave connect...." >> $LOGFILE
5)定義狀態切換為backups時執行的腳本
JZSHPT-APP5:~ # vim /etc/keepalived/scripts/redis_backup.sh
#!/bin/bash
###/etc/keepalived/scripts/redis_backup.sh
REDISCLI="redis-cli"
LOGFILE="/etc/keepalived/log/redis-state.log"
pid=$$
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[master]" >> $LOGFILE
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[master] Being slave state..." >> $LOGFILE 2>&1
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[master] wait 10 sec for data sync from old master" >> $LOGFILE
sleep 10
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[master] data rsync from old mater ok..." >> $LOGFILE
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[slaver] Run ‘SLAVEOF 10.133.214.16 6379‘" >> $LOGFILE
$REDISCLI SLAVEOF 10.133.214.16 6379 >> $LOGFILE 2>&1
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[slaver] slave connect to 192.18.3.21 ok..." >> $LOGFILE
6) 定義狀態切換為stop時執行的腳本
JZSHPT-APP5:~ # cp /etc/keepalived/scripts/redis_backup.sh /etc/keepalived/scripts/redis_stop.sh
7) 定義狀態切換為fault時執行的腳本
JZSHPT-APP5:~ # cp /etc/keepalived/scripts/redis_backup.sh /etc/keepalived/scripts/redis_fault.sh
2.2.安裝rsyslog實現keepalived日誌分離
1)安裝rsyslog軟件包
JZSHPT-APP5:/soft # rpm -ivh rsyslog-5.10.1-0.7.49.x86_64.rpm
2)修改rsyslog配置文件
JZSHPT-APP5:/soft # vim /etc/rsyslog.conf
140 #.;mail.none;news.none -/var/log/messages
141 .;mail.none;news.none;local0.none -/var/log/messages
153 #local0,local1.* -/var/log/localmessages
154 local0.* -/var/log/keepalived.log
155 local1.* -/var/log/localmessages
156 local2,local3.* -/var/log/localmessages
157 local4,local5.* -/var/log/localmessages
158 cal6,local7.* -/var/log/localmessages
3)修改rsyslog啟動腳本配置文件
根據/etc/init.d/syslog中的三個啟動選項,修改該文件內的”SYSLOG_DAEMON”選項
JZSHPT-APP5:/soft # vim /etc/sysconfig/syslog
40 #SYSLOG_DAEMON="syslog-ng"
41 SYSLOG_DAEMON="rsyslogd"
4)修改Keepalived啟動腳本選項
JZSHPT-APP5:/soft # vim /etc/init.d/keepalived.suse
17 DAEMON_OPT="-d "
18 DAEMON_OPT="-d -D -S 0"
5)啟動rsyslog服務
JZSHPT-APP5:/soft # /etc/init.d/syslog start
2.3.啟動Redis和Keepalived
JZSHPT-APP5:~ # /etc/init.d/redisd start
JZSHPT-APP5:~ # /etc/init.d/keepalived.suse start
3.Redis從服務器搭建
3.1.安裝redis
JZSHPT-APP6:/soft # tar -zxf redis-3.2.1.tar.gz -C /usr/local
JZSHPT-APP6:/soft # cd /usr/local/redis-3.2.1/
JZSHPT-APP6:/usr/local/redis-3.2.1 # make
JZSHPT-APP6:/usr/local/redis-3.2.1 # cd src && make install
JZSHPT-APP6:/usr/local # mv /usr/local/redis-3.2.1/ /usr/local/redis
1)redis配置文件修改
JZSHPT-APP6:/usr/local # vim /usr/local/redis/redis.conf
修改文件相關內容為:
protected-mode no
port 6379
daemonize yes
pidfile /usr/local/redis/redis.pid
logfile "/usr/local/redis/redis.log"
2)redis啟動腳本編寫(非必須)
JZSHPT-APP6:/usr/local/redis # vim /etc/init.d/redisd
#!/bin/sh
#chkconfig 345 86 14
#description Startup and Shutdown script for Redis-3.2.1
progdir=/usr/local/redis/src
progname=redis-server
daemon=$progdir/$progname
config=/usr/local/redis/redis.conf
pidfile=/usr/local/redis/redis.pid
desc="redis daemon"
scriptname=/etc/init.d/redisd
start()
{
if test -x $daemon;
then
echo -e "Starting $desc:$progname"
if $daemon $config
then
echo -e "Start OK!!!"
else
echo -e "Start failed!!!"
fi
else
echo -e "Couldn‘t find Redis Server($daemon)"
fi
}
stop()
{
if test -e $pidfile;
then
echo -e "Stopping $desc:$progname"
if kill `cat $pidfile`
then
echo -e "stop OK!!!"
else
echo -e "Stop failed!!!"
fi
else
echo -e "No Redis Server($daemoon) running"
fi
}
restart()
{
echo -e "Restarting $desc:$progname"
stop
start
}
status()
{
ps aux | grep $progname
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo "Usage:$scriptnme{start|stop|restart|status}" >&2
exit 1
;;
esac
exit 0
JZSHPT-APP6:/usr/local/redis # chmod +x /etc/init.d/redisd
JZSHPT-APP6:/usr/local/redis # chkconfig --add redisd
3.2.安裝Keepalived
安裝keepalived前請自行安裝解決依賴關系(可能會涉及的軟件包為libopenssl-devel、zlib-devel、ipvsadm內核模塊等)
JZSHPT-APP6:/soft # tar -zxf keepalived-1.2.23.tar.gz
JZSHPT-APP6:/soft # cd keepalived-1.2.23/
JZSHPT-APP6:/soft/keepalived-1.2.23 # ./configure --prefix=/usr/local/keepalived/
JZSHPT-APP6:/soft/keepalived-1.2.23 # make && make install
1)keepalived配置文件編輯
JZSHPT-APP6:~ # mkdir -p /etc/keepalived/{scripts,log}
JZSHPT-APP6:~ # vim /usr/local/keepalived/etc/keepalived/
! Configuration File for keepalived
global_defs {
router_id Redis2_DEVEL
}
vrrp_script chk_redis {
script "/etc/keepalived/scripts/redis_check.sh"
interval 2
timeout 2
fall 3
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 150
advert_int 5
authentication {
auth_type PASS
auth_pass redis
}
virtual_ipaddress {
10.133.214.50
}
track_script {
chk_redis
}
notify_master /etc/keepalived/scripts/redis_master.sh
notify_backup /etc/keepalived/scripts/redis_backup.sh
notify_fault /etc/keepalived/scripts/redis_fault.sh
notify_stop /etc/keepalived/scripts/redis_stop.sh
}
2)keepalived啟動腳本配置
JZSHPT-APP6:~ # cp /soft/keepalived-1.2.23/keepalived/etc/init.d/keepalived.suse.init /etc/init.d/keepalived.suse
JZSHPT-APP6:~ # cp /usr/local/keepalived/sbin/keepalived /usr/local/sbin/
JZSHPT-APP6:~ # cp /usr/local/keepalived/etc/keepalived/ /etc/keepalived/
3)定義監控腳本
JZSHPT-APP6:~ # vim /etc/keepalived/scripts/redis_check.sh
#!/bin/sh
###/etc/keepalived/scripts/redis_check.sh
ALIVE=/usr/local/bin/redis-cli PING
if [ "$ALIVE" == "PONG" ]; then
echo $ALIVE
exit 0
else
echo $ALIVE
exit 1
fi
4)定義狀態切換為master時執行的腳本
JZSHPT-APP6:~ # vim /etc/keepalived/scripts/redis_master.sh
#!/bin/sh
###/etc/keepalived/scripts/redis_master.sh
REDISCLI="redis-cli"
LOGFILE="/etc/keepalived/log/redis-state.log"
pid=$$
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[slaver]" >> $LOGFILE
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[slaver] Run ‘SLAVEOF 10.133.214.15 6379‘" >> $LOGFILE
$REDISCLI SLAVEOF 10.133.214.15 6379 >> $LOGFILE 2>&1
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[slaver] wait 10 sec for data sync from old master" >> $LOGFILE
sleep 10
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[slaver] data rsync from old mater ok..." >> $LOGFILE
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[master] Run slaveof no one,close master/slave" >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[master] wait other slave connect...." >> $LOGFILE
5)定義狀態切換為backups時執行的腳本
JZSHPT-APP6:~ # vim /etc/keepalived/scripts/redis_backup.sh
#!/bin/bash
###/etc/keepalived/scripts/redis_backup.sh
REDISCLI="redis-cli"
LOGFILE="/etc/keepalived/log/redis-state.log"
pid=$$
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[master]" >> $LOGFILE
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[master] Being slave state..." >> $LOGFILE 2>&1
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[master] wait 10 sec for data sync from old master" >> $LOGFILE
sleep 10
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[master] data rsync from old mater ok..." >> $LOGFILE
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[slaver] Run ‘SLAVEOF 10.133.214.15 6379‘" >> $LOGFILE
$REDISCLI SLAVEOF 10.133.214.15 6379 >> $LOGFILE 2>&1
echo "date +‘%Y-%m-%d:%H:%M:%S‘
|$pid|state:[slaver] slave connect to 10.133.214.15 ok..." >> $LOGFILE
6) 定義狀態切換為stop時執行的腳本
JZSHPT-APP6:~ # cp /etc/keepalived/scripts/redis_backup.sh /etc/keepalived/scripts/redis_stop.sh
7) 定義狀態切換為fault時執行的腳本
JZSHPT-APP6:~ # cp /etc/keepalived/scripts/redis_backup.sh /etc/keepalived/scripts/redis_fault.sh
3.3.安裝rsyslog實現keepalived日誌分離
1)安裝rsyslog軟件包
JZSHPT-APP5:/soft # rpm -ivh rsyslog-5.10.1-0.7.49.x86_64.rpm
2)修改rsyslog配置文件
JZSHPT-APP5:/soft # vim /etc/rsyslog.conf
140 #.;mail.none;news.none -/var/log/messages
141 .;mail.none;news.none;local0.none -/var/log/messages
153 #local0,local1.* -/var/log/localmessages
154 local0.* -/var/log/keepalived.log
155 local1.* -/var/log/localmessages
156 local2,local3.* -/var/log/localmessages
157 local4,local5.* -/var/log/localmessages
159 cal6,local7.* -/var/log/localmessages
3)修改rsyslog啟動腳本配置文件
根據/etc/init.d/syslog中的三個啟動選項,修改該文件內的”SYSLOG_DAEMON”選項
JZSHPT-APP5:/soft # vim /etc/sysconfig/syslog
40 #SYSLOG_DAEMON="syslog-ng"
41 SYSLOG_DAEMON="rsyslogd"
4)修改Keepalived啟動腳本選項
JZSHPT-APP5:/soft # vim /etc/init.d/keepalived.suse
17 DAEMON_OPT="-d "
18 DAEMON_OPT="-d -D -S 0"
5)啟動rsyslog服務
JZSHPT-APP5:/soft # /etc/init.d/syslog start
3.4.啟動Redis和Keepalived
JZSHPT-APP6:~ # /etc/init.d/redisd start
JZSHPT-APP6:~ # /etc/init.d/keepalived.suse start
測試結果可通過依次停Redis主從單節點來觀測vip漂移
SuSE11環境下Redis+Keepalived實現高可用技術