1. 程式人生 > >Keepalived介紹以及在Linux系統下的安裝與配置

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  ]
複製程式碼