天天看點

java中keepalived開啟方式_高可用之KeepAlived(一):基本概念和配置檔案分析

1.概述

KeepAlived主要有兩個功能:

(1).能夠對RealServer進行健康狀況檢查,支援4層、5層和7層協定進行健康檢查;

(2).對負載均衡排程器實作高可用,防止Director單點故障。

在keepalived設計之初,它隻是LVS周邊的一個輔助工具,用于LVS的監控狀況檢查,是以它和LVS的相容性非常好。如果某一個realserver節點宕了,keepalived會将此節點從管理清單中踢出去,當此節點恢複後又将此節點加回管理清單,這樣能夠就讓realserver負載均衡變的智能化。但是,此時的排程器存在單點故障的可能性,是以有必要對其實作高可用。

實作LVS高可用可以使用多種軟體來實作,如heartbeat,但是heartbeat本身不能實作ipvs的健康狀況檢查,需要搭配Ldirectord(安裝完heartbeat就有了)來進行健康檢查。所幸的是keepalived後來也加入了高可用的功能,而且配置起來也相當簡單。相比于heartbeat+Ldirectord,keepalived的檢查速度極快,故障轉移也極快,布置也簡單的多。是以一般來說,要管理ipvs,都會選擇使用keepalived。下圖列出了建構LVS高可用的幾種工具:

java中keepalived開啟方式_高可用之KeepAlived(一):基本概念和配置檔案分析

keepalived實作故障轉移的功能是通過VRRP(virtual router redundancy protocol虛拟路由器備援協定)協定來實作的。 在keepalived正常工作的時候,主節點(master)會不斷的發送心跳資訊給備節點(backup),當備節點不能在一定時間内收到主節點的心跳資訊時,備節點會認為主節點宕了,然後會接管主節點上的資源,并繼續向外提供服務保證其可用性。當主節點恢複的時候,備節點會自動讓出資源并再次自動成為備節點。

注意,使用keepalived監控、高可用LVS叢集時(即常說的keepalived+lvs),并不需要在Director上使用ipvsadm等管理工具額外配置ipvs規則。因為keepalived中集合了管理ipvs規則的元件(即稍後模型圖中的ipvs wrapper),可以直接在keepalived的配置檔案中配置ipvs相關規則,在解析配置檔案時會通過特定的元件将規則發送到核心中的ipvs子產品。

2. VRRP協定

VRRP協定的出現是為了解決靜态路由的單點故障,它是通過一種競選機制來将路由任務交給某個vrrp路由器的。

在VRRP實體結構中,有多個實體的VRRP路由器,其中有一台稱為"master"即主節點路由器,其他的都是"backup"備節點路由器,誰是master誰是backup,這是通過他們的優先級來定義競選的。

在VRRP虛拟結構中,虛拟路由器是通過"MAC+VRID"的形式來辨別的,如"00-00-5E-00-01-{VRID}"。在VRRP虛拟結構中,不管是master還是backup,VRID必須一緻。它們對外都是相同的VIP,用戶端并不需要因為master的切換而修改自己的路由配置。

VRRP結構中路由器之間的通信是通過IP多點傳播的方式實作的(也可以配置為其它通信方式)。但是,隻有master節點才會發送VRRP廣告包(vrrp advertisement message)。當master節點宕掉的時候,backup中優先級最高的VRRP裝置會搶占并更新為master。

3.keepalived架構模型

Keepalived服務啟動的時候,将産生三個相關程序,一個父程序和兩個子程序。

PID 111 Keepalived

112 \_ Keepalived

113 \_ Keepalived

父程序負責fork和監控子程序,是以父程序也稱為WatchDog。兩個子程序都會開啟本地套接字Unix Domain Socket。當keepalived服務啟動後,父程序會通過unxi domain socket每隔5秒發送一個"Hello"消息給子程序,如果父程序無法發送消息給子程序,将認為子程序出現問題,于是會重新開機子程序。

下圖是keepalived設計架構圖:

java中keepalived開啟方式_高可用之KeepAlived(一):基本概念和配置檔案分析

其中:

Checkers元件:負責RealServer的健康狀況檢查,并在LVS的拓撲中移除、添加RealServer。它支援layer4/5/7層的協定檢查。該元件使用獨立的子程序負責,但被父程序監控。

VRRP元件:提供Director的故障轉移功能進而實作Director的高可用。該元件可獨立提供功能,無需LVS的支援。該元件使用獨立的子程序負責,但被父程序監控。

System Call元件:提供讀取自定義腳本的功能。該元件在使用時,将臨時産生一個子程序來執行任務。

IPVS wrapper元件:負責将配置檔案中IPVS相關規則發送到核心的ipvs子產品。

Netlink Reflector:用來設定、監控vrrp的vip位址。

4.安裝keepalived

使用keepalived,完全可以yum安裝。本文僅給出編譯安裝的方法,後文的所有配置都使用yum安裝的keepalived。

官方各版本源碼下載下傳位址:

yum -y install openssl-devel

tar xf keepalived-1.2.19.tar.gz

cd keepalived-1.2.19

./configure --prefix=/usr/local/keepalived-1.2.19

make && make install

其中./configure的·--with-kernel-dir·是在管理LVS時需要使用的,如果不用配合LVS,則可以不用此選項。

再做一下編譯安裝的規範行為。

ln -s /usr/local/keepalived-1.2.19 /usr/local/keepalived

echo "MANPATH /usr/local/keepalived/share/man" >>/etc/man.config

echo "export PATH=/usr/local/keepalived/sbin:$PATH" > /etc/profile.d/keepalived.sh

chmod +x /etc/profile.d/keepalived.sh

. /etc/profile.d/keepalived.sh

編譯安裝後,在安裝目錄下生成以下一些目錄,其中keepalived程式在sbin目錄下。

[[email protected] ~]# cd /usr/local/keepalived

[[email protected] keepalived]# ls

bin etc lib sbin share

在etc目錄下,有配置檔案、SysV管理腳本和大量配置檔案示例。

[[email protected] keepalived]# ls etc

keepalived rc.d sysconfig

[[email protected] keepalived]# ls etc/keepalived/

keepalived.conf samples

[[email protected] keepalived]# ls etc/rc.d/init.d/

keepalived

但需要注意的是,這裡提供的SysV服務管理腳本是錯誤的,原因是腳本中的keepalived指令路徑錯誤。是以修改該檔案。

#原文

start() {

echo -n $"Starting $prog: "

daemon keepalived ${KEEPALIVED_OPTIONS}

RETVAL=$?

echo

[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog

}

#修改後

start() {

echo -n $"Starting $prog: "

daemon /usr/local/keepalived/sbin/keepalived ${KEEPALIVED_OPTIONS}

RETVAL=$?

echo

[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog

}

5.配置keepalived的日志

預設keeepalived的日志會記錄到/var/log/messages中。可以配置keepalived使其記錄到其它檔案中。

先修改/etc/sysconfig/keepalived檔案,以下是原文内容。

# Options for keepalived. See `keepalived --help' output and keepalived(8) and

# keepalived.conf(5) man pages for a list of all options. Here are the most

# common ones :

#

# --vrrp -P Only run with VRRP subsystem.

# --check -C Only run with Health-checker subsystem.

# --dont-release-vrrp -V Dont remove VRRP VIPs & VROUTEs on daemon stop.

# --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.

# --dump-conf -d Dump the configuration data.

# --log-detail -D Detailed log messages.

# --log-facility -S 0-7 Set local syslog facility (default=LOG_DAEMON)

#

KEEPALIVED_OPTIONS="-D"

要配置獨立的日志,将其中的"KEEPALIVED_OPTIONS"改為如下:

KEEPALIVED_OPTIONS="-D -S 0"

上面配置使用local0這個裝置來記錄日志,是以去修改rsyslog的配置檔案/etc/rsyslog.conf,添加該裝置記錄日志的級别和路徑。

# Keepalived log config

local0.* /var/log/keepalived.log

再重新開機rsyslog。

service rsyslog restart

6.keepalived配置檔案詳解

配置檔案分為3部分:全局部分、VRRPd部分(即實作高可用部分)以及LVS虛拟服務部分(健康狀況檢查以及管理的叢集服務)。

選項很多,具體的意義可以man keepalived.conf。預設内容如下:

! Configuration File for keepalived

global_defs { #全局部分定義郵件報警系統,可以不用定義

notification_email { #定義郵件發送目标

[email protected]

[email protected]

[email protected]

}

notification_email_from [email protected] #定義郵件發送人

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id LVS_DEVEL #辨別keepalived伺服器的字元串,實作高可用時需要使用它辨別節點

# 全局部分關于靜态位址和靜态路由的配置,可以man keepalived.conf,不過幾乎不用配置這部分

}

#定義vrrp執行個體。一個配置檔案中可以實作多執行個體。但不同主機上互為masterbackup的執行個體名需相同

vrrp_instance VI_1 {

state MASTER #定義執行個體的角色狀态是master還是backup

interface eth0 #定義vrrp綁定的接口,即接收或發送心跳通告的接口,即HA監測接口

virtual_router_id 51 #虛拟路由辨別(VRID),同一執行個體該數值必須相同,即master和backup中該值相同

#同一網卡上的不同vrrp執行個體,該值必須不能相同。取值範圍0-255

priority 100 #該vrrp執行個體中本機的keepalived的優先級,優先級最高的為master。該選項的優先級

#高于state選項,即若state指定的是backup,但這裡設定的值最高,則仍為master。

advert_int 1 #心跳資訊發送和接收時間間隔,機關為秒

authentication { #認證方式,同一執行個體中這個配置必須完全一樣才可通過認證。隻建議使用PASS認證

auth_type PASS

auth_pass 1111 #最多支援8字元,超過8字元将隻取前8字元

}

virtual_ipaddress { #設定的VIP。隻有master節點才會設定。master出現故障後,VIP會故障轉移到backup。

#這些vip預設配置在interface指定的接口别名上,可使用dev選項來指定配置接口。

#使用ip add的方式添加。若要被ifconfig檢視,在IP位址後加上label即可。

#/ brd dev scope label

192.168.200.16 label eth0:1

192.168.200.17

192.168.200.18

192.168.200.19/24 dev eth1

}

}

#定義虛拟服務部分

virtual_server 192.168.200.100 443 { #虛拟服務位址和端口,使用空格分隔,其中位址為VIP

delay_loop 6 #健康檢查時間間隔

lb_algo rr #定義負載均衡LB的算法,這裡使用的是rr排程算法

lb_kind NAT #lvs的模型,有NAT/DR/TUN三種

nat_mask 255.255.255.0

persistence_timeout 50 #持久會話保持時長

protocol TCP #監控服務的協定類型,1.3.0版本之前隻支援tcp,之後還支援udp

real_server 192.168.201.100 443 { #定義real_server部分,位址和端口使用空格分隔

weight 1 #LVS權重

SSL_GET { #健康狀況檢查的檢查方式,常見的有HTTP_GET|SSL_GET|TCP_CHECK|MISC_CHECK。

url {

path / #指定ssl_get健康狀況檢查的路徑,例如檢查index.html是否正常

digest ff20ad2481f97b1754ef3e12ecd3a9cc

#健康狀況需要狀态碼,可以是status_code、digest或digest+status_code

#digest值用keepalived的genhash指令生成,一般使用status_code即可

status_code 200

}

url {

path /mrtg/

digest 9b3a0c85a887a256d6939da88aabd8cd

}

connect_timeout 3 #表示3秒無響應就逾時,即此realserver不健康,需重試連接配接

nb_get_retry 3 #表示重試3次,3次之後都逾時就是當機,防止誤傷(nb=number)

delay_before_retry 3 #重試的時間間隔

#上述配置需12秒才能判斷節點故障,時間太久,應改小

}

}

}

virtual_server 10.10.10.2 1358 {

delay_loop 6

lb_algo rr

lb_kind NAT

persistence_timeout 50

protocol TCP

sorry_server 192.168.200.200 1358 #定義當所有Real server都當機的時候,由哪台伺服器繼續提供服務

#一般在keepalived本機給定一個web頁面,提示網站正在維護的資訊

real_server 192.168.200.2 1358 {

weight 1

HTTP_GET {

url {

path /testurl/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

url {

path /testurl2/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

url {

path /testurl3/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

}

}

real_server 192.168.200.3 1358 {

weight 1

HTTP_GET {

url {

path /testurl/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334c

}

url {

path /testurl2/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334c

}

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

}

}

}

virtual_server 10.10.10.3 1358 {

delay_loop 3

lb_algo rr

lb_kind NAT

nat_mask 255.255.255.0

persistence_timeout 50

protocol TCP

real_server 192.168.200.4 1358 {

weight 1

HTTP_GET {

url {

path /testurl/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

url {

path /testurl2/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

url {

path /testurl3/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

}

}

real_server 192.168.200.5 1358 {

weight 1

HTTP_GET {

url {

path /testurl/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

url {

path /testurl2/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

url {

path /testurl3/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

}

}

}

關于配置檔案中的幾種時間間隔:

advert_int N1:vrrp主備之間發送和接收心跳資訊的時間間隔。和Checker元件無關。

delay_loop N2:是健康狀況檢查的時間間隔。每隔幾秒就檢查一次。

connect_timeout N3:連接配接RS的逾時時間,連接配接不上說明不健康,需要重試連接配接來判定RS是否故障。

nb_get_retry N4:一個節點不健康的判定重試次數。要重試N次,N次内都不健康說明節點故障了。

delay_before_retry N5:判定某節點不健康後過N秒再進行重試判定。

N2和N5的差別在于:當上一次健康檢查結果是正常的,将會隔N2秒再檢查。如果某次檢查不健康,即聯系不上RS,則每隔N5秒重試一次,直到N4次後才判定該RS已經故障。是以,最終需要N3+N4*N5才能判定一個節點的故障。

雖然健康檢查的失敗次數是可以指定的,但一般都會設定多于1次防止誤傷。另外,成功的檢查隻需一次即可。

keepalived支援4層、5層和7層的健康狀況檢查,按檢查類型又可分為TCP檢查(4層)、HTTP檢查(5層)、SSL_HTTP檢查(5層)以及自定義的MISC檢查(可實作7層)。其中:

TCP_CHECK:通過TCP連接配接來檢查後端RS是否健康。

HTTP_GET:通過擷取指定頁面來檢查後端RS是否健康。是否健康是根據是否比對digest、status_code來判斷的。

SSL_GET:和HTTP_GET一樣,隻不過使用的協定是HTTPS。

MISC_CHECK:通過加載自定義健康狀況檢查的腳本來檢查對象是否健康,要求這些腳本中健康與否的傳回值為0或1。

使用MISC_CHECK檢查時,方式如下:

MISC_CHECK {

misc_path /path_to_script/script.sh

(or misc_path “ /path_to_script/script.sh ”)

}