Linux下配置 Keepalived(心跳檢測部署)

首先呢,我想先給大家簡單介紹一下什麼是keepalived:

Keepalived的作用是檢測服務器的狀態,如果有一臺web服務器死機,或工作出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除,同時使用其他服務器代替該服務器的工作,當服務器工作正常後Keepalived自動將服務器加入到服務器羣中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的服務器。


大家瞭解到Keepalived是什麼東西了之後,咱們就進入主題。


1.下載

http://www.keepalived.org/download.html


wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz

2.安裝
tar -zxvf keepalived-1.2.2.tar.gz
cd keepalived-1.2.2
./configure --prefix=/home/wangpl/mine/soft/keepalived-1.2.2
make && make install


補充: 在大家進行./configure  有的機器會報錯,這裏爲大家提供一個簡單的解決方案。

1.遇到keepalived執行./configure --prefix=/usr/local/keepalived時報錯:configure: error: Popt libraries is required

[python] view plain copy
  1.  解決方法:  
  2. yum install popt-devel  
  3. 安裝好popt的開發包。  
  4.   
  5. 重新./configure 即可。  

3.方式
    安裝到系統,默認的啓動腳本里寫的是系統路徑,所以需要拷貝一些文件到系統目錄下
    $ cp /home/wangpl/mine/soft/keepalived-1.2.2/etc/rc.d/init.d/keepalived /etc/init.d/
    $ cp /home/wangpl/mine/soft/keepalived-1.2.2/sbin/keepalived /usr/sbin/
    $ cp /home/wangpl/mine/soft/keepalived-1.2.2/etc/sysconfig/keepalived /etc/sysconfig/
    $ mkdir -p /etc/keepalived/
    $ cp /home/wangpl/mine/soft/keepalived-1.2.2/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf

4.試用

    進入目錄 進行啓動cd /etc/init.d/

啓動:sh keepalived start

停止:sh keepalived stop

重啓:sh keepalived restart

5.  (主從模式)配置keepalived.conf


[python] view plain copy
  1. global_defs {    
  2.    notification_email {    
  3.      root@localhost    
  4.    }    
  5.    notification_email_from root@localhost    
  6.    smtp_server localhost    
  7.    smtp_connect_timeout 30    
  8.    router_id  NodeA    
  9. }     

默認的配置文件中,使用第三方smtp服務器,但這在現實中幾乎沒有意義(需要驗證的原因),我們將其指定爲localhost, 將通知信息的發送交給本地sendmail服務處理。或者把其內容全部刪除掉只留下router_id  NodeA。查閱說明文檔得知route_id配置是爲了標識當前節點,我將其設置爲NodeA。當然兩個節點的此項設置可相同,也可不相同。

[python] view plain copy
  1. vrrp_instance VI_1 {    
  2.     state MASTER   #指定A節點爲主節點 備用節點上設置爲BACKUP即可    
  3.     interface eth0   #綁定虛擬IP的網絡接口    
  4.     virtual_router_id 51  #VRRP組名,兩個節點的設置必須一樣,以指明各個節點屬於同一VRRP組    
  5.     priority 100   #主節點的優先級(1-254之間),備用節點必須比主節點優先級低    
  6.     advert_int 1   #組播信息發送間隔,兩個節點設置必須一樣    
  7.     authentication {   #設置驗證信息,兩個節點必須一致    
  8.         auth_type PASS    
  9.         auth_pass 1111    
  10.     }    
  11.     virtual_ipaddress {   #指定虛擬IP, 兩個節點設置必須一樣    
  12.         192.168.200.16/24    
  13.         192.168.200.17 /24  #這裏的IP是一個本地  
  14. p;          192.168.200.18 /24  #這裏的IP是另外一個連接的IP  
  15.     }    
  16. }     
按同樣的方法配置節點B並修改配置文件,可將A節點的配置文件複製到B節點,並修改以下幾項:

router_id  NodeB

state   BACKUP

priority   99

其它項不必修改。

測試及驗證:

執行命令 ip a (注意ifconfig命令無法查看到配置的虛擬IP),來查看。


6.(主從模式)腦裂問題

上述主從配置方式存在腦裂的可能,即兩個節點實際都處於正常工作狀態,但是無法接收到彼此的組播通知,這時兩個節點均強行綁定虛擬IP,導致不可預料的後果。 
這時就需要設置仲裁,即每個節點必須判斷自身的狀態(應用服務狀態及自身網絡狀態),要實現這兩點可使用自定義shell腳本實現,通過週期性地檢查自身應用服務狀態,並不斷ping網關(或其它可靠的參考IP)均可。當自身服務異常、或無法ping通網關,則認爲自身出現故障,就應該移除掉虛擬IP(停止keepalived服務即可)。主要藉助keepalived提供的vrrp_scripttrack_script實現:

在keepalived的配置文件最前面加入以下代碼,定義一個跟蹤腳本:
[python] view plain copy
  1. vrrp_script check_local { #定義一個名稱爲check_local的檢查腳本    
  2.     script "/usr/local/keepalived/bin/check_local.sh" #shell腳本的路徑    
  3.     interval 5  #運行間隔    
  4. }   

再在vrrp_instance配置中加入以下代碼使用上面定義的檢測腳本:

[python] view plain copy
  1. track_script {    
  2.   check_local    
  3. }   

我們在/usr/local/keepalived/bin/check_local.sh定義的檢測規則可以是: 

               以上的路徑及文件是自己定義的。

a.自身web服務故障(超時,http返回狀態不是200)

b.無法ping通網關

c.產生以上任何一個問題,均應該移除本機的虛擬IP(停止keepalived實例即可)

但這裏有個小問題,如果本機或是網關偶爾出現一次故障,那麼我們不能認爲是服務故障。更好的做法是如果連續N次檢測本機服務不正常或連接N次無法ping通網關,才認爲是故障產生,才需要進行故障轉移。另一方面,如果腳本檢測到故障產生,並停止掉了keepalived服務,那麼當故障恢復後,keepalived是無法自動恢復的。我覺得利用獨立的腳本以秒級的間隔檢查自身服務及網關連接性,再根據故障情況控制keepalived的運行或是停止。

這裏提供一個思路,具體腳本內容請大家根據自己的需要編寫即可。


腳本/usr/local/nginx/check_nginx.sh"內容:

[python] view plain copy
  1. #!/bin/bash    
  2. if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]    
  3. then    
  4. /usr/local/nginx/sbin/nginx    
  5. sleep 5    
  6. if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]    
  7. then    
  8. killall keepalived    
  9. fi    
  10. fi    


//如果以上配置我介紹的不理解的話 大家參考一下實例代碼。


vi /etc/keepalived/keepalived.conf

編輯文件(主):

[python] view plain copy
  1.     global_defs {    
  2.        router_id nginx_master    
  3.     }    
  4.     #監控服務.NGINX mysql等    
  5.     vrrp_script chk_nginx {    
  6.         script "/usr/local/nginx/check_nginx.sh"    
  7.         interval 2    
  8.         weight 2    
  9.     }    
  10.         
  11.     vrrp_instance VI_1 {    
  12.         state MASTER    
  13.         interface eth0    
  14.         virtual_router_id 51    
  15.         priority 101    
  16.         advert_int 1    
  17.         authentication {    
  18.             auth_type PASS    
  19.             auth_pass 1111    
  20.         }    
  21.         virtual_ipaddress {    
  22.             192.168.xx.xx    #VIP(虛擬ip)  
  23.          192.168.xx.xx    #本機IP  
  24.  192.168.xx.xx    #另外一臺IP<span></span>   
  25. }   
  26. track_script {   
  27. chk_nginx #檢測腳本 上面配置的   
  28. }   
  29. }  

vi /etc/keepalived/keepalived.conf

編輯文件(從):

[python] view plain copy
  1. global_defs {    
  2.    router_id nginx_backup    
  3. }    
  4. #監控服務.NGINX mysql等    
  5. vrrp_script chk_nginx {    
  6.     script "/usr/local/nginx/check_nginx.sh"    
  7.     interval 2    
  8.     weight 2    
  9. }    
  10.     
  11. vrrp_instance VI_1 {    
  12.     state BACKUP    
  13.     interface eth0    
  14.     virtual_router_id 51    
  15.     priority 99    
  16.     advert_int 1    
  17.     authentication {    
  18.         auth_type PASS    
  19.         auth_pass 1111    
  20.     }    
  21.     virtual_ipaddress {    
  22. 192.168.xx.xx    #VIP(虛擬ip)  
  23.  192.168.xx.xx    #本機IP  
  24.  192.168.xx.xx    #另外一臺IP  
  25.  }   
  26. track_script {   
  27. chk_nginx #檢測腳本 上面配置的   
  28. }  
  29.  }  





啓動並測試:

1.啓動兩臺機器上的nginx

2.啓動兩臺機器上的keepalived

此時使用命令 ip addr 查看虛擬IP綁定 可以看到主 有,從沒有,將主機的keepalived關掉,可以看到vip綁定到了從的上面。



參考地址:

http://www.linuxidc.com/Linux/2012-08/69383.htm

http://www.68idc.cn/help/buildlang/ask/20150616370229.html

http://blog.csdn.net/conquer0715/article/details/47955553

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章