內容php
一、vrrp協議簡介node
二、keepalived的工做架構以及工做原理linux
三、keepalived的安裝使用詳解web
1、vrrp協議簡介算法
VRRP(Virtual Router Redundancy Protocol)協議是用於實現路由器冗餘的協議。shell
VRRP協議將兩臺或多臺路由器設備虛擬成一個設備,對外提供虛擬路由器IP(一個或多個),而在路由器組內部,若是實際擁有這個對外IP的路由器若是工做正常的話就是MASTER,或者是經過算法選舉產生,MASTER實現針對虛擬路由器IP的各類網絡功能,如ARP請求,ICMP,以及數據的轉發等;其餘設備不擁有該IP,狀態是BACKUP,除了接收MASTER的VRRP狀態通告信息外,不執行對外的網絡功能。當主機失效時,BACKUP將接管原先MASTER的網絡功能。後端
配置VRRP協議時須要配置每一個路由器的虛擬路由器ID(VRID)和優先權值,使用VRID將路由器進行分組,具備相同VRID值的路由器爲同一個組,VRID是一個0~255的正整數;同一組中的路由器經過使用優先權值來選舉MASTER,優先權大者爲MASTER,優先權也是一個0~255的正整數。centos
VRRP協議使用多播數據來傳輸VRRP數據,VRRP數據使用特殊的虛擬源MAC地址發送數據而不是自身網卡的MAC地址,VRRP運行時只有MASTER路由器定時發送VRRP通告信息,表示MASTER工做正常以及虛擬路由器IP(組),BACKUP只接收VRRP數據,不發送數據,若是必定時間內沒有接收到MASTER的通告信息,各BACKUP將宣告本身成爲MASTER,發送通告信息,從新進行MASTER選舉狀態。bash
VRRP的工做過程爲:服務器
(1) 虛擬路由器中的路由器根據優先級選舉出Master。Master 路由器經過發送免費ARP 報文,將本身的虛擬MAC 地址通知給與它鏈接的設備或者主機,從而承擔報文轉發任務;
(2) Master 路由器週期性發送VRRP 報文,以公佈其配置信息(優先級等)和工做情況;
(3) 若是Master 路由器出現故障,虛擬路由器中的Backup 路由器將根據優先級從新選舉新的Master;
(4) 虛擬路由器狀態切換時,Master 路由器由一臺設備切換爲另一臺設備,新的Master 路由器只是簡單地發送一個攜帶虛擬路由器的MAC 地址和虛擬IP地址信息的免費ARP 報文,這樣就能夠更新與它鏈接的主機或設備中的ARP 相關信息。網絡中的主機感知不到Master 路由器已經切換爲另一臺設備。
(5) Backup 路由器的優先級高於Master 路由器時,由Backup 路由器的工做方式(搶佔方式和非搶佔方式)決定是否從新選舉Master。
2、keepalived簡介
一、上面介紹了VRRP,而keepalived是什麼呢,說白了keepalived就是實現VRRP協議的軟件。它能夠檢測web服務器的工做狀態,若是該服務器出現故障被檢測到,將其剔除服務器羣中,直至正常工做後,keepalive會自動檢測到並加入到服務器羣裏面。實現主備服務器發生故障時ip瞬時無縫交接。它是LVS集羣節點健康檢測的一個用戶空間守護進程,也是LVS的引導故障轉移模塊(director failover)。Keepalived守護進程能夠檢查LVS池的狀態。若是LVS服務器池當中的某一個服務器宕機了。keepalived會經過一 個setsockopt呼叫通知內核將這個節點從LVS拓撲圖中移除。
二、keepalived的架構:
keepalived也是模塊化設計,不一樣模塊複雜不一樣的功能,其組件包括:
core:是keepalived的核心,複雜主進程的啓動和維護,全局配置文件的加載解析等
check:負責healthchecker(健康檢查),包括了各類健康檢查方式,以及對應的配置的解析包括LVS的配置解析
vrrp:VRRPD子進程,VRRPD子進程就是來實現VRRP協議的
libipfwc:iptables(ipchains)庫,配置LVS會用到
libipvs*:配置LVS會用到
由圖可知,兩個子進程都被系統WatchDog看管,兩個子進程各自複雜本身的事,checker子進程複雜檢查各自服務器的健康程度,例如HTTP,LVS等等,若是checker子進程檢查到MASTER上服務不可用了,就會通知本機上的兄弟VRRP子進程,讓他刪除通告,而且去掉虛擬IP,轉換爲BACKUP狀態,而且會自動在ipvs內核添加相應的集羣調度規則,因此說keepalived與lvs是天生搭配的。
3、keepalived的安裝以及配置
在centos6.4之前的系統其安裝程序在epel源,6.4之後已被收入base源,因此咱們能夠直接使用yum來進行安裝。
查看keepalived的信息
[root@localhost ~]# yum info keepalived Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile base | 4.0 kB 00:00 ... Available Packages Name : keepalived Arch : x86_64 Version : 1.2.13 Release : 5.el6_6 Size : 214 k Repo : base Summary : Load balancer and high availability service URL : http://www.keepalived.org/ License : GPLv2+ Description : Keepalived provides simple and robust facilities for load balancing : and high availability. The load balancing framework relies on the : well-known and widely used Linux Virtual Server (IPVS) kernel module : providing layer-4 (transport layer) load balancing. Keepalived : implements a set of checkers to dynamically and adaptively maintain : and manage a load balanced server pool according their health. : Keepalived also implements the Virtual Router Redundancy Protocol : (VRRPv2) to achieve high availability with director failover.
安裝完成後,其主要的配置文件
程序環境:
配置文件:/etc/keepalived/keepalived.conf
主程序:/usr/sbin/keepalived
其中keepalivd的配置文件是keepalived.conf,其能夠分爲三個部分:
全局配置(Global Configuration)
VRRP配置
LVS配置
一、全局定義(global definition)配置範例:
! Configuration File for keepalived #註釋內容 global_defs { #表示keepalived在發生諸如切換操做時須要發送email通知,以及email發送給哪些郵件地址,郵件地址能夠多個,每行一個 notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc #表示發送通知郵件時郵件源地址是誰 smtp_server 192.168.200.1 #表示發送email時使用的smtp服務器地址 smtp_connect_timeout 30 #鏈接smtp鏈接超時時間 router_id LVS_DEVEL #機器標識,至關於主機名 }
二、VRRP配置實例:
vrrp_instance VI_1 { #VI_1表示這個VRRP的虛擬路由器的名字 state MASTER #狀態值 interface eth0 #監聽的端口 virtual_router_id 51 #VRID,這個必須與備節點是同樣 priority 100 #優先級 advert_int 1 #檢測間隔 authentication { #認證 auth_type PASS #賬號 auth_pass 1111 #密碼 } virtual_ipaddress { #須要虛擬的IP地址,能夠是多個 192.168.200.16 192.168.200.17 192.168.200.18 } }
三、lvs配置實例說明:
virtual_server 192.168.200.100 80 { # 設置VIP的IP和端口信息 delay_loop 6 #檢測間隔時間 lb_algo rr #調度算法 lb_kind NAT #lvs類型 nat_mask 255.255.255.0 #NAT類型的網關掩碼,其餘類型不須要此項 persistence_timeout 50 #持久鏈接時間 protocol TCP #TCP協議 real_server 192.168.201.100 80 { #RIP的IP和端口 weight 1 #權重 url { path /mrtg/ #健康檢查,這裏是對web服務的檢測,有兩種方法,一種是指定頁面的hash值。一個是頁面的狀態碼,這裏是hash值 digest 9b3a0c85a887a256d6939da88aabd8cd #hash值 } connect_timeout 3 #失敗時鏈接的時間 nb_get_retry 3 #失敗時檢測的次數 delay_before_retry 3 #每次失敗等多少秒再進行檢查 } } }
其實配置就是這麼簡單,下面來實驗來測試驗證效果,在配置HA Cluster時須要注意的事項:
(1)各主機之間的時間必須一致
(2)確保集羣服務不受iptables和selinux的影響
(3)各節點之間可經過
一、單實例(沒用啓用LVS)
(1)設置配置(master主機):
[root@localhost keepalived]# cat keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id test1 vrrp_mcast_group4 224.0.24.122 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 23 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 12345 } virtual_ipaddress { 192.168.200.16/24 dev eth0 label eth0:1 } }
(2)同時把該配置文件拷貝至BACKUP的主機上,可是要修改三個地方:router_id,state,priority
BACKUP主機的配置:
[root@php ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id test2 vrrp_mcast_group4 224.0.24.122 } vrrp_instance VI_1 { state BACKUP interface eth1 virtual_router_id 23 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 12345 } virtual_ipaddress { 192.168.200.16/24 dev eth1 label eth1:1 } }
(3)啓動主機服務,IP已經設置在MASTER上,同時查看日誌信息,能夠清晰的看到MASTER在不斷髮送免費arp報文
[root@localhost keepalived]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:DA:A5:4C inet addr:10.1.252.36 Bcast:10.1.255.255 Mask:255.255.0.0 inet6 addr: fe80::20c:29ff:feda:a54c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:18767 errors:0 dropped:0 overruns:0 frame:0 TX packets:1302 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1646398 (1.5 MiB) TX bytes:184756 (180.4 KiB) eth0:1 Link encap:Ethernet HWaddr 00:0C:29:DA:A5:4C inet addr:192.168.200.16 Bcast:0.0.0.0 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:2 errors:0 dropped:0 overruns:0 frame:0 TX packets:2 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:202 (202.0 b) TX bytes:202 (202.0 b) [root@localhost keepalived]# tail /var/log/messages Oct 31 19:43:16 localhost Keepalived_healthcheckers[2629]: Opening file '/etc/keepalived/keepalived.conf'. Oct 31 19:43:16 localhost Keepalived_healthcheckers[2629]: Configuration is using : 7453 Bytes Oct 31 19:43:16 localhost Keepalived_healthcheckers[2629]: Using LinkWatch kernel netlink reflector... Oct 31 19:43:16 localhost Keepalived_vrrp[2630]: VRRP_Instance(VI_1) Transition to MASTER STATE Oct 31 19:43:16 localhost Keepalived_vrrp[2630]: VRRP_Instance(VI_1) Received lower prio advert, forcing new election Oct 31 19:43:17 localhost Keepalived_vrrp[2630]: VRRP_Instance(VI_1) Entering MASTER STATE Oct 31 19:43:17 localhost Keepalived_vrrp[2630]: VRRP_Instance(VI_1) setting protocol VIPs. Oct 31 19:43:17 localhost Keepalived_vrrp[2630]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.200.16 Oct 31 19:43:17 localhost Keepalived_healthcheckers[2629]: Netlink reflector reports IP 192.168.200.16 added Oct 31 19:43:22 localhost Keepalived_vrrp[2630]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.200.16
(4)停掉MATER主機keepalived服務,查看BACKUP主機,IP已經接管,說明keepalived已經正常工做了:
MATER:
[root@localhost keepalived]# service keepalived stop Stopping keepalived: [ OK ] BACKUP: [root@php ~]# ifconfig eth1 Link encap:Ethernet HWaddr 00:0C:29:DE:83:7F inet addr:10.1.249.30 Bcast:10.1.255.255 Mask:255.255.0.0 inet6 addr: fe80::20c:29ff:fede:837f/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:19877 errors:0 dropped:0 overruns:0 frame:0 TX packets:1140 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1743327 (1.6 MiB) TX bytes:150564 (147.0 KiB) eth1:1 Link encap:Ethernet HWaddr 00:0C:29:DE:83:7F inet addr:192.168.200.16 Bcast:0.0.0.0 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:4 errors:0 dropped:0 overruns:0 frame:0 TX packets:4 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:252 (252.0 b) TX bytes:252 (252.0 b) [root@php ~]# !tai tail /var/log/messages Nov 1 03:43:15 php Keepalived_vrrp[2530]: VRRP_Instance(VI_1) Received higher prio advert Nov 1 03:43:15 php Keepalived_vrrp[2530]: VRRP_Instance(VI_1) Entering BACKUP STATE Nov 1 03:43:15 php Keepalived_vrrp[2530]: VRRP_Instance(VI_1) removing protocol VIPs. Nov 1 03:43:15 php Keepalived_healthcheckers[2529]: Netlink reflector reports IP 192.168.200.16 removed Nov 1 03:47:15 php Keepalived_vrrp[2530]: VRRP_Instance(VI_1) Transition to MASTER STATE Nov 1 03:47:16 php Keepalived_vrrp[2530]: VRRP_Instance(VI_1) Entering MASTER STATE Nov 1 03:47:16 php Keepalived_vrrp[2530]: VRRP_Instance(VI_1) setting protocol VIPs. Nov 1 03:47:16 php Keepalived_vrrp[2530]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 192.168.200.16 Nov 1 03:47:16 php Keepalived_healthcheckers[2529]: Netlink reflector reports IP 192.168.200.16 added Nov 1 03:47:21 php Keepalived_vrrp[2530]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 192.168.200.16
(5)單實例的配置就是這麼簡單的實現了,固然也能夠不一樣主配置的郵件通知功能,而是使用自定義的郵件通知的shell腳本
在instance中添加自定義的郵件通知的shell腳本路徑實例:
vrrp_instance VI_1 { state BACKUP interface eth1 virtual_router_id 23 priority 90 advert_int 1 notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" authentication { auth_type PASS auth_pass 12345 } virtual_ipaddress { 192.168.200.16/24 dev eth1 label eth1:1 } } notify.sh腳本內容以下: #!/bin/bash # contact='root@localhost' notify() { mailsubject="$(hostname) to be $1, vip floating" mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1" echo "$mailbody" | mail -s "$mailsubject" $contact } case $1 in master) notify master ;; backup) notify backup ;; fault) notify fault ;; *) echo "Usage: $(basename $0) {master|backup|fault}" exit 1 ;; esac
雙實例或多實例的配置過程大同小異,這裏就再也不進行演示
(6)咱們知道lvs不支持都後端的調度主機進行狀態檢查,而keepalived彌補了這個缺陷,而且還支持傳輸層和應用層的檢測:
real_server <IPADDR> <PORT> { weight <INT> notify_up <STRING>|<QUOTED-STRING> notify_down <STRING>|<QUOTED-STRING> HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }:定義當前主機的健康狀態檢測方法; } HTTP_GET|SSL_GET { url { path <URL_PATH>:定義要監控的URL; status_code <INT>:判斷上述檢測機制爲健康狀態的響應碼; digest <STRING>:判斷上述檢測機制爲健康狀態的響應的內容的校驗碼; } nb_get_retry <INT>:重試次數; delay_before_retry <INT>:重試以前的延遲時長; connect_ip <IP ADDRESS>:向當前RS的哪一個IP地址發起健康狀態檢測請求 connect_port <PORT>:向當前RS的哪一個PORT發起健康狀態檢測請求 bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址; bind_port <PORT>:發出健康狀態檢測請求時使用的源端口; connect_timeout <INTEGER>:鏈接請求的超時時長; } TCP_CHECK { connect_ip <IP ADDRESS>:向當前RS的哪一個IP地址發起健康狀態檢測請求 connect_port <PORT>:向當前RS的哪一個PORT發起健康狀態檢測請求 bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址; bind_port <PORT>:發出健康狀態檢測請求時使用的源端口; connect_timeout <INTEGER>:鏈接請求的超時時長; }
(7)此外keepalived還支持調用外部分輔助腳本,完成資源監控,並根據監控的結果狀態來實現優先動態調整;
用法:
vrrp_script:定義一個資源監控腳本;
vrrp_script <STRING> {
script ""
interval INT
weight -INT
}
track_script:調用定義的資源監控腳本;
track_script {
SCRIPT_NAME
}
示例:
! 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 node1 vrrp_mcast_group4 224.0.100.18 } vrrp_script chk_down { #若是/etc/keepalived/down文件存在,優先級-5 script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 weight -5 } vrrp_script chk_httpd {#若是httpd服務進程失效,優先級-5 script "killall -0 httpd && exit 0 || exit 1" interval 1 weight -5 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 57 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 98181111 } virtual_ipaddress { 172.16.100.71/32 dev eno16777736 } track_script { #調用腳本 chk_down chk_httpd } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
好了,keepalived的基本用法就介紹到這裏,更多內容請關注 個人博客。