1. 程式人生 > >linux 雙Redis + keepalived 主從複製+宕機自主切換

linux 雙Redis + keepalived 主從複製+宕機自主切換

主要核心思想,如果master 和 salve 全部存活的情況,VIP就漂移到 master。讀寫都從master操作,如果master宕機,VIP就會漂移到salve,並將之前的salve切換為master,當宕機的master可以繼續服務的時候,首先會從salve同步資料,然後VIP漂移到master伺服器上面,持續提供服務。

環境準備:

    master:ip 192.168.28.139;redis 19020;redis 19021;keepalived

    slave :ip 192.168.28.140;redis 19020;redis 19021;keepalived

    keepalived VIP:192.168.28.99

 

1、下載Redis redis-5.0.5.tar.gz

解壓 tar xzf + Redis包(重複一下操作,改名可以配置2個redis)

mv redis-5.0.5 /usr/local/redis19020

進入 Redis檔案安裝

安裝依賴檔案

yum install gcc-c++

安裝

make

mv redis.conf redis.conf.back

重寫conf檔案

vim redis.conf

=======================================

daemonize yes

pidfile /var/run/redis19020.pid

#pidfile /var/run/redis19021.pid

port 19020       #19021

tcp-backlog 511

timeout 30

tcp-keepalive 60

loglevel warning

logfile /logs/redis/redis19020.log

#logfile /logs/redis/redis19021.log

databases 16

save 900 1

save 300 10

save 60 10000

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

dbfilename dump.rdb

dir /usr/local/redis-5.0.5/ #redis安裝路徑

 

protected-mode no  #關閉保護模式

requirepass test123  #主Redis 密碼

#masterauth test123    #從Redis 密碼(與主一致)

 

#slaveof 192.168.28.139 19021 #從Redis設定 Redis主從配置(主Redis ip 埠)

slave-serve-stale-data yes

slave-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

slave-priority 100

appendonly no

appendfilename "appendonly.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

lua-time-limit 5000

slowlog-log-slower-than 10000

slowlog-max-len 128

latency-monitor-threshold 0

notify-keyspace-events ""

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

list-max-ziplist-entries 512

list-max-ziplist-value 64

set-max-intset-entries 512

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

hll-sparse-max-bytes 3000

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

aof-rewrite-incremental-fsync yes

==============================================

mkdir /logs/redis

touch /logs/redis/{redis19020.log,redis19021.log}

啟動redis服務,並指定啟動服務配置檔案

src/redis-server redis.conf

設定環境變數

將 Redis 新增到環境變數中: 

# vi /etc/profile 

在最後新增以下內容: 

## Redis env 

export PATH=$PATH:/usr/local/redis19020/src

export PATH=$PATH:/usr/local/redis19021/src

使配置生效: 

# source /etc/profile 

現在就可以直接使用 redis-cli 等 redis 命令了。

2、keepalived安裝

下載keepalived

官網: https://keepalived.org/download.html

 

上傳並解壓keepalived

/home

cd /home/

tar -zxvf keepalived-2.0.18.tar.gz -C /usr/local/src/

進入目錄/usr/local/src/keepalived-2.0.18

cd /usr/local/keepalived-2.0.18/

  

檢查安裝環境

./configure --prefix=/usr/local/keepalived

 

首次檢查

configure: error:

  !!! OpenSSL is not properly installed on your system. !!!

  !!! Can not inclu

de OpenSSL headers files.            !!!

安裝openssl openssl-devel解決問題

yum -y install openssl openssl-devel

   

二次檢查

*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.

安裝libnl libnl-devel解決問題

yum -y install libnl libnl-devel

 

其他問題

configure: error: libnfnetlink headers missing

安裝libnfnetlink-devel解決問題

yum -y install libnfnetlink-devel

 

編譯並安裝

make && make install

 

將keepalived新增到系統服務中

拷貝執行檔案

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

 

將init.d檔案拷貝到etc下,加入開機啟動項

cp /usr/local/src/keepalived-2.0.18/keepalived/etc/init.d/keepalived /etc/init.d/keepalived

 

將keepalived檔案拷貝到etc下

cp /usr/local/src/keepalived-2.0.18/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

 

建立keepalived資料夾

mkdir -p /etc/keepalived

 

將keepalived配置檔案拷貝到etc下

cp /usr/local/src/keepalived-2.0.18/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf

 

新增keepalived到開機啟動

chkconfig --add keepalived

新增可執行許可權

chmod +x /etc/init.d/keepalived

 

二、部署keepalived雙擊自主切換(以下配置檔案和指令碼,兩臺機器都要重新布)

備份keepalived配置檔案

cp keepalived.conf keepalived.conf.back

 

重新編輯配置檔案

vim keepalived.conf

配置檔案

================================================

! COnfiguration File for keepalived

global_defs {
router_id MASTER-HA  #主機標識
#router_id BACKUP   #備機標識

script_user root
enable_script_security


}

vrrp_script chk_redis {
script "/etc/keepalived/scripts/redis_check.sh"   #指令碼地址和名字,此處呼叫改指令碼
interval 2
weight -5
fall 2
rise 1
}

vrrp_instance VI_1 {
state MASTER  #主機MASTER、備機BACKUP
interface eth0  #本機的網絡卡
virtual_router_id 51
priority 101           #主機101,備機小於101便可
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.28.99    #新的IP地址,需要在同機網段內
}

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

}

================================================

新建資料夾scripts

mkdir scripts

新建指令碼資料夾

touch {redis_check.sh,redis_master.sh,redis_backup.sh,redis_fault.sh,redis_stop.sh}

編寫指令碼

vim redis_check.sh(共用指令碼)

 

 

#!/bin/bash

#This scripts is check for Redis Slave status

#19020

counter=$(netstat -na|grep "LISTEN"|grep "19020"|wc -l)
#查詢本機Redis是否存活,如果不存在,則執行以下指令碼
if [ "${counter}" -eq 0 ]; then
/etc/init.d/keepalived keepalived stop
killall keepalived
fi
ping 192.168.28.139 -w1 -c1 &>/dev/null #(本機IP)
#查詢本機ip是否存活,不存活則執行以下指令碼
if [ $? -ne 0 ]
then
/etc/init.d/keepalived keepalived stop
killall keepalived
fi

#19021

counterB=$(netstat -na|grep "LISTEN"|grep "19021"|wc -l)
#查詢本機Redis是否存活,如果不存在,則執行以下指令碼
if [ "${counterB}" -eq 0 ]; then
/etc/init.d/keepalived keepalived stop
killall keepalived
fi
ping 192.168.28.139 -w1 -c1 &>/dev/null #(本機IP)
#查詢本機ip是否存活,不存活則執行以下指令碼
if [ $? -ne 0 ]
then
/etc/init.d/keepalived keepalived stop
killall keepalived
fi

 

 

主reids指令碼

vim redis_master.sh

 

#!/bin/bash

REDISCLI="/usr/local/redis19020/src/redis-cli -a test123 -p 19020"
LOGFILE="/var/log/keepalived-redis-state.log" #需要新建日誌檔案
REDISCLIA="/usr/local/redis19021/src/redis-cli -a test123 -p 19021"
LOGFILEA="/var/log/keepalived-redis-stateA.log" #需要新建日誌檔案

#19020

sleep 5

echo "[master]" >> $LOGFILE

date >> $LOGFILE

echo "Being master...." >>$LOGFILE 2>&1

echo "Run SLAVEOF cmd ...">> $LOGFILE

$REDISCLI SLAVEOF 192.168.28.140 19020 >>$LOGFILE 2>&1 #主庫IP
if [ $? -ne 0 ];then
echo "data rsync fail." >>$LOGFILE 2>&1
else
echo "data rsync OK." >> $LOGFILE 2>&1
fi

sleep 5 #延遲10秒以後待資料同步完成後再取消同步狀態

echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILE

$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

if [ $? -ne 0 ];then
echo "Run SLAVEOF NO ONE cmd fail." >>$LOGFILE 2>&1
else
echo "Run SLAVEOF NO ONE cmd OK." >> $LOGFILE 2>&1
fi

#19021
sleep 5

echo "[master2]" >> $LOGFILEA

date >> $LOGFILEA

echo "Being master...." >>$LOGFILEA 2>&1

echo "Run SLAVEOF cmd ...">> $LOGFILEA

$REDISCLIA SLAVEOF 192.168.28.140 19020 >>$LOGFILEA 2>&1 #主庫IP
if [ $? -ne 0 ];then
echo "data rsync fail." >>$LOGFILEA 2>&1
else
echo "data rsync OK." >> $LOGFILEA 2>&1
fi

sleep 10 #延遲10秒以後待資料同步完成後再取消同步狀態

echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILEA

$REDISCLIA SLAVEOF NO ONE >> $LOGFILEA 2>&1

if [ $? -ne 0 ];then
echo "Run SLAVEOF NO ONE cmd fail." >>$LOGFILEA 2>&1
else
echo "Run SLAVEOF NO ONE cmd OK." >> $LOGFILEA 2>&1

 

 

 

redis_backup.sh

 

#!/bin/bash

REDISCLI="/usr/local/redis19020/src/redis-cli -a test123-p 19020"
REDISCLIA="/usr/local/redis19021/src/redis-cli -a test123 -p 19021"
LOGFILE="/var/log/keepalived-redis-state.log"
LOGFILEA="/var/log/keepalived-redis-stateA.log"

echo "[backup]" >> $LOGFILE

date >> $LOGFILE

echo "Being slave...." >>$LOGFILE 2>&1

sleep 15 #延遲15秒待資料被對方同步完成之後再切換主從角色

echo "Run SLAVEOF cmd ...">> $LOGFILE

$REDISCLI SLAVEOF 192.168.28.140 19020 >>$LOGFILE 2>&1 #主庫IP

#19021
echo "[backup2]" >> $LOGFILEA

date >> $LOGFILEA

echo "Being slave...." >>$LOGFILEA 2>&1

sleep 3 #延遲15秒待資料被對方同步完成之後再切換主從角色

echo "Run SLAVEOF cmd ...">> $LOGFILEA

$REDISCLIA SLAVEOF 192.168.28.140 19021 >>$LOGFILEA 2>&1 #從庫IP

 

 

從Redis指令碼

vim redis_master.sh

 

#!/bin/bash

REDISCLI="/usr/local/redis19020/src/redis-cli -a test123 -p 19020"
REDISCLIA="/usr/local/redis19021/src/redis-cli -a test123 -p 19021"
LOGFILE="/var/log/keepalived-redis-state.log" #需要新建日誌檔案
LOGFILEA="/var/log/keepalived-redis-stateA.log" #需要新建日誌檔案

sleep 15

echo "[master]" >> $LOGFILE

date >> $LOGFILE

echo "Being master...." >>$LOGFILE 2>&1


echo "Run SLAVEOF cmd ...">> $LOGFILE

$REDISCLI SLAVEOF 192.168.28.139 19020 >>$LOGFILE 2>&1 #主庫IP

sleep 10 #延遲10秒以後待資料同步完成後再取消同步狀態

echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILE

$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

#19021
sleep 15

echo "[masterA]" >> $LOGFILEA

date >> $LOGFILEA

echo "Being master...." >>$LOGFILEA 2>&1


echo "Run SLAVEOF cmd ...">> $LOGFILEA

$REDISCLIA SLAVEOF 192.168.28.139 19021 >>$LOGFILEA 2>&1 #主庫IP

sleep 10 #延遲10秒以後待資料同步完成後再取消同步狀態

echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILEA

$REDISCLIA SLAVEOF NO ONE >> $LOGFILEA 2>&1

 

redis_backup.sh

 

#!/bin/bash

REDISCLI="/usr/local/redis19020/src/redis-cli -a test123 -p 19020"
REDISCLIA="/usr/local/redis19021/src/redis-cli -a test123 -p 19021"
LOGFILE="/var/log/keepalived-redis-state.log"
LOGFILEA="/var/log/keepalived-redis-stateA.log"

echo "[backup]" >> $LOGFILE

date >> $LOGFILE

echo "Being slave...." >>$LOGFILE 2>&1

sleep 15 #延遲15秒待資料被對方同步完成之後再切換主從角色

echo "Run SLAVEOF cmd ...">> $LOGFILE

$REDISCLI SLAVEOF 192.168.28.139 19020 >>$LOGFILE 2>&1 #主庫IP

#19021

echo "[backupA]" >> $LOGFILEA

date >> $LOGFILEA

echo "Being slave...." >>$LOGFILEA 2>&1

sleep 3 #延遲15秒待資料被對方同步完成之後再切換主從角色

echo "Run SLAVEOF cmd ...">> $LOGFILEA

$REDISCLIA SLAVEOF 192.168.28.139 19021 >>$LOGFILEA 2>&1 #主庫IP

 

共用指令碼

 

redis_fault.sh

#!/bin/bash

LOGFILE=/var/log/keepalived-redis-state.log
LOGFILEA=/var/log/keepalived-redis-stateA.log

echo "[fault]" >> $LOGFILE
date >> $LOGFILE

echo "[fault]" >> $LOGFILEA
date >> $LOGFILEA

 

 

 

redis_stop.sh

#!/bin/bash

LOGFILE=/var/log/keepalived-redis-state.log
LOGFILEA=/var/log/keepalived-redis-stateA.log

echo "[fault]" >> $LOGFILE
date >> $LOGFILE

echo "[fault]" >> $LOGFILEA
date >> $LOGFILEA

新增可執行許可權

chmod +x /etc/init.d/keepalived

顯示指令碼檔案為

 

啟動keepalived

/etc/init.d/keepalived start

檢視是否啟動成功

ps -ef | grep keepalived

啟動成功之後會生成一個新的伺服器IP地址,可通過新IP直接連線Redis,可以自由關閉其中一臺Redis服務,keepalived會自動切換到另外一臺Redis伺服器當中。

宕機後啟動順序為,先啟動Redis,在啟動keepalived即可,啟動後會自動同步兩臺Redis的資料。

&n