通過Keepalived實現Redis Failover自動故障切換功能(整理中) .
設計思路:
redis 主和 redis從 正常同步;
redis主keepalived 啟動,執行redis_master.sh指令碼,vip在自己身上;
redis 從keepalived 啟動,執行redis_slave.sh指令碼;
redis主服務關閉,則redis主執行redis_fault.sh指令碼, vip落在redis 從上,redis從執行redis_master.sh指令碼,變成主;
redis主服務開啟,則redis主執行redis_slave.sh指令碼變成從,vip還在redis 從上,還是主;
redis從服務關閉,則redis從執行redis_fault.sh
redis從服務開啟,則redis從執行redis_slave.sh指令碼變成從, vip還在redis主上,redis主繼續做主,此時為redis初試主從狀態;
環境:
10.7.13.43 redis
10.7.13.44 redis-slave
10.7.13.45 vip
一:安裝keepalived
(redis和redis-slave兩臺伺服器都安裝)
1. 安裝作業系統的 ipvsadm
yum -y install ipvsadm
否則出現如下錯誤:
如果這個不安裝 make 會有如下錯誤
make
make -C lib || exit 1;
make[1]: Entering directory `/httx/download/keepalived-1.2.10/lib'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/httx/download/keepalived-1.2.10/lib'
make -C keepalived
make[1]: Entering directory `/httx/download/keepalived-1.2.10/keepalived'
make[2]: Entering directory `/httx/download/keepalived-1.2.10/keepalived/core'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/httx/download/keepalived-1.2.10/keepalived/core'
make[2]: Entering directory `/httx/download/keepalived-1.2.10/keepalived/check'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/httx/download/keepalived-1.2.10/keepalived/check'
make[2]: Entering directory `/httx/download/keepalived-1.2.10/keepalived/vrrp'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/httx/download/keepalived-1.2.10/keepalived/vrrp'
make[2]: Entering directory `/httx/download/keepalived-1.2.10/keepalived/libipvs-2.6'
gcc -g -O2 -I/usr/src/linux/include -I/usr/src/linux/include -DLIBIPVS_DONTUSE_NL -Wall -Wunused -c -o libipvs.o libipvs.c
libipvs.c: In function ‘nlerr2syserr’:
libipvs.c:61: error: ‘NLE_BAD_SOCK’ undeclared (first use in this function)
libipvs.c:61: error: (Each undeclared identifier is reported only once
libipvs.c:61: error: for each function it appears in.)
libipvs.c:62: error: ‘NLE_EXIST’ undeclared (first use in this function)
libipvs.c:63: error: ‘NLE_NOADDR’ undeclared (first use in this function)
libipvs.c:64: error: ‘NLE_OBJ_NOTFOUND’ undeclared (first use in this function)
libipvs.c:65: error: ‘NLE_INTR’ undeclared (first use in this function)
libipvs.c:66: error: ‘NLE_AGAIN’ undeclared (first use in this function)
libipvs.c:67: error: ‘NLE_INVAL’ undeclared (first use in this function)
libipvs.c:68: error: ‘NLE_NOACCESS’ undeclared (first use in this function)
libipvs.c:69: error: ‘NLE_NOMEM’ undeclared (first use in this function)
libipvs.c:70: error: ‘NLE_AF_NOSUPPORT’ undeclared (first use in this function)
libipvs.c:71: error: ‘NLE_PROTO_MISMATCH’ undeclared (first use in this function)
libipvs.c:72: error: ‘NLE_OPNOTSUPP’ undeclared (first use in this function)
libipvs.c:73: error: ‘NLE_PERM’ undeclared (first use in this function)
libipvs.c:74: error: ‘NLE_BUSY’ undeclared (first use in this function)
libipvs.c:75: error: ‘NLE_RANGE’ undeclared (first use in this function)
libipvs.c:76: error: ‘NLE_NODEV’ undeclared (first use in this function)
make[2]: *** [libipvs.o] Error 1
make[2]: Leaving directory `/httx/download/keepalived-1.2.10/keepalived/libipvs-2.6'
make[1]: *** [all] Error 1
make[1]: Leaving directory `/httx/download/keepalived-1.2.10/keepalived'
make: *** [all] Error 2
1.wget
http://www.keepalived.org/software/keepalived-1.2.10.tar.gz
2.安裝作業系統元件 openssl-devel
yum -y install openssl-devel
否則出現如下錯誤:
configure: error:
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files.
2.安裝 tar zxvf keepalived-1.2.10.tar.gz
cd keepalived-1.2.10
3. ./configure --prefix=/httx/run/keepalived
4. yum -y install ipvsadm
如果這個不安裝 make 會有如下錯誤
make
make -C lib || exit 1;
make[1]: Entering directory `/httx/download/keepalived-1.2.10/lib'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/httx/download/keepalived-1.2.10/lib'
make -C keepalived
make[1]: Entering directory `/httx/download/keepalived-1.2.10/keepalived'
make[2]: Entering directory `/httx/download/keepalived-1.2.10/keepalived/core'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/httx/download/keepalived-1.2.10/keepalived/core'
make[2]: Entering directory `/httx/download/keepalived-1.2.10/keepalived/check'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/httx/download/keepalived-1.2.10/keepalived/check'
make[2]: Entering directory `/httx/download/keepalived-1.2.10/keepalived/vrrp'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/httx/download/keepalived-1.2.10/keepalived/vrrp'
make[2]: Entering directory `/httx/download/keepalived-1.2.10/keepalived/libipvs-2.6'
gcc -g -O2 -I/usr/src/linux/include -I/usr/src/linux/include -DLIBIPVS_DONTUSE_NL -Wall -Wunused -c -o libipvs.o libipvs.c
libipvs.c: In function ‘nlerr2syserr’:
libipvs.c:61: error: ‘NLE_BAD_SOCK’ undeclared (first use in this function)
libipvs.c:61: error: (Each undeclared identifier is reported only once
libipvs.c:61: error: for each function it appears in.)
libipvs.c:62: error: ‘NLE_EXIST’ undeclared (first use in this function)
libipvs.c:63: error: ‘NLE_NOADDR’ undeclared (first use in this function)
libipvs.c:64: error: ‘NLE_OBJ_NOTFOUND’ undeclared (first use in this function)
libipvs.c:65: error: ‘NLE_INTR’ undeclared (first use in this function)
libipvs.c:66: error: ‘NLE_AGAIN’ undeclared (first use in this function)
libipvs.c:67: error: ‘NLE_INVAL’ undeclared (first use in this function)
libipvs.c:68: error: ‘NLE_NOACCESS’ undeclared (first use in this function)
libipvs.c:69: error: ‘NLE_NOMEM’ undeclared (first use in this function)
libipvs.c:70: error: ‘NLE_AF_NOSUPPORT’ undeclared (first use in this function)
libipvs.c:71: error: ‘NLE_PROTO_MISMATCH’ undeclared (first use in this function)
libipvs.c:72: error: ‘NLE_OPNOTSUPP’ undeclared (first use in this function)
libipvs.c:73: error: ‘NLE_PERM’ undeclared (first use in this function)
libipvs.c:74: error: ‘NLE_BUSY’ undeclared (first use in this function)
libipvs.c:75: error: ‘NLE_RANGE’ undeclared (first use in this function)
libipvs.c:76: error: ‘NLE_NODEV’ undeclared (first use in this function)
make[2]: *** [libipvs.o] Error 1
make[2]: Leaving directory `/httx/download/keepalived-1.2.10/keepalived/libipvs-2.6'
make[1]: *** [all] Error 1
make[1]: Leaving directory `/httx/download/keepalived-1.2.10/keepalived'
make: *** [all] Error 2
5. make && make install
6. 日誌檔案 /httx/logs/keepalived/keepalived-redis-state.log
7. chmod +x *.sh
8. 複製配置檔案
keepalived/sbin/keepalived -d -D -S 0 --啟動命令
cp /httx/run/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ -- 並修改該檔案的引數 /var/lock/subsys/$prog 為 /httx/run/keepalived/lock/$prog
chmod 755 /etc/init.d/keepalived
cp /httx/run/keepalived/sbin/keepalived /usr/sbin/
cp /httx/run/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ --配置服務
#執行 由於keepalived配置檔案不是在啟動時一次性載入並讀取完成的,所以必須是完整路徑,可以根據log判斷是否載入了正確的配置檔案
keepalived –f /usr/local/etc/keepalived/keepalived.conf
執行過程可以檢視log:
tail -f /var/log/message
二:安裝redis
(redis和redis-slave兩臺伺服器都安裝)
tar -zxvf redis-2.4.17.tar.gz
cd redis-2.4.17
./configure
make
make install
redis-slve只需注意一點
[[email protected] bin]# pwd
/usr/local/bin
[[email protected] bin]# vim redis.conf
116 slaveof 192.168.1.235 6379
三:通過Keepalived實現Redis Failover自動故障切換
修改Master和Slave的/etc/hosts檔案
[[email protected] rc.d]# cat /etc/hosts
192.168.1.235 redis
192.168.1.236 redis-slave
Master上是
[[email protected] rc.d]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=redis
Slave上是
[[email protected] linux]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=redis-slave
修改完主機名重啟機器生效
預設安裝完成keepalived之後是沒有配置檔案的,因此我們需要手動建立:
首先,在Master上建立如下配置檔案:
[[email protected] linux]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
router_id jt-db-redis-m1
}
vrrp_script chk_redis {
script "/httx/run/keepalived/etc/keepalived/scripts/redis_check.sh"
interval 1
# weight 4
}
vrrp_instance mes_Redis {
state MASTER
# interface eth0
interface br0
garp_master_delay 10
smtp_alert
virtual_router_id 3
priority 100
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.7.13.46
}
track_script {
chk_redis
}
notify_master /httx/run/keepalived/etc/keepalived/scripts/redis_master.sh
notify_backup /httx/run/keepalived/etc/keepalived/scripts/redis_slave.sh
notify_fault /httx/run/keepalived/etc/keepalived/scripts/redis_fault.sh
notify_stop /httx/run/keepalived/etc/keepalived/scripts/redis_stop.sh
}
然後,在Slave上建立如下配置檔案:
[[email protected] linux]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
router_id jt-db-redis-s1
}
vrrp_script chk_redis {
script "/httx/run/keepalived/etc/keepalived/scripts/redis_check.sh"
interval 1
# weight 4
}
vrrp_instance mes_Redis {
state BACKUP
# interface eth0
interface br0
garp_master_delay 10
smtp_alert
virtual_router_id 3
priority 99
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.7.13.46
}
track_script {
chk_redis
}
notify_master /httx/run/keepalived/etc/keepalived/scripts/redis_master.sh
notify_backup /httx/run/keepalived/etc/keepalived/scripts/redis_slave.sh
notify_fault /httx/run/keepalived/etc/keepalived/scripts/redis_fault.sh
notify_stop /httx/run/keepalived/etc/keepalived/scripts/redis_stop.sh
}
在Master和Slave上建立監控Redis的指令碼
mkdir /etc/keepalived/scripts
vim /etc/keepalived/scripts/redis_check.sh
#!/bin/bash
ALIVE=`/usr/local/bin/redis-cli PING`
if [ "$ALIVE" == "PONG" ]; then
echo $ALIVE
exit 0
else
echo $ALIVE
exit 1
fi
編寫以下負責運作的關鍵指令碼:
notify_master /etc/keepalived/scripts/redis_master.sh
notify_backup /etc/keepalived/scripts/redis_slave.sh
notify_fault /etc/keepalived/scripts/redis_fault.sh
notify_stop /etc/keepalived/scripts/redis_stop.sh
因為Keepalived在轉換狀態時會依照狀態來呼叫:
當進入Master狀態時會呼叫notify_master
當進入Backup狀態時會呼叫notify_backup
當發現異常情況時進入Fault狀態呼叫notify_fault
當Keepalived程式終止時則呼叫notify_stop
首先,在Redis Master上建立notity_master與notify_backup指令碼:
vim /etc/keepalived/scripts/redis_master.sh
#!/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 cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF 192.168.1.236 6379 >> $LOGFILE 2>&1
sleep 10 #延遲10秒以後待資料同步完成後再取消同步狀態
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
vim /etc/keepalived/scripts/redis_slave.sh
#!/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
sleep 15 #延遲15秒待資料被對方同步完成之後再切換主從角色
echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF 192.168.1.236 6379 >> $LOGFILE 2>&1
接著,在Redis Slave上建立notity_master與notify_backup指令碼:
vim /etc/keepalived/scripts/redis_master.sh
#!/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 cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF 192.168.1.235 6379 >> $LOGFILE 2>&1
sleep 10 #延遲10秒以後待資料同步完成後再取消同步狀態
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
vim /etc/keepalived/scripts/redis_slave.sh
#!/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
sleep 15 #延遲15秒待資料被對方同步完成之後再切換主從角色
echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF 192.168.1.235 6379 >> $LOGFILE 2>&1
然後在Master與Slave建立如下相同的指令碼:
vim /etc/keepalived/scripts/redis_fault.sh
#!/bin/bash
LOGFILE=/var/log/keepalived-redis-state.log
echo "[fault]" >> $LOGFILE
date >> $LOGFILE
vim /etc/keepalived/scripts/redis_stop.sh
#!/bin/bash
LOGFILE=/var/log/keepalived-redis-state.log
echo "[stop]" >> $LOGFILE
date >> $LOGFILE
在Master與Slave給指令碼都加上可執行許可權:
chmod +x /etc/keepalived/scripts/*.sh
指令碼建立完成以後,我們開始按照如下流程進行測試:
1.啟動Master上的Redis
[[email protected] bin]# pwd
/usr/local/bin
[[email protected] bin]# ./redis-server redis.conf
2.啟動Slave上的Redis
[[email protected] bin]# pwd
/usr/local/bin
[[email protected] bin]# ./redis-server redis.conf
3.啟動Master上的Keepalived
/etc/init.d/keepalived start
4.啟動Slave上的Keepalived
/etc/init.d/keepalived start
5.嘗試通過VIP連線Redis:
[[email protected] bin]#pwd
/usr/local/bin
[[email protected] bin]# ./redis-cli -h 192.168.1.237 info
role:master
slave0:192.168.1.236,6379,online
連線成功,Slave也連線上來了
6.嘗試插入一些資料:
[[email protected] bin]# ./redis-cli -h 192.168.1.237 SET Hello Redis
從VIP讀取資料
[[email protected] bin]# ./redis-cli -h 192.168.1.237 GET Hello
"Redis"
從Master讀取資料
[[email protected] bin]# ./redis-cli -h 192.168.1.235 GET Hello
"Redis"
從Slave讀取資料
[[email protected] bin]# ./redis-cli -h 192.168.1.235 GET Hello
"Redis"
下面,模擬故障產生:
將Master上的Redis程序殺死:
[[email protected] bin]# ./redis-cli shutdown
檢視Master上的Keepalived日誌
[[email protected] scripts]# tail /var/log/keepalived-redis-state.log
[fault]
Thu Sep 27 08:29:01 CST 2012
同時Slave上的日誌顯示:
[[email protected] scripts]# tail /var/log/keepalived-redis-state.log
[master]
Thu Nov 15 12:06:04 CST 2012
Being master....
Run SLAVEOF cmd ...
OK
Run SLAVEOF NO ONE cmd ...
OK
然後我們可以發現,Slave已經接管服務,並且擔任Master的角色了。
./redis-cli -h 192.168.1.237 info
./redis-cli -h 192.168.1.236 info
role:master
然後我們恢復Master的Redis程序
主變成slave
然後把236redis停掉
235恢復主的角色,在把236redis開啟
恢復235是主,236是備
自動切換成功!
相關推薦
通過Keepalived實現Redis Failover自動故障切換功能(整理中) .
設計思路: redis 主和 redis從 正常同步; redis主keepalived 啟動,執行redis_master.sh指令碼,vip在自己身上; redis 從keepalived 啟動,執行redis_slave.sh指令碼; redis主服務關閉,則redis主執行redis_fau
使用keepalived實現redis主從切換
安裝keepalived和redis主從的過程不再贅述,可參見本人其他部署文章。 主機名 IP地址 所安裝軟體 jia3.ty.com 192.168.10.103 keepalived(backup-高優先順序),redis(master) jia4.ty.com 192
keepalived 實現mysql主從自動切換
3.1安裝KEEPALIVED軟體: wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz tar zxvf keepalived-1.2.7.tar.gz cd keepalived-1.2.7
spring通過profile實現開發和測試環境切換
我們 其中 ror web cms -m acc 系統環境 oot 以開發測試為例,介紹tomcat部署應用和maven部署應用下利用profile實現測試環境和開發環境切換一、tomcat部署應用1、數據源配置dev.properties 路徑:/src/main/res
使用rsync服務通過inotify實現觸發式自動同步數據
rsync 實驗拓撲:HK36(Server 192.168.2.102)====HK46(Client 192.168.2.190) 實驗要求:對HK46 /data/目錄備份到HK36的/backup/下 (1) rsync服務依賴於xinetd超級服務管理,首先安裝xinetd服務[roo
Mycat 之 通過Keepalived 實現高可用
alived com -o ali vpd type gin blog process 一、系統拓撲圖 一、操作方法 參考本博客的Nginx + Keepalived 實現高可用Mycat 之 通過Keepalived 實現高可用
通過Expire實現Redis鎖機制
在我們的業務系統中,可能因為某種原因,使用者會不斷的點選表單提交按鈕,為了較少對系統的 無意義訪問、暴力提交 以及使用者體驗,我們利用redis的過期時間簡單的實現了一種Redis鎖 當用戶提交表單的時候,我們通過對錶單資料以及使用者唯一標識例如userNo進行加密,當做我們快取的唯
【轉】Keepalived實現redis的高可用
Keepalived實現redis的主從切換高可用原理詳解 具體安裝和配置keepalived和redis的教程,網上很多。 推薦幾個: keepalived預設只能做到對網路故障和keepalived本身的監控,即當出現網路故障或者keepali
Spring Boot通過Profiles實現多環境下配置切換
1、在yml中使用pom定義的maven屬性變數 格式:@[email protected] spring: application: name: dream-web-gateway profiles: active: '@[
通過WLST實現weblogic的自動部署
前提條件: 1.狀態處於釋放配置; 2.執行的本機安裝了weblogic,並且將weblogic.jar新增到了CLASSPATH環境變數中; 自動部署: java weblogic.Deployer -user weblogic -adminurl t3://10.1.
利用redis-sentinel+keepalived實現redis高可用
目標、需求: 為上層應用提供高可靠、低延遲、低(無限接近0)資料損失的Redis快取服務 方案概述: 採用同一網路內的三臺主機(可以是物理主機、虛擬機器或docker容器),要求三臺主機之間都能相互訪問,每一臺主機上都安裝redis-server、redis-sen
Android 通過ViewPager實現點選和滑動切換Fragment標籤頁
如上圖效果,要切換 Fragment 標籤頁,可以通過點選標籤或者滑動標籤頁來實現。 網上應該有封裝好的開源庫可以直接利用,不過這裡介紹一下自己通過 ViewPager 實現該效果。 首先是佈局檔案: <?xml version="1.0" encodi
redis--主從同步,故障切換,集群搭建
目錄 好的 定期 技術 not create prot 驗證 作用 一 . redis主從同步 準備三個配置文件,實現一主兩從的redis數據庫結構(這三個配置文件僅僅端口不一樣) # redis-6379.conf 文件, 寫入下面數據: port 63
Nginx + Keepalived實現應用高可用負載均衡功能
監控nginx .tar.gz provides listening 一個 list nginx負載均衡 服務器ip load 說明:此處僅介紹 Keepalived 實現nginx負載均衡器的高可用,關於nginx介紹和負載均衡實現可查看我的另兩篇博文 Nginx負載均衡
SpringBoot(三)通過properties實現多個數據庫環境自動切換配置
方式 info 本地 所有 -c int 安裝 style 過多 前面的文章已經介紹了CentOS部署SpringBoot項目從0到1的詳細過程,包括Linux安裝ftp、Tomcat以及Java jdk的全部過程。這篇文章主要介紹關於springboot如何通過多
三:redis哨兵模式實現主從故障切換2
本篇接著上一篇進行redis哨兵的配置練習實驗,一般經典的哨兵需要3個節點(為什麼是3個節點,不是兩個節點)後面專門寫篇文章來分析這個問題. 可以再用一臺虛擬機器安裝一個redis服務,這臺虛擬機器不需要啟動例項,啟動哨兵就行,我這裡還是用兩臺機器只是測試,生
redis sentinel的指令碼機制及實現twemproxy主從自動切換
redis sentinel 指令碼機制 1).sentinel notification-script 通知型指令碼:當sentinel有任何警告級別的事件發生時(比如說redis例項的主觀失效和客觀失效等等),將會去呼叫這個指令碼,這時這個指令碼應該通
三:redis哨兵模式實現主從故障切換1
介紹 Redis Sentinel 是一個分散式系統, 你可以在一個架構中執行多個 Sentinel 程序(progress), 這些程序使用流言協議(gossip protocols)來接收關於主伺服器是否下線的資訊, 並使用投票協議(agreement
redis叢集之使用浮動vip實現故障切換全過程
目錄 生產環境: 搭建步驟: 效果驗證 測試過程 生產環境: 使用三臺裝有redis的伺服器實現一臺做主資料庫伺服器兩臺做從資料庫伺服器,在使用哨兵監控三臺伺服器。使得當主資料庫伺服器發生故障
redis哨兵模式實現主從故障切換
大多數的應用場景是MySQL(主)+Redis(輔),MySQL做為主儲存,Redis用於快取, 加快訪問速度。需要高效能的地方使用Redis,不需要高效能的地方使用MySQL。儲存 資料在MySQL和Redis之間做同步; server1 ,ser