keepalive+redis 主從高可用

準備
1.1 準備
keepalived-1.2.22.tar.gz
redis-3.2.1.tar.gz
1.2 說明
當 Master 與 Slave 均運作正常時, Master負責服務,Slave負責Standby;

當 Master 掛掉,Slave 正常時, Slave接管服務升級Master,有寫權限,同時關閉主從複製功能;

當 Master 恢復正常, Master降級爲Slave同步數據,開啓主從複製。

1.3 測試服務器信息
Master redis: 192.168.0.4

Slave redis: 192.168.0.5
配置redis服務

  1. 解壓縮
    tar zxf redis-3.2.1.tar.gz
    mv redis-3.2.1 /soft/server
    cd /soft/server
    mv redis-3.2.1 redis
  2. 編譯安裝
    cd /soft/server/redis
    make && make install
  3. redis配置文件修改
    vim redis.conf
    ...
    bind 0.0.0.0 # 修改支持網絡訪問
    protected-mode no # 同樣一個安全配置,默認yes是不能網絡訪問的
    daemonize yes # 後臺運行redis
    slaveof 192.168.0.4 6379 # 指定Master IP,同步(僅從配置)
  4. 配置redis服務啓動腳本
    複製代碼
    vim /etc/init.d/redis-server

!/usr/bin/env bash

redis start up the redis server daemon

chkconfig: 345 99 99

description: redis service in /etc/init.d/redis

chkconfig --add redis or chkconfig --list redis

service redis start or service redis stop

processname: redis-server

config: /etc/redis.conf

注意不同位置要修改變量

PATH=/usr/local/bin:/sbin:/usr/bin:/bin
REDISPORT=6379
EXEC=/soft/server/redis/src/redis-server
REDIS_CLI=/soft/server/redis/src/redis-cli

PIDFILE=/var/run/redis.pid
CONF="/soft/server/redis/redis.conf"

make sure some dir exist

if [ ! -d /var/lib/redis ] ;then
mkdir -p /var/lib/redis
mkdir -p /var/log/redis

fi

case "$1" in
status)
ps -A|grep redis
;;
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
複製代碼
5. 配置開機自啓
chkconfig --add redis-server
chkconfig redis-server on
配置keepalive服務

  1. 編譯安裝
    tar zxf keepalived-1.2.22.tar.gz
    cd keepalived-1.2.22
    ./configure --prefix=/usr/local/keepalived
    make && make install
  2. 配置文件設置
    複製代碼

拷貝keepalived服務

cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived

配置keepalived服務

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived
mkdir /etc/keepalived

拷貝配置文件

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
複製代碼
3. keepalive配置文件
Master節點
複製代碼
! Configuration File for keepalived
vrrp_script chk_redis {

script "/root/scripts/redis_check.sh"    ###監控腳本 
interval 2                         ###監控時間
}

網卡需要注意,使用ifconfig查看一下當前活動網卡

vrrp_instance VI_1 {
state BACKUP ###設置爲BACKUP
nopreempt # 不搶佔MASTER
interface eth0 ###監控網卡
virtual_router_id 51
priority 100 ###權重值
authentication {
auth_type PASS ###加密
auth_pass 1q2w3e ###密碼
}
#設置額外的監控,裏面的任意一個網卡出現問題,都會進入FAULT狀態
track_interface {
eth0
}
track_script {
chk_redis ###執行上面定義的chk_redis
}
virtual_ipaddress {
192.168.0.99 ######VIP
}
notify_master /root/scripts/redis_master.sh
notify_backup /root/scripts/redis_backup.sh
notify_fault /root/scripts/redis_fault.sh
notify_stop /root/scripts/redis_stop.sh

}
複製代碼
Slave節點
複製代碼
! Configuration File for keepalived

vrrp_script chk_redis {
script "/root/scripts/redis_check.sh" ###監控腳本
interval 2 ###監控時間
}

同樣要注意網卡

vrrp_instance VI_1 {
state BACKUP ###設置爲BACKUP
interface eth0 ###監控網卡
virtual_router_id 51
priority 10 ###比MASTRE權重值低
authentication {
auth_type PASS
auth_pass 1q2w3e ###密碼與MASTRE相同
}
#設置額外的監控,裏面的任意一個網卡出現問題,都會進入FAULT狀態
track_interface {
eth0
}
track_script {
chk_redis ###執行上面定義的chk_redis
}
virtual_ipaddress {
192.168.0.99 ####vip
}
notify_master /root/scripts/redis_master.sh
notify_backup /root/scripts/redis_backup.sh
notify_fault /root/scripts/redis_fault.sh
notify_stop /root/scripts/redis_stop.sh
}
複製代碼
4. keepalive腳本

Keepalive 定義的四種狀態腳本說明

當進入Master狀態時會呼叫notify_master
當進入Backup狀態時會呼叫notify_backup
當發現異常情況時進入Fault狀態呼叫notify_fault
當Keepalived程序終止時則呼叫notify_stop

redis_check.sh 檢測redis是否正常腳本,正常則返回PONG,返回代碼0,否則返回代碼1

複製代碼

!/bin/bash

ALIVE=/usr/local/bin/redis-cli PING
if [ "$ALIVE" == "PONG" ]; then
echo $ALIVE
exit 0
else
echo $ALIVE
exit 1
fi
複製代碼

redis_master.sh 我被選入Master時,執行的腳本

複製代碼

!/bin/bash

REDISCLI="/usr/local/bin/redis-cli"

LOGFILE="/var/log/keepalived-redis-state.log"
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE 2>&1

echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
複製代碼

redis_fault.sh 當檢測服務不正常是,執行fault腳本

!/bin/bash

LOGFILE=/var/log/keepalived-redis-state.log
echo "[fault]" >> $LOGFILE
date >> $LOGFILE

redis_stop.sh keepalive終止時寫入日誌

!/bin/bash

LOGFILE=/var/log/keepalived-redis-state.log
echo "[stop]" >> $LOGFILE
date >> $LOGFILE

redis_backup.sh 進入slave時執行的腳本

複製代碼

!/bin/bash

REDISCLI="/usr/local/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
$REDISCLI SLAVEOF 192.168.0.5 6379 >> $LOGFILE 2>&1 # IP爲之前從redis的IP
複製代碼
這裏backup 腳本主要說明一下,我的keepalive配置了不去搶佔Master,也就是當我Master 宕機後,我master再次起來就是slave,這時就是執行redis_backup的時候了,我去指定我的Master去同步

  1. 配置開機自啓
    chkconfig --add keepalived
    chkconfig keepalived on

測試 vip 192.168.75.200 連接的是主節點128

Replication

role:master
connected_slaves:1
slave0:ip=192.168.75.131,port=6379,state=online,offset=1569,lag=1
master_repl_offset:1569
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:1568

測試是否IP漂移到從節點,同時131從節點變主節點提供服務。

128 停止redis服務,模擬主節點掛掉。

systemctl stop redis

131 變主節點,提供讀寫服務

info

Replication

role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:513

開啓128之前的主節點,這時128變爲從節點提供讀的服務。同時會把131的數據同步到128。

systemctl start redis

128變成了從節點了。

role:slave
master_host:192.168.75.131
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:43
slave_priority:100
slave_read_only:1

總結

如果服務器資源不夠的話,用keepalived就行了。兩個節點就行了。sentinel是redis官網推薦的方案,需要的服務器比較多,最少三臺,因爲它用了節點仲裁原理來選master。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章