keepalived+LVS+nginx搭建高可用負載均衡(一)

操作系統:CentOS-7.8
keepalived版本:2.0.20
nginx版本:1.18.0

本篇文件主要是介紹keepalived和LVS的基本概念和基本操作,nginx相關知識錘子在之前的文章寫過,需要了解的可以參考
《需要學會的Nginx知識》《需要學會的Nginx知識——負載均衡和緩存》

第二篇更新keepalived+LVS+nginx搭建高可用負載均衡(二)

一、keepalived

keepalived是在Linux系統下的一個輕量級的高可用解決方案,是使用C語言編寫的,它主要目標是爲Linux系統和基於Linux的基礎架構提供簡單而可靠的負載均衡和高可用。在 Keepalived 中實現了一組檢查器,可以根據服務集羣中服務器的健康狀態,自動的進行動態維護管理。

1.VRRP

VRRP(Virtual Router Redundancy Protocol)虛擬路由器冗餘協議。VRRP協議是一種容錯的主備模式的協議,保證當主機的下一跳路由出現故障時,由另一臺路由器來代替出現故障的路由器進行工作,通過VRRP可以在網絡發生故障時透明的進行設備切換而不影響主機之間的數據通信

2.高可用

Keepalived軟件主要是通過VRRP協議的設計思路實現高可用功能,在安裝keepalived的服務器主機上會在配置文件中設置一個虛擬IP,當該keepalived節點爲主節點且正常運行時,設置的虛擬Ip就會在該節點生效且綁定在該主機的網卡上,而其他備用主機設置的虛擬IP就不會生效。當備用keepalived節點檢測到主keepalived節點出現故障時,會進行搶佔提供服務,搶佔成功的keepalived節點就會將配置的虛擬IP綁定在自己的網卡上,這樣對外部用戶來說虛擬IP提供的服務是一直可用的,這也就是keepalived基於VRRP實現的高可用。

keepalive的自動化體現在他的故障檢測和排除機制,Keepalived可以檢測服務器的狀態,如果服務器羣的一臺服務器宕機或工作出現故障,Keepalived將檢測到,並將有故障的服務器從服務集羣中剔除,同時使用配置的其他備用的服務器節點代替該服務器的工作,當故障服務器被修復後可以正常工作時Keepalived會自動的將該服務器加入到服務器羣中。在整個過程中,故障檢測、故障服務器剔除以及修復後的服務器重新上線這些操作都是由keepalived自動完成,運維人員只需要關注故障服務器的修復。

3.keepalived安裝

keepalive的安裝參考學習必備——Keepalived安裝

4.使用keepalived搭建一個高可用nginx服務

準備工作

服務搭建示意圖如下

nginx.conf

從圖中我們可以看出,有兩臺服務器Server1(192.168.56.101)和Server2(192.168.56.102)。每臺服務器上都運行一個nginx實例和一個keepalived實例,其中Server1的keepalived實例是Master節點,Server2的keepalived實例是備用節點,兩個keepalived實例配置的虛擬IP爲192.168.56.102

配置

nginx配置不進行特殊設置,保證默認即可。在nginx的html頁面裏面加上一些不同文章便於區分,啓動nginx服務,保證可以正常訪問即可,如下圖所示

nginx.conf

接下來對keepalived進行配置,keepalived的配置文件位置是在安裝的時候指定,錘子的配置文件在/etc/keepalived/keepalived.conf,相關配置如下

keepalive-master配置


! Configuration File for keepalived

global_defs {
   #路由id,全局唯一,表示當前keepalived節點的唯一性
   router_id keep_101
}

vrrp_instance VI_1 {
    #設置當前實例狀態爲MASTER。MASTER代表是主實例,BACKUP代表是備用實例
    state MASTER
    #當前實例綁定的網卡
    interface enp0s8
    #當前實例的虛擬路由id,一組主備的實例的路由id是相同的
    virtual_router_id 51
    #當前實例的優先級
    priority 100
    #主備之間同步檢查時間間隔
    advert_int 1
    #一組主備實例的認證密碼,方式非法節點進入路由組
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #設置當前實例的虛擬IP
    virtual_ipaddress {
        192.168.56.100
    }
}


keepalive-backup配置(只標註於keepalived-master不同的點)


! Configuration File for keepalived

global_defs {
   #由於是全局唯一Id,所有需要與master保持不同
   router_id keep_102
}

vrrp_instance VI_1 {
    #備用實例狀態應設置爲BACKUP
    state BACKUP
    interface enp0s8
    virtual_router_id 51
    #設置備用實例的優先級低於主實例,這樣可保證在主實例故障修復後可以再次將主節點搶佔回來
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.56.100
    }
}


啓動驗證

啓動兩臺服務器的keepalived,通過虛擬ip訪問nginx服務,然後kill掉Server1上的keepalived驗證是否保證虛擬ip正常訪問,驗證圖示如下

nginx.conf

圖中我們可以看出,當兩個keepalived實例都正常運行時,虛擬IP是綁定在Server1的網卡上對外提供服務,當我們kill掉Server1上的keepalived實例後,虛擬IP自動綁定到了Server2來提供服務,這樣就保證了服務的高可用,對於外部用戶來說通過虛擬IP來訪問服務並不會感知到服務發生了故障,整個過程對外部用戶來說是透明的。

二、LVS

LVS(Linux Virtual Server)Linux虛擬服務器,是一個虛擬的服務器集羣系統。LVS在Linux內核中實現了基於IP的內容請求分發的負載均衡調度解決方案,屬於四層負載均衡。LVS調度器具有很好的吞吐率,將請求均衡地轉移到不同的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。在使用LVS負載均衡時,用戶的請求都會被LVS調度器轉發到真實服務器,真實服務器在處理完請求後將數據發送給用戶時會有多種方式(三種)可以選擇,整個服務器集羣的結構對客戶是透明的

1.工作模式

NAT

NAT(Network Address Translation)網絡地址轉換,通過修改數據報頭,使得內網中的IP可以和外部網絡進行通信。LVS負載調度器使用兩塊不同的網卡配置不同的IP地址,網卡一設置爲公網IP負責與外部通信,網卡二設置內網IP負責與內網服務通信。

外部用戶通過訪問LVS調度器的公網IP發送服務請求,LVS調度器接受請求後,將請求數據進行轉換,通過內網IP的網卡設備,根據調度策略將數據轉發給內部服務,內部服務處理完成將響應數據再返回給LVS調度器,LVS調度器再將數據轉換通過公網IP的網卡設備將響應結果返回給請求用戶。

以上描述的就是一個基於NAT工作模式的LVS調度,這種模式的瓶頸在於LVS調度器,因爲所有的請求數據和響應數據都需要經過LVS來進行轉換處理,當大流量到來時,LVS調度器就成了一個短板,限制整個集羣服務性能的上限。

TUN

TUN模式與NAT的不同在於,TUN模式下LVS調度器只負責接受請求,而真實服務器進行響應請給用戶。LVS調度器與真實服務器建立IP隧道,IP隧道它可以將原始數據包封裝並將新的源地址及端口、目標地址及端口添加新的包頭中,將封裝後的數據通過隧道轉發給後端的真實服務器,真實服務器在收到請求數據包後直接給外部用戶響應數據,這種模式下要求真實服務器具有直接外部用戶通信的能力。

外部用戶訪問LVS調度器發送服務請求,LVS調度器接收請求後,將請求數據轉換,根據調度策略將數據轉發給服務集羣真實服務器,真實服務器在處理完成後,就直接與外部請求用戶通信,直接將響應結果返回給請求用戶。

以上描述就是一個基於TUN工作模式的LVS調度,這種模式下LVS調度器就只負責請求的負載均衡轉發,而處理數據的響應則全部由真實服務器來直接和用戶通信了。在實際環境中,請求的數據量往往是小於響應的數據量,所以僅僅將請求數據讓LVS來轉發,好處就是LVS調度器的壓力減少很多,可以承載更大的流量,同時真實服務器的性能也能得到充分利用,缺點就是真實服務器需要與外部網絡用戶直接通信,在安全上會存在一定風險。

DR

DR模式是在TUN模式的基礎上又進行了改造,在DR模式下LVS調度器與真實服務器共享一個虛擬IP,且調度器的虛擬IP對外暴露,而真實服務器的虛擬IP地址將配置在Non-ARP的網絡設備上,這種網絡設備不會向外廣播自己的MAC及對應的IP地址,這樣即保證了真實服務器可以接受虛擬IP的網絡請求也讓真實服務器所綁定的虛擬IP對外部網絡部是不可見的。

外部用戶通過訪問虛擬IP將請求數據包發送到調度器,調度器根據調度策略確定轉發的真實服務器後,在不修改數據報文的情況下,將數據幀的MAC地址修改爲選出的真實服務器的MAC地址,通過交換機將該數據幀發給真實服務器,之後真實服務器在處理完後進行數據響應時,會將虛擬IP封裝在數據包中,再經過路由將數據返回給外部用戶,在這整個過程中,真實服務器對外部用戶不可見,外部用戶只能看到虛擬IP的地址

在DR模式下因爲真實服務器給外部用戶迴應的數據包設置的源IP是虛擬IP地址,又因爲真實服務器的虛擬IP不對外暴露,這樣外部用戶在通過虛擬IP訪問時,就訪問到了調度器的虛擬IP地址,就實現了整個集羣對外部用戶透明。

2.負載均衡算法

輪詢(RR)

輪詢(Round Robin),循環的方式將請求調度到真實服務器,所有的請求會被平均分配給每個真實服務器。

加權輪詢(WRR)

加權輪詢(Weight Round Robin),輪詢調度的一種補充,每臺真實服務器配置一個權重,輪詢過程中,權重越高的服務器,被分配的請求越多。

最小連接(LC)

最小連接(Least Connections),把新的連接請求分配到當前活躍連接數最小的服務器。

加權最小連接(WLC)

加權最少連接(Weight Least Connections),在LC調度算法上的補充,調度新連接時儘可能使真實服務器的已建立連接數和其權重成比。

基於局部的最小連接(LBLC)

基於局部的最少連接(Locality-Based Least Connections),先根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於一半的工作負載,則使用’最少連接’的原則選出一個可用的服務器。

帶複製的基於局部性的最少連接(LBLCR)

帶複製的基於局部性的最少連接(Locality-Based Least Connections with Replication),按’最小連接’原則從該服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載,則按’最小連接’原則從整個集羣中選出一臺服務器,將該服務器加入到這個服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,則將最忙的服務器從服務器組中刪除。

目標地址散列(DH)

目標地址HASH(Destination Hashing),根據請求的目標IP地址進散列計算從散列表找出對應的服務器,若該服務器是可用的且並未超載,將請求發送到該服務器,否則返回空。

源地址散列調度(SH)

源地址HASH(Source Hashing),根據請求的源IP地址進行散列計算從散列表找出對應的服務器,若該服務器是可用的且並未超載,將請求發送到該服務器,否則返回空。

最短的期望的延遲(SED)

最短的期望的延遲(Shortest Expected Delay),基於加權最小連接的一個調度算法,會根據權重,當前連接數,進行期望計算,將連接分配給計算結果最小的服務器

最少隊列(NQ)

最少隊列(Never Queue),永不使用隊列。

3.使用LVS對集羣進行DR模式的負載均衡

ipvsadm安裝

從Linux內核的2.4版本開始在內核中就已經集成了LVS功能。ipvsadm是LVS的管理工具,使用yum install -y ipvsadm 即可直接安裝。

可以嘗試使用一下命令 ipvsadm -Ln,若命令可以使用則代表已經安裝

準備工作

環境說明:

DR模式下虛擬IP:192.168.56.130

三臺服務器主機包括:一臺LVS調度主機和兩臺真實服務主機

LVS調度主機真實IP:192.168.56.121

兩臺真實服務器的真實IP:192.168.56.101和192.168.56.102

兩臺真實服務器分別按照了nginx服務,僅做基本基本配置便於區分

lvs_serverinfo.conf

  • LVS調度器配置虛擬IP

如果你是虛擬機建議在操作前關閉NetworkManager,由於虛擬的網卡都是虛擬的以免自動的網絡管理導致出現問題,使得實驗失敗

進入網卡配置目錄:cd /etc/sysconfig/network-scripts

根據自己的網卡情況選擇虛擬ip要綁定的網卡,錘子的網卡名字是enp0s8,所以我會將虛擬ip綁定在此網卡上。

複製一份配置:cp ifcfg-enp0s8 ifcfg-enp0s8:1

vim ifcfg-enp0s8:1 配置如下:


#網卡名稱需要更高
DEVICE=enp0s8:1
ONBOOT=yes
#IP地址修改爲虛擬IP地址
IPADDR=192.168.56.130
NETMASK=255.255.255.0
BOOTPROTO=static

重啓網絡服務:systemctl restart network.service

查虛擬IP是否生效:ifconfig enp0s8:1 ,如可以查到ip信息則配置成功

  • 爲真實服務器配置虛擬IP

我們演示的DR模式的LVS負載均衡,所以真實服務器的虛擬IP將和LVS調度器的虛擬IP一樣,且真實服務器的虛擬IP不能對外暴露,所以我們會將虛擬IP綁定在lo迴環接口上。由於兩臺真實服務器的虛擬ip配置方式一樣,如下配置就只演示一次。

進入網卡配置目錄:cd /etc/sysconfig/network-scripts

複製一份配置:cp ifcfg-lo ifcfg-lo:1

vim ifcfg-lo:1 配置如下:


#主要修改DEVICE、IPADDR、NETMASK這三項如下,其他配置保留不變即可
DEVICE=lo:1
IPADDR=192.168.56.130
NETMASK=255.255.255.255

重啓網絡服務:systemctl restart network.service

查虛擬IP是否生效:ifconfig lo:1 ,如可以查到ip信息則配置成功

  • 爲真實服務器配置ARP

同樣兩臺真實服務器配置過程相同,僅演示一次。

配置ARP響應級別和通告行爲,關於這方面知識,在這裏不細講,有興趣的朋友可以自己查閱資料。vim /etc/sysctl.conf ,加入如下內容:


# configration for lvs
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2

刷新配置:sysctl -p

增加路由(單次生效):route add -host 192.168.56.130 dev lo:1

可以將該路由配置命令(route add -host 192.168.56.130 dev lo:1)追加在rc.local中,防止重啓失效

查看路由表:route -n ,看到如下配置,代表路由配置成功


192.168.56.130  0.0.0.0         255.255.255.255 UH    0      0        0 lo

配置負載集羣規則

  • 添加LVS節點信息

ipvsadm  -A -t 192.168.56.130:80 -s wrr -p 5

說明如下:

-A 添加LVS節點

-t 代表TCP協議,後面是負載的虛擬ip和端口

-s 負責均衡算法,wrr代表加權輪詢

-p 連接持久化的世界

  • 添加真實服務器信息

ipvsadm -a -t 192.168.56.130:80 -r 192.168.56.101:80 -g
ipvsadm -a -t 192.168.56.130:80 -r 192.168.56.102:80 -g

說明如下:

-a 添加真實服務器

-t tcp協議,負載虛擬IP和端口

-r 真實服務器IP和端口

-g 工作模式DR

  • 保存配置

ipvsadm -S

驗證

ipvsadm -Ln 查看負載集羣信息


IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.56.130:80 wrr persistent 5
  -> 192.168.56.101:80            Route   1      0          0         
  -> 192.168.56.102:80            Route   1      0          0 

ipvsadm -Ln --stats 查看集羣連接信息


IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.56.130:80                   7       64        0    13622        0
  -> 192.168.56.101:80                   2        8        0     1117        0
  -> 192.168.56.102:80                   5       56        0    12505        0

瀏覽器通過虛擬ip訪問服務器效果如下:

lvs_loadbalance.conf

這樣使用lvs的一個負載均衡簡單集羣搭建完成。

總結

在本篇文章中,主要對keepalived和lvs進行了基礎理論介紹和基本操作的演示,掌握這些基礎使用後,我們才能把他們結合起來使用。在下一篇中錘子將會演示一個結合keepalived+lvs+nginx的一個高可用負載均衡集羣,歡迎持續關注。

個人公衆號【愛做夢的錘子】,全網同id,個站 http://te-amo.site,歡迎關注,裏面會分享更多有用知識,還有我的私密照片

覺得不錯就點個贊叭QAQ

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