Keepalived介紹以及在Linux系統下的安裝與配置
一、簡介
Keepalived是一個免費開源的,用C編寫的類似於layer3, 4 & 7交換機制軟體,具備我們平時說的第3層、第4層和第7層交換機的功能。主要提供loadbalancing(負載均衡)和 high-availability(高可用)功能,負載均衡實現需要依賴Linux的虛擬服務核心模組(ipvs),而高可用是通過VRRP協議實現多臺機器之間的故障轉移服務。
Keepalived是一個基於VRRP協議來實現的服務高可用方案,可以利用其來避免IP單點故障,類似的工具還有heartbeat、corosync、pacemaker。但是它一般不會單獨出現,而是與其它負載均衡技術(如lvs、haproxy、nginx)一起工作來達到叢集的高可用。
Keepalived的作用是檢測伺服器的狀態,如果有一臺web伺服器宕機,或工作出現故障,Keepalived將檢測到,並將有故障的伺服器從系統中剔除,同時使用其他伺服器代替該伺服器的工作;當伺服器工作正常後Keepalived自動將伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的伺服器。
健康檢查和失敗切換是keepalived的兩大核心功能。 所謂的健康檢查, 就是採用tcp三次握手, icmp請求, http請求, udp echo請求等方式對負載均衡器後面的實際的伺服器(通常是承載真實業務的伺服器)進行保活;而失敗切換主要是應用於配置了主備模式的負載均衡器, 利用VRRP(虛擬路由冗餘協議, 可參考RFC文件http://tools.ietf.org/html/rfc5798) 維持主備負載均衡器的心跳, 當主負載均衡器出現問題時, 由備負載均衡器承載對應的業務, 從而在最大限度上減少流量損失, 並提供服務的穩定性。
二、VRRP協議
VRRP全稱 Virtual Router Redundancy Protocol,即 虛擬路由冗餘協議。可以認為它是實現路由器高可用的容錯協議,即將N臺提供相同功能的路由器組成一個路由器組(Router Group),這個組裡面有一個master和多個backup,但在外界看來就像一臺一樣,構成虛擬路由器,擁有一個虛擬IP(vip,也就是路由器所在區域網內其他機器的預設路由),佔有這個IP的master實際負責ARP相應和轉發IP資料包,組中的其它路由器作為備份的角色處於待命狀態。master會發組播訊息,當backup在超時時間內收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先順序來選舉一個backup當master,保證路由器的高可用。
在VRRP協議實現裡,虛擬路由器使用 00-00-5E-00-01-XX 作為虛擬MAC地址,XX就是唯一的 VRID (Virtual Router IDentifier),這個地址同一時間只有一個物理路由器佔用。在虛擬路由器裡面的物理路由器組裡面通過多播IP地址 224.0.0.18 來定時傳送通告訊息。每個Router都有一個 1-255 之間的優先級別,級別最高的(highest priority)將成為主控(master)路由器。通過降低master的優先權可以讓處於backup狀態的路由器搶佔(pro-empt)主路由器的狀態,兩個backup優先順序相同的IP地址較大者為master,接管虛擬IP。
三、與heartbeat/corosync等比較
Heartbeat、Corosync、Keepalived這三個叢集元件我們到底選哪個好,首先我想說明的是,Heartbeat、Corosync是屬於同一型別,Keepalived與Heartbeat、Corosync,根本不是同一型別的。Keepalived使用的vrrp協議方式,虛擬路由冗餘協議 (Virtual Router Redundancy Protocol,簡稱VRRP);Heartbeat或Corosync是基於主機或網路服務的高可用方式;簡單的說就是,Keepalived的目的是模擬路由器的高可用,Heartbeat或Corosync的目的是實現Service的高可用。
所以一般Keepalived是實現前端高可用,常用的前端高可用的組合有,就是我們常見的LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived。而Heartbeat或Corosync是實現服務的高可用,常見的組合有Heartbeat v3(Corosync)+Pacemaker+NFS+Httpd 實現Web伺服器的高可用、Heartbeat v3(Corosync)+Pacemaker+NFS+MySQL 實現MySQL伺服器的高可用。總結一下,Keepalived中實現輕量級的高可用,一般用於前端高可用,且不需要共享儲存,一般常用於兩個節點的高可用。而Heartbeat(或Corosync)一般用於服務的高可用,且需要共享儲存,一般用於多節點的高可用。
四、Keepalived + nginx
keepalived一般不會單獨出現,而是與其它負載均衡技術(如lvs、haproxy、nginx)一起工作來達到叢集的高可用。
keepalived可以認為是VRRP協議在Linux上的實現,主要有三個模組,分別是core、check和vrrp。core模組為keepalived的核心,負責主程序的啟動、維護以及全域性配置檔案的載入和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp模組是來實現VRRP協議的。
五、keepalived的功能體系結構
上圖是Keepalived的功能體系結構,大致分兩層:使用者空間(user space)和核心空間(kernel space)。
核心空間:主要包括IPVS(IP虛擬伺服器,用於實現網路服務的負載均衡)和NETLINK(提供高階路由及其他相關的網路功能)兩個部份。
使用者空間:
- WatchDog:負載監控checkers和VRRP程序的狀況
- VRRP Stack:負載負載均衡器之間的失敗切換FailOver,如果只用一個負載均稀器,則VRRP不是必須的。
- Checkers:負責真實伺服器的健康檢查healthchecking,是keepalived最主要的功能。換言之,可以沒有VRRP Stack,但健康檢查healthchecking是一定要有的。
- IPVS wrapper:使用者傳送設定的規則到核心ipvs程式碼
- Netlink Reflector:用來設定vrrp的vip地址等。
Keepalived的所有功能是配置keepalived.conf檔案來實現的。
六、安裝與配置
從官網下載keepalived,本文以版本1.2.24為例。
6.1 安裝
[[email protected] ~]# wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gz [[email protected] ~]# tar -xzvf keepalived-1.2.24.tar.gz [[email protected] ~]# cd keepalived-1.2.24
6.2 編譯
[[email protected] keepalived-1.2.24]# ./configure --prefix=/usr/local/keepalived [[email protected] keepalived-1.2.24]# make && make install
6.3 配置
安裝完成後,進入安裝目錄的etc目錄下,將keepalived相應的配置檔案拷貝到系統相應的目錄當中。keepalived啟動時會從/etc/keepalived目錄下查詢keepalived.conf配置檔案,如果沒有找到則使用預設的配置。/etc/keepalived目錄安裝時預設是沒有安裝的,需要手動建立。配置檔案目錄結構如下所示:
[[email protected] ~]# tree -l /usr/local/keepalived/etc/ /usr/local/keepalived/etc/ ├── keepalived │ ├── keepalived.conf │ └── samples │ ├── client.pem │ ├── dh1024.pem │ ├── keepalived.conf.fwmark │ ├── keepalived.conf.HTTP_GET.port │ ├── keepalived.conf.inhibit │ ├── keepalived.conf.IPv6 │ ├── keepalived.conf.misc_check │ ├── keepalived.conf.misc_check_arg │ ├── keepalived.conf.quorum │ ├── keepalived.conf.sample │ ├── keepalived.conf.SMTP_CHECK │ ├── keepalived.conf.SSL_GET │ ├── keepalived.conf.status_code │ ├── keepalived.conf.track_interface │ ├── keepalived.conf.virtualhost │ ├── keepalived.conf.virtual_server_group │ ├── keepalived.conf.vrrp │ ├── keepalived.conf.vrrp.localcheck │ ├── keepalived.conf.vrrp.lvs_syncd │ ├── keepalived.conf.vrrp.routes │ ├── keepalived.conf.vrrp.rules │ ├── keepalived.conf.vrrp.scripts │ ├── keepalived.conf.vrrp.static_ipaddress │ ├── keepalived.conf.vrrp.sync │ ├── root.pem │ └── sample.misccheck.smbcheck.sh ├── rc.d │ └── init.d │ └── keepalived └── sysconfig └── keepalived
分別對應系統目錄(忽略samples目錄):
/etc/keepalived/keepalived.conf /etc/rc.d/init.d/keepalived /etc/sysconfig/keepalived
將配置檔案拷貝到系統對應的目錄下:
[[email protected] ~]# mkdir /etc/keepalived [[email protected] ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf [[email protected] ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/keepalived [[email protected] ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
6.4 啟動
[[email protected] ~]# cd /etc/init.d/ [[email protected] init.d]# chmod +x keepalived [[email protected] init.d]# service keepalived start Starting keepalived: /bin/bash: keepalived: command not found [FAILED] [[email protected] init.d]# ln -s /usr/local/keepalived/sbin/keepalived /usr/bin/ [[email protected] init.d]# service keepalived start Starting keepalived: [ OK ]