備胎的養成記KeepAlived實現熱備負載


  在  入坑系列之HAProxy負載均衡 中已經詳細講過了怎么將高並發的請求按均衡算法分發到幾台服務器上做均衡防止單機崩潰。

  但這樣的話有沒有發現所有請求都經過了HAproxy代理,自然當並發量越來越高時HAproxy就成了瓶頸,突發時HAproxy就會掛掉,或HAproxy服務器出現故障,這時外部唯一的請求入口沒有了,怎么辦?重啟是個辦法,但還是需要搶修時間,這期間內客戶都無法訪問損失的鍋又得程序猿來背。

  這種情況下備胎出現了, Keepalived登場,他可以解決服務宕機自動無縫切換。

Keepalived采用VRRP(virtual router redundancy protocol,虛擬路由冗余協議)熱備份協議,以軟件的方式實現linux服務器的多機熱備功能。VRRP是針對路由器的一種備份解決方案——由多台路由器組成一個熱備組。通過共用的虛擬IP地址對外提供服務;每個熱備組內同一時刻只有一台主服務器提供服務,其他服務器處於冗余狀態,若當前在線的服務器失敗,其他服務器會自動接替(優先級決定接替順序)虛擬IP地址,以繼續提供服務。
keepalived 默認需要使用D類多播地址224.0.0.18 進行心跳通信
keepalived 使用vrrp協議(虛擬路由冗余協議)進行通信(協議號碼為112)

  Keepalived也可以與LVS、Nginx、MySQL等結合使用,形成可靠的主備機,給了你寶貴的搶修時間。

  下面來講如何一步步搭建。

環境  

  CentOS6.X

  HAProxy 1.7.3

  Keepalived 1.3.4

  用root用戶安裝

下載

  若在線安裝不用下載,可直接通過yum命令安裝(建議),不過需要聯網。

  去官網下載 :http://www.keepalived.org/software/keepalived-1.3.4.tar.gz

  下載后放進CentOS中的/usr/local/ 文件夾中

安裝   

  分兩種:

  1、在線裝:yum install -y ipvsadm keepalived (建議)

  2、安裝包;

  此處按照下載好的安裝包操作:

[root@H32 local]#tar -zxvf keepalived-1.3.4.tar.gz
[root@H32 local]#cd keepalived-1.3.4

[root@H32 keepalived-1.3.4]#./configure --prefix=/usr/ --sysconfdir=/etc/
[root@H32 keepalived-1.3.4]#make
[root@H32 keepalived-1.3.4]#make install

 

  在此之前還需要設置主備機的時間一致,可用ntpdate向時間服務器同步,具體的方法有時間再詳細說明。

設置

   修改keepalived.conf文件配置

[root@H32 ~]# vi /etc/keepalived/keepalived.conf

  具體配置內容:

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost #接受郵件方
   }
   notification_email_from soul@104.com #發件人
   smtp_server 127.0.0.1 #郵件服務器
   smtp_connect_timeout 30 #超時時長
   router_id LVS_DEVEL #ID;隨意即可
}

vrrp_script chk_state_down {
    script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" #如果在/roo/下有down文件;就失敗;轉移到從上;否則正常
    interval 2
    weight 3
}

vrrp_script chk_haproxy { 
  script "/etc/keepalived/chk_haproxy.sh" # 設置執行的腳本,可以是腳本,也可以是命令
  interval 2 # script執行周期,每個interval執行一次健康檢查
  weight 2 # 健康檢查返回0 & weight大於0,優先級增加相應權值;健康檢查非0 & weight小於0,優先級減小相應值;
      # 不管提高優先級還是降低優先級,最終優先級的范圍是在[1,254],不會出現優先級小於等於0或者優先級大於等於255的情況
}

vrrp_instance VI_1 { # VRRP 配置標識 VI_1是實例名稱,一個文件可配置多個
    state MASTER  # 指定Keepalvied角色 MASTER表示此主機為主服務器 BACKUP則是表示為備用服務器
                  # 當master出現異常后,backup自動切換為master。當backup成為master后,master恢復正常后會再次搶占成為master,導致不必要的主備切換。
           # 實際應用中,可以將兩台keepalived初始狀態均配置為backup,設置不同的優先級,優先級高的設置nopreempt(非搶占)解決異常恢復后再次搶占的問題。
    interface eth0 # 節點固有IP(非VIP)的網卡,用來發VRRP包
    virtual_router_id 111  # 虛擬路由標識(0-255),同一個VRRP實例使用唯一的標識,DB中的規范是使用節點IP的最后一位。如10.10.16.51的51 (主備相同)
    priority 100  # 節點優先級,數字越大表示節點的優先級越高。keepalived啟動時會通過選舉將優先級最高的節點選舉為master。如果某個節點初始state是master,但是優先級低,該節點會變成backup
    advert_int 1  # 發送通告的時間間隔,
                   # 按照vrrp的官方文檔,backup會接收master的advert_int的值,然后計算出skew time和master down interval,認為master宕機觸發的選舉時間應該是(3 * Master_Adver_Interval) + Skew_time
    authentication {
        auth_type PASS
        auth_pass 1111   # 同一 vrrp 實例MASTER 與 BACKUP 使用相同的密碼才能正常通信 (主備相同)
    }
    virtual_ipaddress {
        192.168.80.114  # 設置虛擬IP地址 (VIP),又叫做漂移IP地址 可以有多個,每個一行 (主備機必須相同,也是對外的虛擬IP)
    }
    
    track_script { 
      chk_haproxy  # 該實例需要執行的健康執行腳本,每個一行
      chk_state_down
    }
    
    notify_master "/etc/keepalived/notify.sh master 192.168.80.114"
    notify_backup "/etc/keepalived/notify.sh backup 192.168.80.114"
    notify_fault "/etc/keepalived/notify.sh fault 192.168.80.114"  # 狀態切換為master/backup/fault時執行對應的腳本
}
                    

  說明:

因為Keepalived在轉換狀態時會依照狀態來呼叫:
當進入Master狀態時會呼叫notify_master
當進入Backup狀態時會呼叫notify_backup
當發現異常情況時進入Fault狀態呼叫notify_fault
當Keepalived程序終止時則呼叫notify_stop

  配置中notify.sh:

[root@H32 ~]# vi /etc/keepalived/notify.sh

  配置內容:

#!/bin/bash
# description: An example of notify script
#
contact='root104@localhost'
notify() { 
mailsubject="`hostname` to be $1: $2 floating"
mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}

case "$1" in
master) 
notify master 
/etc/rc.d/init.d/haproxy start
exit 0
;;
backup)
notify backup
/etc/rc.d/init.d/haproxy stop
exit 0
;;
fault)
notify fault
/etc/rc.d/init.d/haproxy stop
exit 0
;;
*)
echo 'Usage: `basename $0` {master|backup|fault}'
exit 1
;;
esac

  其中chk_haproxy.sh

[root@H32 ~]# vi /etc/keepalived/chk_haproxy.sh

  添加內容:

#!/bin/bash
#
# author: weizhifeng
# description:
# 定時查看haproxy是否存在,如果不存在則啟動haproxy,
# 如果啟動失敗,則停止keepalived
#
status=$(ps aux|grep haproxy | grep -v grep | grep -v bash | wc -l)
if [ "${status}" = "0" ]; then
    /etc/init.d/haproxy start
 
    status2=$(ps aux|grep haproxy | grep -v grep | grep -v bash |wc -l)
 
    if [ "${status2}" = "0"  ]; then
            /etc/init.d/keepalived stop
    fi
fi

  將以上三個文件全部更改后 復制一份到備機;注意根據上述高亮描述進行更改。(非常重要)

  還要給chk_haproxy.sh和notify.sh執行腳本的權限。

chmod  +x  /etc/keepalived/notify.sh
chmod  +x  /etc/keepalived/chk_haproxy.sh

 

啟動

   配置完后進行啟動keepalived 和haproxy,主備機均要啟動:

service keepalived start

   其它命令:

service keepalived stop #停止

service keepalived restart #重啟
service keepalived enable #開機啟動

測試

  down掉主機的haproxy,查看haproxy監控訪問VIP:192.168.80.32:8089/stats,看haproxy的ID是否有變化,然后重啟主機的haproxy,再看haproxy的ID是否有變化。

   執行ip a查看VIP在兩台機子上有變化

[root@H32 ~]# ip a

 

思考:

  虛擬IP必須與master 和 備機 在同一網段,經測試若虛擬IP與他們不在同一網段訪問不了VIP。

  防止keepalived互搶IP的辦法,這個也有網有提出過,有相應的方法。

  主備機互作主備,即主機也是備機,可以做配置多個實例來實現。

  有網友測試出Keepalived限制死20個VIP問題,那這個是怎么解決的。

  有時主備機都出現綁定了VIP,這時最可能的是主備機間無法通訊,最簡單的測試方法是關掉兩機的防火牆,再試,由於Keepalived基於vrrp 通訊,因此還需要加vrrp和防火牆:(在入坑系列之HAProxy負載均衡 中提到過)

vi /etc/sysconfig/iptables  #編輯

-A RH-Firewall-1-INPUT -d 224.0.0.18 -j ACCEPT  #允許組播地址通信(在做keepalived時用得到)
-A RH-Firewall-1-INPUT -p    vrrp    -j ACCEPT  #允許VRRP(虛擬路由器冗余協)通信
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT  #允許80端口通過防火牆
:wq! #保存退出
service iptables restart #重啟防火牆使配置生效

 


免責聲明!

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



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