keepalive安裝部署踩坑參考


之前就想寫一個關於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
如果成功了記得回復我一下。

參考地址:

https://www.cnblogs.com/shuiguizi/p/11172267.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM