之前就想寫一個關於keepalive的,但因為網上的資料很多,想算了。后來自己又操作了一下,覺得還是自己寫得用起來方便。
安裝:
下載keepalived最新源碼包:
https://www.keepalived.org/download.html
安裝方法一:
./configure
make
make install
安裝方法二:
源碼包中自帶spec,使用rpmbuild -bb命令,把包編譯成rpm然后給服務器安裝。
安裝命令:
rpm -ivh keepalived-2.1.5-1.el7.x86_64.rpm
安裝方法三:
直接用"yum -y install keepalived"安裝,但這樣安裝的包不是最新版本也勉強能用。
配置及啟停
配置
! Configuration File for keepalived
vrrp_script check_ngx_alive {
script "/etc/keepalived/check_ngx_alive.sh" # 狀態檢測腳本
interval 2 # 狀態檢測時間間隔
weight -10 # 當狀態檢測腳本返回非0值時當前節點priority在設置值基礎上降低多少
}
global_defs {
notification_email {
#acassen@firewall.loc
#failover@firewall.loc
#sysadmin@firewall.loc
}
#notification_email_from Alexandre.Cassen@firewall.loc
#smtp_server 192.168.200.1
#smtp_connect_timeout 30
router_id LVS_DEVEL_112 # 保證名稱唯一
script_user root # 指定腳本運行的用戶
enable_script_security
#vrrp_skip_check_adv_addr
#vrrp_strict
#vrrp_garp_interval 0
#vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens32 #發vrrp包的接口,可以選擇一對專用接口做心跳線
virtual_router_id 51
priority 112 #優先級,keepalived會根據優先級判斷是主是從
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 設置VIP
192.168.15.110/24 dev ens32 # 還可以設置得更復雜一點如"192.168.1.33/24 brd 192.168.1.255 dev eno1 label eno1:1",如果不指定王凱,就綁定到interface配置的接口
}
track_script { # 設置檢測腳本
check_ngx_alive # vrrp_script上面定義的檢測腳本的名稱
}
notify_master "/etc/keepalived/arp_update.sh" # 變成主節點后執行的腳本
notify_backup "/etc/keepalived/notify.sh backup" #同理,變成bakup時執行的腳本
notify_fault "/etc/keepalived/notify.sh fault"
preempt_delay 3 # 變成主節點后多長時間搶占VIP,如果不需要切換可直接寫nopreempt
}
virtual_server 192.168.15.110 8034 { # LVS的相關配置
delay_loop 6 # 每隔6秒查詢realserver狀態
lb_algo rr # lvs的調度算法
lb_kind DR # lvs的集群模式
persistence_timeout 50 #指定時間內來自同一Client的請求會被發送到同一個RealServer
protocol TCP
real_server 192.168.15.112 8034 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 1554
}
}
}
啟停
systemctl start keepalived #啟動
systemctl stop keepalived #停止
systemctl restart keepalived #重啟
systemctl status keepalived #查看狀態
腳本參考
check_ngx_alive.sh
if [ `ps aux | grep nginx | grep -v grep | wc -l` -eq 0 ];then
exit 1
fi
exit 0
arp_update.sh
#!/bin/bash
VIP=192.168.15.110
GATEWAY=192.168.15.253
/sbin/arping -I ens32 -c 5 -s $VIP $GATEWAY &>/dev/null
keepalive.conf
! Configuration File for keepalived
vrrp_script check_ngx_alive
{
script "/etc/keepalived/check_ngx_alive.sh"
interval 2
weight -30
user root
}
global_defs {
notification_email {
#acassen@firewall.loc
#failover@firewall.loc
#sysadmin@firewall.loc
}
router_id LVS_DEVEL_112
script_user root
enable_script_security
}
vrrp_instance VI_1 {
state BACKUP
interface ens32
virtual_router_id 51
priority 112
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.15.110/24 dev ens32
}
track_script {
check_ngx_alive
}
notify_master "/etc/keepalived/arp_update.sh"
#nopreempt
preempt_delay 3
}
驗證及結果
場景1 雙機熱備
使用keepalive做主備有兩種方法
前提:主priority + 主vrrp_script.weight < 備priority (注:vrrp_script.weight是一個負數)
方法一:
主設置nopreempt,state:MASTER,vrrp_script指定的腳本中,當服務不存在時執行"systemctl stop keepalived"
方法二:
兩個節點都設置為"preempt_delay 3,state:BACKUP",vrrp_script指定的腳本中不需要停止keepalive
場景2 冷備
配置方法:
兩個節點都設置為"preempt_delay 3,state:BACKUP",vrrp_script指定的腳本中不需要停止keepalive
主priority > 備priority; 主priority + 主vrrp_script.weight < 備priority + 備vrrp_script.weight
備的notify_master腳本中添加啟動服務的命令;在備機中,服務最初處於關閉狀態.
原理描述:當主上的服務掛掉之后,主priority小於備機的priority,備機變成master,觸發備機的notify_master腳本,此時備機上的服務被開啟,備機的優先級升高。
遇到的問題和解決方法
1. vrrp_script不執行;
答:(1)先用"tail -f /var/log/message"查看報了什么錯。
(2)賦予腳本權限 chmod 755 xxx.sh,記住一定要是755.
(3)手動執行腳本,看腳本是否正常執行;(后來發現,如果用 echo "$(date)" >> xxx.log的方式判斷是否執行判斷不出來,好像echo已經被屏蔽了一樣。但是腳本確實已經執行了,從啟停服務上看是正常的.)
(4)腳本的名稱問題,比如叫"check_nginx_status.sh"結果腳本里判斷條件是"ps -ef | grep nginx | grep -v grep | wc -l
-eq 2",這時候會導致運行腳本的進程會被算到ps的統計里面去,導致腳本執行不准;
(5)看腳本前面是不是加了"#!/bin/bash",否則keepalive不知道用sh還是bash來執行你的腳本
2.notify_master等腳本不執行,配置不生效的問題;
答:首先查看是否打開了SELINUX;
getenforce
如果是,那有幾種辦法:
(1)關掉SELINUX
setenforce 0 #臨時關閉
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config #重啟后永久生效
(2)賦予腳本安全執行權限;
chcon -t keepalived_unconfined_script_exec_t /etc/keepalived/arp_update.sh
3.如何判斷VIP是否漂移?
方法一:在服務器上使用"ip addr"命令,查看VIP在哪台上,就是漂移到哪台上了。
方法二:查看/var/log/message日志
方法三: 在其他終端上ping以下VIP,然后用"arp -a"命令查看vip對應的MAC地址是哪個就是哪個了。
4.VIP漂移很慢的問題;
答:這個也沒有什么好辦法,可以用下面的腳本試試;就是用arping更新arp信息,寫在notify_master腳本中;
VIP=192.168.15.110
GATEWAY=192.168.15.253
/sbin/arping -I ens32 -c 5 -s $VIP $GATEWAY &>/dev/null
不知道在你的環境中是怎樣的,我測試的結果是失敗的。在同網段不管用不用arping VIP漂移都是實時生效的,但是跨網段很長時間都是連接異常。
網關的arp列表有時候遲遲不刷新,有時候刷新了還是連接不上,折騰了一陣還是沒有解決。
難道是需要路由器開啟VRRP協議?理論上是不需要的,路由器的VRRP協議是為了備份路由的,好像和KeepAlive沒有管理。因為家用路由器沒那選項,公司的路由器還沒試過。有條件的同學可以嘗試一下:
參考地址:https://www.cisco.com/c/en/us/support/docs/security/vpn-3000-series-concentrators/7210-vrrp.html
如果成功了記得回復我一下。