高可用實現KeepAlived原理簡介

1、簡介

    目前主流實現web網站及數據庫服務高可用軟件包括:keepalived、heartbeat、corosync,cman;高可用簡稱HA;html

    官方站點:https://www.keepalived.org/mysql

  一、keepalived主要功能web

    對RealServer進行健康狀態檢查,支持3層、4層、7層協議進行健康檢查;並支持VRRP冗餘協議因此keepalived兩個功能是監控檢查,VRRP冗餘協議;算法

  二、keepalived的做用sql

    檢查web服務器的狀態,若是有一臺web服務器/mysql服務器宕機或故障,keepalived將故障節點從系統中剔除,當故障恢復的時候自動加入服務器集羣中,很是智能化,只須要手動修復壞的節點便可。數據庫

  三、keepalived的layer三、四、7層分別是IP層、傳輸層、應用層的實現原理以下:vim

    1)、layer3:keepalived按期向集羣中服務器發送ICMP的包,若是發現哪臺ping不通,便報告這臺服務器失效,並將其剔除集羣;(判斷標準爲IP是否有效)服務器

    2)、layer4:主要以TCP端口(也能夠是udp)狀態來決定服務器工做是否正常,如web服務器的80端口若是沒有工做,則將其剔除集羣(判斷標準爲端口)網絡

    3)、layer7:應用層,keepalived將根據用戶的設定,檢查服務器程序的運行是否正常,若是不是設定值,則將其剔除集羣(判斷標準爲程序是否正常)架構

2、keepalived VRRP原理

  一、學習keepalived,必須瞭解VRRP協議的原理,由於keepalived是VRRP的完美實現,那什麼是VRRP那?VRRP(虛擬路由冗餘協議)最先是爲了解決網關的點單故障的路由協議,在主機上如何選定到達目的的下一跳路由,這個問題一般解決方案是,動態路由協議RIP,OSPF;再有就是靜態路由協議,主機中實現動態路由協議很是不實際,管理,開銷,維護等諸多問題,所以一般是配置靜態路由協議,可是路由器或網管就常常出現單點,VRRP就是解決此靜態路由單點問題VRRP經過競選協議來動態交給LAN中的虛擬路由器中的某臺VRRP路由器。

  二、VRRP虛擬路由器集羣中,由多臺物理機組成,可是並非同時工做,而是由master負載路由工做,其餘都是backup,master也不是一成不變,VRRP會讓每一個VRRP路由參與競選最終優先的就是master

  三、master的特權是擁有虛擬路由器的IP地址,即VIP,負責轉發給網關地址的包和響應ARP請求。

  四、VRRP經過競選來實現虛擬路由器的功能,全部協議報文都是經過IP多播包(多播地址224.0.0.18)發送的,虛擬路由器有VRID(0~255)和一組IP地址組成,對外表現爲一個mac地址,因此一組虛擬路由器集羣中,無論誰是master,對外都是一個相同mac和VIP,客戶端沒有感知。

  五、master的VRRP路由器會一直髮送VRRP廣播包,backup不會搶佔master,除非優先級(priority)更高,當master不可用時(backup收不到廣播包),多臺backup中優先級最高的這臺會搶佔master,搶佔是很是快速的,而且VRRP包還使用了加密協議進行傳輸。

  六、keepalived基於VRRP將兩臺主機當作路由器,組成虛擬路由器集羣,master高的主機產生VIP,該VIP負責轉發用戶發起的IP包或請求

3、keepalive架構模型

  一個父進程兩個子進程

    爲了確保健壯及穩定性,守護進程被分爲3個不一樣的進程,父進程負責fork和監控子進程,所以父進程也稱爲watchdog,涼餓子進程,一個負責VRRP,另外一個負責健康檢查,每一個進程都有本身的I/O多路複用器,這樣能夠優化VRRP調度抖動,由於VRRP比健康檢查更重要,兩個子進程開啓本地套接字Unix Domain Socket,當keepalive啓動後,父進程經過unix domain socket每隔5s發送一個hello消息給子進程,若是父進程沒法發送消息給子進程,將認爲子進程出現問題,因而重啓子進程。watchdog這種設計的兩個好處是,第一父進程發送給遠程子進程的hello數據包是經過I/O多路複用程序完成的,這樣他就能夠在子調度框架中檢測死循環,第二是使用sysV信號檢測dead children。

  架構圖:

 

 

    解釋:

      userspace  用戶空間

      kernelspace 內核空間

      checker組件:負責RS健康狀態檢查,並在LVS拓撲中移除、添加,支持layer3/4/7的協議檢查,該組件使用獨立的子進程負責,但被父進程監控。這個組件就是實現健康檢查(TCP\HTTP\SSL\MISC......)

      VRRP stack:提供director的故障轉移功能從而實現director的高可用,該組件可獨立提供功能,無需LVS支持,也是獨立的子進程負責,父進程監控,vrrp stact就是vrrp的實現,好比vrrp協議調用。

      system call組件:提供抓取自定義腳本的功能,該組件在使用時,將臨時產生一個子進程來執行任務,支持系統調用機制,作出管理操做。

      IPVS wrapper組件:負責將配置文件中IPVS相關規則發送到內核的IPVS模塊,就是生產ipvs規則的。

      netlink reflector:用來設定,監控vrrp的vip地址,負責交互,VRRP藉助於netlink健康網絡,實現網絡功能配置。

      schedule-I/O Multiplexer:併發控制。

      memory mngt:內存管理。

      control plane configuration file parser:配置文件,分析的主控工具。

      watch dog:能夠理解爲高可用監視器。

4、keepalived配置文件

  vim /etc/keepalived/keepalived.conf 

 2 ! Configuration File for keepalived  3 
 4 global_defs {          #全局部分定義郵件報警系統  5  notification_email {    #定義郵件發送目標  6  acassen@firewall.loc  7  failover@firewall.loc  8  sysadmin@firewall.loc  9  }  10  notification_email_from Alexandre.Cassen@firewall.loc  #定義郵件發送人  11    smtp_server 192.168.200.1                   #指定smtp服務器地址
 12    smtp_connect_timeout 30                    #指定smtp鏈接超時時間
 13  router_id LVS_DEVEL                       #表示keepalived服務器的字符串,局域網內是惟一的高可用須要使用它標識節點  14  vrrp_skip_check_adv_addr                   #默認是不跳過檢查,檢查收到的VRRP經過中的全部地址可能會比較耗時,設置此命令的意思是,若是通告於接收的上一個經過來自相同的master路由器,則不執行檢查,也就是跳過檢查 15  vrrp_strict                           #嚴格嬦VRRP協議,阻止keepalived啓動有幾種狀況,1沒有vip,2單播鄰居,3在VRRP版本2中有ipv6地址  16    vrrp_garp_interval 0                      #在一個接口發送的兩個arp之間的延遲,能夠是毫米級
 17    vrrp_gna_interval 0
 18 }  19#定義VRRP實例,一個配置文件能夠有多例,不一樣主機之間互爲主備,實例名稱應該一致。
 20 vrrp_instance VI_1 {              21  state MASTER         #定義角色狀態,是master/backup                       22  interface eth0        #定義網卡  23     virtual_router_id 51     #定義虛擬路由標識VRID,主備應該相同
 24     priority 100          #定義優先級
 25     advert_int 1          #心跳時間1s
 26  authentication {        #認證方式一個實例中必須徹底一致  27  auth_type PASS        28         auth_pass 1111 #最多8個字符
 29  }  30  virtual_ipaddress {      #設置VIP,主備相同,可使用dev選項來指定接口,若是須要ifconfig查看,須要在ip地址後加上label,能夠是多個VIP  31         192.168.200.16
 32         192.168.200.17
 33         192.168.200.18
 34  }  35 }  36 #定義虛擬服務部分
 37 virtual_server 192.168.200.100 443 { #虛擬服務器地址和端口空格隔開地址爲VIP  38     delay_loop 6               #健康檢查間隔
 39  lb_algo rr                #定義負載均衡算法,這裏是rr  40  lb_kind NAT               #定義lvs模型  41     persistence_timeout 50        #持久會話保持時長
 42  protocol TCP              #監控服務的協議類型  43 
 44     real_server 192.168.201.100 443 {    #定義rs部分,地址端口  45         weight 1                #lvs權重
 46  SSL_GET {               #監控檢查的方式,常見的有HTTP_GET/SSL_GET/TCP_CHECK/MISC_CHECK  47  url {                  48               path /             #指定ssl——get健康檢查路徑
 49  digest ff20ad2481f97b1754ef3e12ecd3a9cc  50  }                 #健康狀態須要狀態碼,能夠是status_code,digest,digest+status_code  51  url {              #digest值用keepalived的genhash命令生產,通常使用status_code  52               path /mrtg/
 53  digest 9b3a0c85a887a256d6939da88aabd8cd  54  }  55             connect_timeout 3      #3s五響應就超時,就判斷爲realserver不健康,須要從新鏈接
 56             nb_get_retry 3        #標識重試3次,防誤傷
 57             delay_before_retry 3    #重試間隔3s
 58  }                  #總共12s才能判斷故障節點,能夠改小點  59  }  60 }  61 
 62 virtual_server 10.10.10.2 1358 {      #定義全部rs宕機時,有哪臺服務器提供服務  63     delay_loop 6                #通常在keepalived給一個web頁面,提示維護等。
 64  lb_algo rr  65  lb_kind NAT  66     persistence_timeout 50
 67  protocol TCP  68 
 69     sorry_server 192.168.200.200 1358
 70 
 71     real_server 192.168.200.2 1358 {  72         weight 1
 73  HTTP_GET {  74  url {  75               path /testurl/test.jsp  76  digest 640205b7b0fc66c1ea91c463fac6334d  77  }  78  url {  79               path /testurl2/test.jsp  80  digest 640205b7b0fc66c1ea91c463fac6334d  81  }  82  url {  83               path /testurl3/test.jsp  84  digest 640205b7b0fc66c1ea91c463fac6334d  85  }  86             connect_timeout 3
 87             nb_get_retry 3
 88             delay_before_retry 3
 89  }  90  }  91 
 92     real_server 192.168.200.3 1358 {  93         weight 1
 94  HTTP_GET {  95  url {  96               path /testurl/test.jsp  97  digest 640205b7b0fc66c1ea91c463fac6334c  98  }  99  url { 100               path /testurl2/test.jsp 101  digest 640205b7b0fc66c1ea91c463fac6334c 102  } 103             connect_timeout 3
104             nb_get_retry 3
105             delay_before_retry 3
106  } 107  } 108 } 109 
110 virtual_server 10.10.10.3 1358 { 111     delay_loop 3
112  lb_algo rr 113  lb_kind NAT 114     persistence_timeout 50
115  protocol TCP 116 
117     real_server 192.168.200.4 1358 { 118         weight 1
119  HTTP_GET { 120  url { 121               path /testurl/test.jsp 122  digest 640205b7b0fc66c1ea91c463fac6334d 123  } 124  url { 125               path /testurl2/test.jsp 126  digest 640205b7b0fc66c1ea91c463fac6334d 127  } 128  url { 129               path /testurl3/test.jsp 130  digest 640205b7b0fc66c1ea91c463fac6334d 131  } 132             connect_timeout 3
133             nb_get_retry 3
134             delay_before_retry 3
135  } 136  } 137 
138     real_server 192.168.200.5 1358 { 139         weight 1
140  HTTP_GET { 141  url { 142               path /testurl/test.jsp 143  digest 640205b7b0fc66c1ea91c463fac6334d 144  } 145  url { 146               path /testurl2/test.jsp 147  digest 640205b7b0fc66c1ea91c463fac6334d 148  } 149  url { 150               path /testurl3/test.jsp 151  digest 640205b7b0fc66c1ea91c463fac6334d 152  } 153             connect_timeout 3
154             nb_get_retry 3
155             delay_before_retry 3
156  } 157  } 158 }

 

     

 

轉載請註明出處:http://www.javashuo.com/article/p-zdyuqhoh-hp.html 

相關文章
相關標籤/搜索