keepalived基礎知識及高可用LVS模型實現

目錄

 一、keepalived簡單介紹

 二、VRRP協議與工作原理

 三、keepalived詳細介紹

 四、單、多實例及LVS-nat/dr模型實現

 五、總結

------------------------------------------------------------------------------------------

一、keepalived簡單介紹

   keepalived是由c語言編寫的一個路徑選擇軟件,是IPVS的一個擴展性項目,爲IPVS提供高可用性(故障轉移)特性,它的高可用性是通過VRRP協議實現的,並實現了對負載均衡服務器池中的real server進行健康狀態檢測,當real server不可用時,自身實現了故障的隔離,這彌補了IPVS不能對real server服務器進行健康檢測的不足,這也是keepalived運用最廣泛的場景,當然keepalived不只限於實現IPVS的高可用。

 

keepalived軟件架構

cf20f3a389e82d76d7de6a65a36a8575.jpg

  下部分是內核空間,有IPVSNETLINK兩個部分組成,IPVS提供IP虛擬網絡,而NETLINK提供高級的路由功能和其他相關的網絡功能。上部分是用戶空間,由這些組件來完成具體的功能,在覈心組件中:

  1)WatchDog:實現對healthcheckingVRRP進程的監控,如果子進程非法停止,父進程會重啓子進程。

  2)Checkers 負責real server healthchecking,是 keepalived 最主要的功能,它實時對real server進行測試,判斷其是否存活後實現對lvs規則的添加或刪除。可利用OSI模型中的第四、五、七層來進行測試。healthchecking進程由父進程監控一個獨立的進程運行。

  3)VRRP Stack 負責負載均衡器之間的失敗切換( FailOver),由父進程監控一個獨立的進程運行。

  4)IPVS wrapper 用來發送設定的規則到內核 ipvs 代碼。

  5Netlink Reflector 用來設定 vrrp vip 地址等。

 

二、 VRRP協議與工作原理

 keepalived

   vrrp協議:Virtual Redundant Router/RoutingProtocol,虛擬冗餘路由()協議;

 

2.1 技術術語:

 虛擬路由器:虛擬路由器接口;

 VRID:虛擬路由器標識符,描述路由器的分組;確定該分組的虛擬Mac地址;範圍0-255

 MASTER:虛擬IP地址的擁有者,能夠完成數據轉發功能的路由器;

 BACKUP:不參與數據轉發,檢測MASTER的健康狀態;

 VIP:虛擬IP地址,虛擬路由器的IP地址;用於VIP的就是MASTER

 VMAC00-00-5E-00-01-{VRID}

 優先級:選舉稱爲MASTER的主要參考標準,取值範圍是0-255

   0:放棄MASTER選舉;

   255:虛擬IP地址擁有者的優先級;

   1-254:越大越有可能稱爲MASTER

 搶佔式:如果MASTER狀態爲down,則BACKUP中會重新選舉新的MASTER;此時如果原來MASTER恢復,就立即發起新的選舉,稱爲MASTER

 非搶佔式:如果MASTER狀態爲down,則BACKUP中會重新選舉新的MASTER;此時如果原來MASTER恢復,就自動稱爲BACKUP,直到MASTER狀態爲down,重新選舉時纔會成爲新的MASTER

 

2.2 VRRP的工作模式:

  單實例:MASTER/BACKUP

  多實例:MASTER/BACKUPMASTER/MASTER

 

2.3工作原理

  在現實的網絡環境中,主機之間的通信都是通過配置靜態路由(默認網關)完成的,而主機之間的路由器一旦出現故障,通信就會失敗,因此,在這種通信模式中,路由器就成了一個單點瓶頸,爲了解決這個問題,就引入了VRRP協議。

  熟悉網絡的讀者對VRRP協議應該並不陌生。它是一種主備模式的協議,通過VRRP可以在網絡發生故障時透明地進行設備切換而不影響主機間的數據通信,這其中涉及兩個概念:物理路由器和虛擬路由器。

  VRRP可以將兩臺或多臺物理路由器設備虛擬成一個虛擬路由器,這個虛擬路由器通過虛擬IP(一個或多個)對外提供服務,而在虛擬路由器內部,是多個物理路由器協同工作,同一時間只有一臺物理路由器對外提供服務,這臺物理路由器被稱爲主路由器(處於MASTER角色)。一般情況下MASTER由選舉算法產生,它擁有對外服務的虛擬IP,提供各種網絡功能,如ARP請求、ICMP、數據轉發等。而其他物理路由器不擁有對外的虛擬IP,也不提供對外網絡功能,僅僅接收MASTERVRRP狀態通告信息,這些路由器被統稱爲備份路由器(處於BACKUP角色)。當主路由器失效時,處於BACKUP角色的備份路由器將重新進行選舉,產生一個新的主路由器進入MASTER角色繼續提供對外服務,整個切換過程對網絡營銷用戶來說完全透明。

  每個虛擬路由器都有一個唯一標識,稱爲VRID,一個VRID與一組IP地址構成了一個虛擬路由器。在VRRP協議中,所有的報文都是通過IP多播形式發送的,而在一個虛擬路由器中,只有處於MASTER角色的路由器會一直髮送VRRP數據包,處於BACKUP角色的路由器只接收MASTER發過來的報文信息,用來監控MASTER運行狀態,因此,不會發生BACKUP搶佔的現象,除非它的優先級更高。而當MASTER不可用時,BACKUP網絡策劃也就無法收到MASTER發過來的報文信息,於是就認定MASTER出現故障,接着多臺BACKUP就會進行選舉,優先級最高的BACKUP將成爲新的MASTER,這種選舉並進行角色切換的過程非常快,因而也就保證了服務的持續可用性。

 

三、keepalived詳細介紹

3.1 工作原理

  Keepalived工作在TCP/IP參考模型的第三、第四和第五層,也就是網絡層、傳輸層和網絡應用層。根據TCP/IP參考模型各層所能實現的功能,Keepalived運行機制如下。

  在網絡層,運行着四個重要的協議:互連網協議IP、互連網控制報文協議ICMP、地址轉換協議ARP以及反向地址轉換協議RARPKeepalived在網絡層採用的最常見的工作方式是通過ICMP協議向服務器集羣中的每個節點發送一個ICMP的數據包(類似於ping實現的功能),如果某個節點沒有返回響應數據包,那麼就認爲此節點發生了故障,Keepalived將報告此節點失效,並從服務器集羣中剔除故障節點。

  在傳輸層,提供了兩個主要的協議:傳輸控制協議TCP和用戶數據協議UDP。傳輸控制協議TCP可以提供可靠的數據傳輸服務,IP地址和端口,代表一個TCP連接的一個連接端。要獲得TCP服務,須在發送機的一個端口上和接收機的一個端口上建立連接,而Keepalived在傳輸層就是利用TCP協議的端口連接和掃描技術來判斷集羣節點是否正常的。比如,對於常見的Web服務默認的80端口、SSH服務默認的22端口等,Keepalived一旦在傳輸層探測到網絡公司這些端口沒有響應數據返回,就認爲這些端口發生異常,然後強制將此端口對應的節點從服務器集羣組中移除。

  在應用層,可以運行FTPTELNETSMTPDNS等各種不同類型的高層協議,Keepalived的運行方式也更加全面化和複雜化,用戶可以通過自定義Keepalived的工作方式,例如用戶可以通過編寫程序來運行Keepalived,而Keepalived將根據用戶的設定檢測各種程序或服務是否允許正常,如果Keepalived的檢測結果與用戶設定不一致時,Keepalived將把對應的服務從服務器中網絡推廣移除。

 

3.2 keepalived的安裝

 CentOS 6.4+以上的發行版本中,keepalivedrpm包被收錄在官方光盤鏡像中所以配置好本地光盤的yum倉庫使用yum install keepalived,之前的版本可能要編譯安裝。

 啓動軟件:

   [root@zj01 ~]# systenctlstart keepalived

   [root@zj01 ~]# ps aux |grep keepalived

root  3385  0.9  0.3120156  1460 ?  Ss  19:15   0:00 /usr/sbin/keepalived -D

root  3387  0.0  0.6122356  3000 ?  S   19:15   0:00 /usr/sbin/keepalived -D

root  5745  0.0  0.0   0    0 ?  D   19:15   0:00 [keepalived]

root  5749  0.0  0.1112660  968 pts/0   S+  19:15  0:00 grep --color=autokeepalived

  可以看到三個守護進程,爲了keepalived的健狀性和穩定性,keepalived啓動後運行了三個守護進程,一個父進程,兩個child進程,父進程用於監控兩個child進程,兩個child進程中一個是vrrp child,一個是healthchecking child

 

3.3 程序環境:

 主配置文件:/etc/keepalived/keepalived.conf

 主程序文件:/usr/sbin/keepalived

 Unit Filekeepalived.service

 

3.4 keepalived.conf配置段詳解

  keepalived.conf的配置文件一般分爲三個配置塊,一是全局定義塊,二是vrrp實例定義塊,三是虛擬服務器定義塊。而各配置段中還可以嵌套另外的配置段,而有些配置段又不是必須的。虛擬服務配置是專門針對LVS設計的,如果你所在的環境不是讓LVS具有高可用性,那虛擬服務配置段就可以不要,如果你想讓keepalived每一次狀態的改變(MASTER-BACKUP間的轉變)都以郵件的方式通知管理員,那可增加關於郵件報警相關的配置段,總之,keepalived.conf的配置十分靈活,下邊對常用的配置進行說明。

VRRPD CONFIGURATION

VRRP synchronization group(s)

VRRP instance(s)


vrrp_instance inside_network {  //定義vrrp示例及示例名稱;

state MASTER //指定當前設備的vrrp狀態;

interface eno16777736 //被vrrp協議綁定的網絡接口,即通過哪個接口發送vrrp通告;

virtual_router_id 51  //虛擬路由器ID,用於確定vrrp組;

priority 100  //指定當前節點的優先級,1-254之間整數,數字越大越有可能稱爲MASTER; 

advert_int 1  //發送vrrp通告的時間間隔;

authentication {

      auth_type PASS  //設置驗證方式爲簡單密碼驗證;

      auth_pass Hudlnej7  //設置驗證密碼,不超過8個字符長度;

    }

    virtual_ipaddress {

172.16.72.101/32 brd 172.16.72.101 dev eno16777736 label eno16777736:0

//指定虛擬IP地址及其配置的位置;

    }

    nopreempt //設定當前節點爲非搶佔模式;

    preempt_delay 300 //搶佔開始前的延遲時間;

    notify_master <STRING>|<QUOTED-STRING>

    notify_backup <STRING>|<QUOTED-STRING>

    notify_fault <STRING>|<QUOTED-STRING>

    //設置發生狀態改變時,所觸發的腳本文件路徑及相關參數;

}


   從這個配置文件中也可看出keepalived不僅可以爲LVS提供高可用,也可以給nginx做高可用,只是keepalived和LVS結合時自身帶了健康檢測的機制,這也是healthcheck子進程所在的意義,而對非LVS做高可用時則需要藉助vrrp_script這個配置段和相應的腳本來實現。

四、單、多實例及LVS-nat/dr模型實現

 4.1單實例

    下載安裝keepalived後,備份keepalived.conf,方便恢復初始配置

drct1配置

! 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 drct1    

   vrrp_mcast_group4 224.200.100.18  ///阻播地址,要是正確的D類地址

}

 

vrrp_instance VI_1 {    ///實例1

    state MASTER     ///

    interface eno16777736    ///網卡

    virtual_router_id 81     ///id號碼,0-255之間的都行

    priority 100                  ///優先級

    advert_int 1

    authentication {

        auth_type PASS     ///驗證方式

        auth_pass zrs66zrs     ///驗證密碼

    }

    virtual_ipaddress {

        172.16.1.99/32 brd  172.16.1.99 dev eno16777736 label eno16777736:0    ///虛擬ip地址

    }


 drct2配置

! 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 drct2

   vrrp_mcast_group4 224.200.100.18

}

 

vrrp_instance VI_1 {

    state BACKUP

    interface eno16777736

    virtual_router_id 81

    priority 90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass zrs66zrs

    }

    virtual_ipaddress {

        172.16.1.99/32 brd  172.16.1.99 dev eno16777736 label eno16777736:0

    }

}

 

配置完成後,保存退出,啓動keepalived,查看狀態,可看到drct1進入MASTER狀態

當stopdrct1的時候,drct2會立即變成MASTER,當再次start drct1的時候,drct1又會變成MASTER狀態,drct2變成BACKUP狀態。

 

 4.2多實例

    爲了更高效的利用資源,單實例顯然是不合適的,所以下面我們配置多實例,就是在一個實例上面再配置一個vrrp_instance VI_2添加一個虛擬地址,實現負載分擔,配置如下:

drct1


! 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 drct1

   vrrp_mcast_group4 224.200.100.18

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eno16777736

    virtual_router_id 81

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass zrs66zrs

    }

    virtual_ipaddress {

        172.16.1.99/32 brd 172.16.1.99  dev eno16777736 label eno16777736:0

    }

}

 

vrrp_instance VI_2 {

    state BACKUP                   ///實例1MASTER,所以這個修改爲BACKUP,作爲備用

    interface eno16777736

    virtual_router_id 80       ///組號最好更改爲跟實例1不同的組號

    priority 90         ///優先級修改爲實例1較低的優先級

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass zrs88zrs     ///這裏的也需要換一個密碼

    }

    virtual_ipaddress {

        172.16.1.88/32 brd  172.16.1.88 dev eno16777736 label eno16777736:1    ///修改ip地址,即虛擬一個新的ip地址,端口改爲1

    }

}


drct2

將該配置文件複製到另一臺主機中,修改個別內容

  ~]# scp keepaliver.conf172.16.1.200:/etc/keepalived


 !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 drct1

   vrrp_mcast_group4 224.200.100.18

}

 

vrrp_instance VI_1 {

    state BACKUP

    interface eno16777736

    virtual_router_id 81

    priority 90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass zrs66zrs

    }

    virtual_ipaddress {

        172.16.1.99/32 brd 172.16.1.99 dev  eno16777736 label eno16777736:0

    }

}

 

vrrp_instance VI_2 {

    state MASTER

    interface eno16777736

    virtual_router_id 80

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass zrs88zrs

    }

    virtual_ipaddress {

        172.16.1.88/32 brd 172.16.1.88 dev  eno16777736 label eno16777736:1

    }

}

保存退出,啓動keepalived並查看狀態,可以看到drct的狀態正常

dbbbeb472d8777ff82dbc43fdc2ce8eb.png

12ff104f069ff2a372521ae96c22d2c7.png

 

正常添加了ip地址

431c0aeb94d778b4865b1c71664e862e.png

24b8a8039bb75e3dc560a727e52b700f.png

當把其中一臺的keepalived停止時,另一臺將會加入兩個ip地址

02c89e3648502d4620e59ace0d2cf3e5.png

 4.3 利用keepalived實現lvs-dr

這裏需要在兩個drct的配置文件中添加後端RS相關配置,添加的內容如下

virtual_server 172.16.1.254 80 {

    delay_loop 3

    lb_algo rr

    lb_kind DR

    nat_mask 255.255.0.0

    presistence_timeout 5

    protocol TCP

    sorry_server 127.0.0.1 80

    real_server 172.16.1.3 80 {

        weight 1

        HTTP_GET {

            url {

              path /index.html

              status_code 200

            }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 1

        }

    }

    real_server 172.16.1.4 80 {

        weight 2

        HTTP_GET {

            url {

              path /index.html

              status_code 200

            }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 1

        }

    }

}

 保存並重啓,後端兩個RS配置詳見上篇博客,RS的配置腳本中的VIP地址需要改變,如我的VIP

地址需要改成172.16.1.254

重啓服務查看已經有了集羣了

[root@zj02 keepalived]# killall keepalived

[root@zj02 keepalived]# systemctl restarthttpd

[root@zj02 keepalived]# systemctl startkeepalived

[root@zj02 keepalived]# ipvsadm -ln

IP Virtual Server version 1.2.1(size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port      Forward Weight ActiveConn InActConn

TCP  172.16.1.254:80 rr

  -> 172.16.1.3:80          Route   1      0         0        

  -> 172.16.1.4:80          Route   2      0         0  

客戶端查看

edfacfa80350b73519da0eb4749c90cd.png

5a94af781f35a476d837c61dc5d6ef28.png

此時利用keepalived高可用lvs調度器實現DR模型的負載均衡一個php應用,可以在後端RS上添加共享目錄,存放如wordpress應用,也可以再打開一臺虛擬機做nfs共享存儲服務器,然後分別掛載到rs1rs2上面,掛載方式詳見上篇博客。

 

4.4 利用keepalived實現lvs-nat

構建規劃

drct1

外網:172.16.1.9

內網:192.168.1.100

drct2

外網:172.16.1.2

內網:192.16.1.200

rs1

內網:192.168.1.3

rs2

內網:192.168.1.4

虛擬地址

172.16.1.188

 

drct1的配置


! Configuration File for keepalived

 

global_defs {

   notification_email {

        root@localhost

   }    

   notification_email_from keepalived@locahost

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id dir1

   vrrp_mcast_group4 224.220.100.18

}  

 

vrrp_instance VI_1 {

    state MASTER

    interface eno16777736

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass zrszrs11

    }   

    virtual_ipaddress {

    172.16.1.188/16 dev eno16777736 label eno16777736:0

    }

}   

 

vrrp_instance VI_2 {

    state MASTER

    interface eno50332200

    virtual_router_id 52

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass zrszrs11

    }   

    virtual_ipaddress {

    192.168.1.188/16 dev eno50332200 label eno50332200:0

    }

}

 

virtual_server 172.16.1.188 80 {

    delay_loop 2

    lb_algo rr

    lb_kind NAT

    nat_mask 255.255.0.0

    presistence_timeout 5

    protocol TCP

    sorry_server 127.0.0.1 80

    real_server 192.168.1.3 80 {

        weight 1

        HTTP_GET {

            url {

              path /index.html

              status_code 200

            }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 1

        }

    }

    real_server 192.168.1.4 80 {

        weight 2

        HTTP_GET {

            url {

              path /index.html

              status_code 200

            }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 1

        }

    }

}


drct2的配置


! Configuration File for keepalived

 

global_defs {

   notification_email {

        root@localhost

   }

   notification_email_from keepalived@locahost

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id dir2

   vrrp_mcast_group4 224.220.100.18

vrrp_instance VI_1 {

    state BACKUP

    interface eno16777736

    virtual_router_id 51

    priority 90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass zrszrs11

    }   

    virtual_ipaddress {

    172.16.1.188/16 dev eno16777736 label eno16777736:0

    }

}   

vrrp_instance VI_2 {

    state BACKUP

    interface eno50332200

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass zrszrs11

    }   

    virtual_ipaddress {

    }

}   

virtual_server 172.16.1.188 80 {

    nat_mask 255.255.0.0

    presistence_timeout 5

    protocol TCP

    sorry_server 127.0.0.1 80

    real_server 192.168.1.3 80 {

        weight 1

        HTTP_GET {

            url {

              path /index.html

              status_code 200

            } 

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 1

        }   

    }   

    real_server 192.168.1.4 80 {

        weight 2

        HTTP_GET {

            url {

              path /index.html

              status_code 200

            } 

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 1

        }   

    }   


保存並退出,重啓服務,查看生成集羣:

[root@zj01 keepalived]# systemctl startkeepalived

[root@zj01 keepalived]# ipvsadm

IP Virtual Server version 1.2.1(size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port          Forward Weight ActiveConn InActConn

TCP  172.16.1.188:http rr

  -> 192.168.1.3:http            Masq    1      0         0         

  -> 192.168.1.4:http            Masq    2      0         0   

 

同樣可以給rs1rs2掛載nfs共享存儲器,來部署php應用。

 

五、總結

 事實上在keepalived中,無非是調用外來自定義腳本來實現其狀態轉移的,所有的腳本都可以使用vrrp_scprit調用再從vrrp_script中使用track_stript進行追蹤定義的檢測模塊就可以了。keepalived在與LVS結合時是最佳選擇,因爲keepalived還自帶了對real server的健康檢測機制,這正好彌補了LVS的不足,而要知道的是keepalived不僅僅適用與LVS結合實現高可用,在其他需要高可用的環境keepalived依然可用,但總結起來keepalived更適用與作爲負載均衡調度器應用類的高可用方案,比如nginx作爲反向代理時,haproxy等這樣的應用,不過這將是後續的博客內容了!

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章