理論部分:linux
keepalived:爲lvs開發的(director: HA ipvs rules, health check),可以爲LVS生成規則,並檢測後部real server的健康狀態。主要是在兩個或多個節點上實現vrrp協議選舉機制。主節點稱爲Master,從節點稱爲Backup。它也能夠爲其它服務作高可用。nginx
vrrp 虛擬冗餘路由協議 (virtual redundent routing protocol),在兩臺或多臺設備上配置同一個虛擬IP地址和虛擬MAC地址,在實際工做時,這些設備根據某種法則選舉出一個主設備,當主設備故障時,其它設備會再根據某種法則選舉出另外一個主設備。這樣在一臺節點掛掉後,會有從節點設備頂上,就實現了路由設備的高可用。客戶端須要把網關配置成虛擬IP就能夠。web
Keepalived在配置好所的節點同時啓動時,全部節點都工做在從節點模式,這時都沒法響應請求,全部節點會根據事先定義的優先級來計算出那個節點是主節點。優先級從1到255間的數值,數據越大優先級越高。當選舉了主節點後,主節點才能夠響應用戶的請求。不過只有主節點才能夠響應用戶的請求。在選舉主節點的過程當中,若是你們的優先級同樣,就會根據各自的IP來比較,IP大的優先級高。選舉出主節點後,主節點會每隔必定的時間向其它備節點通告心跳信息,通告時會帶有優先級。從節點在收到通告後,會拿到通告中的優先級和本身的優先級作比較,一但發現本身的優先級比心跳信息中的優先級高,就會取而代之成爲主節點。當掛掉的主節點從新上線,這時是否會把主節點搶過來,就須要事先定義Keepalived是否爲搶佔模式preempt 搶佔模式和nopreempt 非搶佔模式。在虛擬IP切換時會有切換時間,切換過程當中會形成沒法響應客戶端的請求。由於一個虛擬IP同時只能讓一臺設備工做,從設備只能作備份,爲了讓從也備也分攤一部分流量能夠作多組虛擬IP。每一個設備都是主節點,全部節點間相互作備份。每組虛擬路由間用虛擬路由器標示(VRID)。VRID用數據標識,1到255之間的數字。後端
Keepalived軟件的組件centos
IPVS:用來和ipvs接×××互的工具,爲ipvs應用生成的規則。瀏覽器
NETLINK:經過NETLINK組件來配置網絡接口,和監控網絡接口。bash
IPVS wrapper:爲ipvs生成規則,並藉助Checkers監視後端的real server。服務器
Nnetlink Reflector:向其它節點發送通告信息網絡
VRRP Stack:Keepalived的VRRP實現app
Checkers:用來爲ipvs生成的規則中的各real server健康狀態檢測的。能夠基於tcp檢測,能夠根據應用層協議檢測。
WatchDog:用來檢測Keepalive各個工做組件的健康狀態。各個組件會每隔必定的時間向WatchDog通告下本身,若是長時間沒有收到通告,WatchDog會重啓這個沒有發送通告的組件。它存在的主要是用來實現不會由於Keepalived內部問題致使集羣不正常。
Keepalived 是一個輕量級調度器,適用場景:lvs , nginx代理,haproxy代理。
節點的狀態:
master 主節點狀態
backup 從狀態
Initialized 初始化狀態,keepalived服務剛啓動時的狀態。
-------------------------------------------------------------------------------------------
操做部分
-------------------------------------------------------------------------------------------
實驗拓撲圖
實驗環境:
1,4臺服務器操做系統爲centos6.5。
2,兩臺webserver爲httpd,使用yum安裝。而且測試能夠正常訪問web服務。
3,兩臺lvs節點keepalived使用yum安裝。
4,lvs使用dr模式工做。
5,客戶機是一臺win8。
6,每一個lvs節點定義sorry server爲本機。
實驗目標:
1,使用keepalived實現lvs的高可用,而且監測後端real server的健康狀態。
2,瞭解keepalived的工做原理和適用場景。
-------------------------------------------------------------------------------------------
配置大致過程:
1,爲兩臺web服務器安裝啓動httpd服務,並配置vip。
2,爲兩臺lvs服務器安裝並配置keepalived。
3,測試各個配置是否正常工做
4,爲兩臺keepalived配置狀態切換後的報警機制
-------------------------------------------------------------------------------------------
首先保證兩臺服務器web訪問正常,sorry server也能夠正常做。
爲兩臺web服務器分別配置vip,先定義linux內核對於arp協議的響應方式。
# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore # echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore # echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce # echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
配置虛擬ip,而且指定請求是那個Ip,響應時就使用那個ip響應。
# ifconfig lo:0 192.168.1.16 netmask 255.255.255.255 broadcast 192.168.1.16 # ifconfig lo:1 192.168.1.18 netmask 255.255.255.255 broadcast 192.168.1.18 # route add -host 192.168.1.16 dev lo:0 # route add -host 192.168.1.18 dev lo:1
注意: 爲了重啓後配置生效,須要把這些寫到配置文件中。或都寫一個腳本,開機自動設定配置信息也可。
爲兩臺lvs服務器分別安裝keepalived,而且編輯配置文件。
# yum -y install keepalived
第一個lvs的主配置文件內容以下。
! Configuration File for keepalived global_defs { notification_email { admin@wukui.com } notification_email_from lvsadmin@wukui.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DIRECTOR } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 1 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.16/24 } } virtual_server 192.168.1.16 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP sorry_server 127.0.0.1 80 net_mask 255.255.255.0 real_server 172.16.2.10 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 1 } } real_server 172.16.2.17 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 1 } } } vrrp_instance VI_2 { state MASTER interface eth0 virtual_router_id 2 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.18/24 } } virtual_server 192.168.1.18 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 1 protocol TCP sorry_server 127.0.0.1 80 net_mask 255.255.255.0 real_server 172.16.2.10 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 1 } } real_server 172.16.2.17 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 1 } } }
第二個lvs節點配置內容以下
! Configuration File for keepalived global_defs { notification_email { admin@wukui.com } notification_email_from lvsadmin@wukui.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DIRECTOR } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 1 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.16/24 } } virtual_server 192.168.1.16 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP sorry_server 127.0.0.1 80 net_mask 255.255.255.0 real_server 172.16.2.10 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 1 } } real_server 172.16.2.17 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 1 } } } vrrp_instance VI_2 { state BACKUP interface eth0 virtual_router_id 2 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.18/24 } } virtual_server 192.168.1.18 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 1 protocol TCP sorry_server 127.0.0.1 80 net_mask 255.255.255.0 real_server 172.16.2.10 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 1 } } real_server 172.16.2.17 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 1 } } }
LVS兩臺節點配置好Keepalived後分別啓動。啓動命令:
# service keepalived start
注:keepalived啓動後的詳細工做日誌都記錄在/var/log/messages中。可使用tail -f /var/log/messages 監視。
keepalived啓動後開啓作相應的測試工做:
1,關閉其中一臺keepalived服務,到另外一臺節點上查看是否把資源轉移到了本機上。查看方法:
使用:ip addr show 命令來查看vip是否配置在本地,或查看日誌的詳細記錄
2,在客戶端瀏覽器分別訪問 192.168.1.16 和 192.168.1.18 ,肯定能夠訪問到。按上面的配置,lvs負載均衡有持久會話,因此大概在一分鐘之內同一個客戶端會一直打開一個real server的頁面。
3,把後端全部real server 服務器的httpd進程關閉,而後再訪問vip,測試 sorry server是否能夠正常工做。
在上面的配置中尚未加入keepalived主從切換或都出現錯誤的報警通知。須要再兩臺節點的主配置文件中每一個實例中加入如下配置。這個配置根據實際狀況是否須要來配置。不少狀況下,監控軟件定義發送郵件報警級別設置不當,致使咱們運維人員收到的郵件過多,看不過來還不如不報警呢!下面爲示例:
vrrp_instance VI_2 { state MASTER interface eth0 virtual_router_id 2 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.18/24 } notify_master "/bin/echo '節點1狀態切換到master' | mail -s '節點1狀態切換' root@localhost" notify_backup "/bin/echo '節點1狀態切換到backup' | mail -s '節點1狀態切換' root@localhost" notify_fault "/bin/echo '節點1狀態切換到fault' | mail -s '節點1狀態切換'root@localhost" }
測試,在命令行中使用mail命令查看郵件是否收到。這裏只是發給本機。
根據節點狀態切換能夠觸發某一個操做,就能夠定義本身的腳原本完成不少任務,想向空間無限大!!!