keepalived高可用的常用功能介紹

jopen 10年前發布 | 16K 次閱讀 keepalived

Keepalived的作用是檢測web服務器的狀態,如果有一臺web服務器死機,或工作出現故障,Keepalived將檢測到,并將有故障的web 服務器從系統中剔除,當web服務器工作正常后Keepalived自動將web服務器加入到服務器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web服務器。本篇文章會介紹keepalived的安裝,配置,還有keepalived的一些腳本,keepalived+nginx高可用實現和keepalived雙機互為主從的實現。

keepalived環境安裝:
centos6.5上默認提供的keepalived版本為1.2.7的版本,但是官網最新的版本已經為1.2.13,所以這里我們源碼的方式來安裝 keepalived。首先去http://www.keepalived.org/software/keepalived- 1.2.13.tar.gz下載最新的keepalived。然后直接編譯安裝的話就可以,如果沒有裝上默認的開發環境,編譯過程中會報一些常見的錯誤,遇到什么錯誤,裝上對應的環境包即可。當然如果為了方便,可以直接裝上centos 6提供的開發包,這樣編譯過程中就不會出現什么問題。yum groupinstall "Desktop Platform Development" "Development tools" "Server Platform Development"。我的編譯安裝過程如下:
[root@bogon ~]#  tar xf keepalived-1.2.13.tar.gz
[root@bogon ~]#  cd keepalived-1.2.13
[root@bogon ~]# ./configure --prefix=/usr/local/keeaplived --sysconfdir=/etc/
[root@bogon ~]# make && make install
[root@bogon ~]# chkconfig --add keepalived

上面裝的keepalived在使用service keepalived start的時候會報錯,因為我們把keepalived的腳本安裝在了/usr/local/keepalived/sbin目錄下,而/etc /rc.rd下的keepalived中直接使用的是keepalived腳本。因此可以在PATH中加入/usr/local/keepalived /sbin這個目錄或者在keepalived把調用keepalived的地方全部改成/usr/local/keepalived/sbin /keepalived即可。

為了查閱keepalived.conf文件的方便,可以在/etc/man.config文件中加入如下配置:
MANPATH /usr/local/keepalived/share/man
這樣以后就可以直接使用man keepalived.conf來方便的查看keepalived的配置文件了

keepalived+ipvs實現httpd的高可用實驗環境(centos6.5):
1.keepalived的MASTER節點(192.168.1.134)
2.keepalived的BACKUP節點(192.168.1.136)
3.兩臺real server的地址分別是(192.168.1.143,192.168.1.170)
4.vip的地址是192.168.1.200

一。首先在兩臺real server下配置好arp協議,vip地址和路由策略:
[root@bogon ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@bogon ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@bogon ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
[root@bogon ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@bogon ~]# ifconfig lo:0 192.168.1.200 broadcast 192.168.1.200 netmask 255.255.255.255
[root@bogon ~]# route add -host 192.168.1.200 dev lo:0

二。在192.168.1.134和192.168.1.136兩臺節點上裝上keepalived和ipvsadm。
并且為MASTER節點的/etc/keepalived/keepalived.conf中提供如下的配置文件

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost #郵件的收信人地址
   }
   notification_email_from keepalived@localhost #郵件的發信人地址
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 110
    advert_int 1  #兩臺節點之間同步信息的間隔
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.1.200
    }
}

virtual_server 192.168.1.200 80 {
    delay_loop 6 #選舉服務投票的延遲時間
    lb_algo rr  #調度算法
    lb_kind DR  #LVS的類型
    nat_mask 255.255.255.0

    persistence_timeout 50  #持久連接的超時時間

    protocol TCP

    real_server 192.168.1.143 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3  #連接的超時時間
            nb_get_retry 3   #嘗試的次數
            delay_before_retry 3 #嘗試的延遲
        }
    }
    real_server 192.168.1.170 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

把上面的內容復制到BACKUP節點上,只需要修改state MASTER為state BACKUP和priority 110為priority 100即可。然后啟動keepalived服務,觀察ipvsadm中是否有對應的列表,如果有,證明我們的keepalived已經配置成功.

keepalived默認支持的檢查機制不止HTTP的方式,還有SSL_GET,TCP_CHECK,SMTP_CHECK,MISC_CHECK。如果想要插敘具體的用法,直接man keepalived.conf即可

擴展keepalived的功能:
1.在real server中所有的節點都掛了的時候,再次訪問的時候將不會得到服務,為了用戶的體驗友好性,可以在MASTER和SLAVE節點上提供一個錯誤,當所有的節點都不在的時候,提供一個錯誤的頁面。因此在MASTER和BACKUP兩臺主機上裝上httpd服務,并且提供默認的頁面。在此需要在 MASTER和BACKUP上修改keepalived.conf配置文件
virtual_server 192.168.1.200 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0

   persistence_timeout 50

    protocol TCP
    sorry_server 127.0.0.1 80  #virtual_server的配置地方和上面一樣,只是這里需要新增一行
    real_server 192.168.1.143 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.1.170 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

通過上述的配置以后,當所有的real server都掛掉的時候,默認MASTER上的httpd服務器將啟用,而當有一臺real server上線的時候,MASTER上面的http服務器將會下線。

2.默認情況下,keepalived的默認配置郵件服務功能,只會在real server發生宕機或者恢復功能的時候發出郵件。很多時候,更希望看到的是提供keepalived的節點發生故障的時候提供郵件服務。 keepalived默認提供了三個參數為notify_master,notify_backup和notify_fault。他們分別表示在節點變為 master,節點變為backup和節點不可用時可以執行的腳本。具體的信息可以通過man查看。因此下面的配置是為keepalived的 MASTER節點發生轉移的時候提供郵件功能:

在/etc/keepalived/下面建立一個新的腳本文件keepalived_message.sh,這個腳本接收2個參數,分別是狀態和VIP的地址。當我們調用前面notify_master等腳本的時候就去自動調用這個腳本對應的參數,實現發送郵件的功能。腳本內容如下:

!/bin/bash


VIP=$2

Usage (){
   echo "Usage: basename $0 {mater|backup} VIP"
}

Send_message (){
  subject="${VIP}'s server keepalived state is translate"
  content="date +'%F %T': hostname's state change to $1"
  echo $content | mail -s "$subject" root@localhost
}

[ $# -lt 2 ] && Usage && exit

case $1 in
  master)
    Send_message master
    ;;
  backup)
    Send_message backup
    ;;
  fault)
    Send_message fault
    ;;
  *)
    Usage
    exit 1
    ;;
esac

然后在配置文件keepalived.conf中添加如下內容:
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 110
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass qiguo139
    }
    virtual_ipaddress {
        192.168.1.200
    }
    #下面的內容是我們新添加的三行,當keepalived的節點變成對應狀態的時候就去執行上面給出的腳本發郵件
    notify_master "/etc/keepalived/keepalived_message.sh master 192.168.1.200"  
    notify_backup "/etc/keepalived/keepalived_message.sh backup 192.168.1.200"
    notify_fault "/etc/keepalived/keepalived_message.sh fault 192.168.1.200"
}

把上面新添加的keepalived_message.sh腳本和主配置文件中新添加的三條信息傳給另外一臺keepalived服務器,然后測試,會發現,對應keepalived的關閉,啟動都會有相應的郵件過來了。

3.keepalived還提供了vrrp_script腳本,可以擴展當前的監控,這樣我們就可以讓keepalived用在nginx和haproxy的高可用上了。vrrp_script的默認語法為:
vrrp_script check_name {
    script ""   需要執行的腳本內容或腳本文件存放的位置
    interval 2  每隔多少秒做一次檢測
    weight -2   如果失敗了,降低多少權重
    fail 2      檢測多少次失敗,才認為是真的失敗
    rise 1      檢測一次成功,就認為在線了
}
vrrp_script腳本定義在實例之外。

上面只是定義了一個vrrp_script腳本,還需要執行它,執行的話可以通過track_script來執行。track_script需要放在實例中,讓實例隨時的去執行這個腳本,判斷服務的狀況。因此如果我們定義的是vrrp_script check_name{xxx},在vrrp_instance中需要相應的添加:
track_script{
    check_name
}

下面實現keepalived+nginx的高可用功能腳本,這里的nginx服務器仍然做的是負載均衡服務器,MASTER上的腳本如下:

! Configuration File for keepalived
global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script check_nginx {
    script "killall -0 nginx"
    interval 2
    weight -2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass qiguo139
    }
    virtual_ipaddress {
        192.168.1.200
    }
    track_script {
        check_nginx
    }
}

在BACKUP節點上只需要把priority 的值換成100,把state的狀態換成BACKUP即可.

4.有時候讓一臺BACKUP長期處于空閑狀態容易造成資源浪費,因此可以配置雙機互為主從。其主要的思路就是創建2個虛擬路由器,并以兩個節點互為主從。我們修改上面頂一個nginx+keepalived的高可用腳本來實現互為主從:
! Configuration File for keepalived
global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script check_nginx {
    script "killall -0 nginx"
    interval 2
    weight -2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass qiguo139
    }
    virtual_ipaddress {
        192.168.1.200
    }
    track_script {
        check_nginx
    }
}

vrrp_instance VI_2 {
    state BACKUP  #對于另外一臺主的從
    interface eth0
    virtual_router_id 52  #定義一個新的虛擬路由的時候,不能和原來的虛擬路由ID的值一樣
    priority 100  #對于另外一臺的優先級
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass qiguo139
    }
    virtual_ipaddress {
        192.168.1.201  #定義在BACKUP上的VIP
    }
    track_script {
        check_nginx
    }
}

然后在BACKUP上面互換關系即可。然后再次查看會發現在原來的MASTER上面會綁定192.168.1.200的VIP,原來的BACKUP上面會綁定192.168.1.201的VIP。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!