1. 程式人生 > >Linux學習總結(五十四)keepalived+lvs 雙機熱備負載均衡架構

Linux學習總結(五十四)keepalived+lvs 雙機熱備負載均衡架構

DR LVS keepalived+lvs

一 LVS IP tunnel 模式介紹

IP隧道(IP tunneling)是將一個IP報文封裝在另一個IP報文的技術,這可以使得目標為一個IP地址的數據報文能被封裝和轉發到另一個IP地址。IP隧道技術亦稱為IP封裝技術(IP encapsulation)。IP隧道主要用於移動主機和虛擬私有網絡(Virtual Private Network),在其中隧道都是靜態建立的,隧道一端有一個IP地址,另一端也有唯一的IP地址。它的連接調度和管理與VS/NAT中的一樣,只是它的報文轉發方法不同。調度器根據各個服務器的負載情況,動態地選擇一臺服務器,將請求報文封裝在另一個IP報文中,再將封裝後的IP報文轉發給選出的服務器;服務器收到報文後,先將報文解封獲得原來目標地址為 VIP 的報文,服務器發現VIP地址被配置在本地的IP隧道設備上,所以就處理這個請求,然後根據路由表將響應報文直接返回給客戶。

技術分享圖片

二 LVS DR 模式介紹

DR模式也就是用直接路由技術實現虛擬服務器。它的連接調度和管理與VS/NAT和VS/TUN中的一樣,但它的報文轉發方法又有不同,VS/DR通過改寫請求報文的MAC地址,將請求發送到Real Server,而Real Server將響應直接返回給客戶,免去了VS/TUN中的IP隧道開銷。這種方式是三種負載調度機制中性能最高最好的,但是必須要求Director Server與Real Server都有一塊網卡連在同一物理網段上。Director和RealServer必需在物理上有一個網卡通過不間斷的局域網相連。 RealServer上綁定的VIP配置在各自Non-ARP的網絡設備上(如lo或tunl),Director的VIP地址對外可見,而RealServer的VIP對外是不可見的。RealServer的地址即可以是內部地址,也可以是真實地址。

技術分享圖片
具體實現過程為:
DR模式將報文直接路由給目標真實服務器。在DR模式中,調度器根據各個真實服務器的負載情況,連接數多少等,動態地選擇一臺服務器,不修改目標IP地址和目標端口,也不封裝IP報文,而是將請求報文的數據幀的目標MAC地址改為真實服務器的MAC地址。然後再將修改的數據幀在服務器組的局域網上發送。因為數據幀的MAC地址是真實服務器的MAC地址,並且又在同一個局域網。那麽根據局域網的通訊原理,真實復位是一定能夠收到由LB發出的數據包。真實服務器接收到請求數據包的時候,解開IP包頭查看到的目標IP是VIP。(此時只有自己的IP符合目標IP才會接收進來,所以我們需要在本地的回環借口上面配置VIP。另:由於網絡接口都會進行ARP廣播響應,但集群的其他機器都有這個VIP的lo接口,都響應就會沖突。所以我們需要把真實服務器的lo接口的ARP響應關閉掉。)然後真實服務器做成請求響應,之後根據自己的路由信息將這個響應數據包發送回給客戶,並且源IP地址還是VIP。

三 lvs DR 模式搭建

結構框圖如下
技術分享圖片

技術分享圖片
上圖是客戶端發過來的請求報文,我們知道DR模式中,LB和RS上都綁定了vip,那麽客戶是如何請求到LB而不是直接到RS呢?我們知道IP數據包其實是通過數據鏈路層發過來的,只要確定上面問號處的mac地址為LB的mac地址即可,如何辦到呢,這裏使用了ARP協議,簡單來說就是通過ip解析出mac地址的一個協議,我們把vip地址給廣播出去,具有此ip的機器就會回復自己的mac地址,然而這裏LB和RS均有vip,因此需要抑制住RS對於該vip地址的arp相應。這樣一來,就能確定唯一的LB mac 地址。
既然Load Balancer得到了這個IP數據包, 它就可以用某個策略從RS1, RS2,RS3中選取一個服務器,例如RS1(192.168.226.130),把IP數據報原封不動, 封裝成數據鏈路層的包(目的地是RS1的MAC地址),直接轉發就可以了,請看下圖

技術分享圖片
RS1(192.168.226.130)這個服務器收到了數據包,拆開一看,目的地IP是192.168.226.100,是自己的IP, 那就可以處理了。
處理完了以後,RS1可以直接響應發回給客戶端,完全不用再通過Load Balancer。因為自己的地址就是192.168.226.100。
對於客戶端來說,它看到的還是那個唯一的vip地址192.168.226.100, 並不知道後臺發生了什麽事情。
由於Load Balancer 根本不會修改IP數據報,其中的TCP的端口號自然也不會修改,這就要求RS1, RS2,RS3上的端口號必須得和Load Balancer一致才行
數據的流向為:
客戶端 --> Load Balancer --> RS --> 客戶端
下面跟據具體實例來理解整個過程
準備三臺機器
DIR ens33 192.168.226.129 ens37
RS1 ens33 192.168.226.130
RS2 ens33 192.168.226.131
指定vip 為 192.168.226.100,DIR vip 綁定在ens37 上,當然可以直接綁定一個虛擬網卡,比如ens33:2
以上每臺機器都需要一個公網ip
dir上編寫腳本 vim /usr/local/sbin/lvs_dr.sh //內容如下

#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.226.100
rs1=192.168.226.130
rs2=192.168.226.131
#註意這裏的網卡名字
ifconfig ens37 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev ens37
$ipv -C
$ipv -A -t $vip:80 -s wrr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1

兩臺rs上也編寫腳本 vim /usr/local/sbin/lvs_rs.sh//內容如下

#/bin/bash
vip=192.168.226.100
#把vip綁定在lo上,是為了實現rs直接把結果返回給客戶端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作為更改arp內核參數,目的是為了讓rs順利發送mac地址給客戶端
#參考文檔www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

分別運行以上腳本後,在瀏覽器測試
技術分享圖片
刷新後
技術分享圖片

四 keepalived +lvs

之前我們試驗過lvs的nat 和dr 兩種模型的負載均衡,keepalived 不光可以基於vrrp((Virtual Router Redundancy Protocol)協議實現高可用,他本身集成有lvs功能,可以實現負載均衡。下面我們用四臺機器做下實驗,基本拓撲結構如下
技術分享圖片
我們先準備四臺服務器
LB1 LB2 RS1 RS2
LB1 兩網卡 :ens33 192.168.226.129
ens37 192.168.199.200
LB2 兩網卡:ens33 192.168.226.132
ens37 192.168.199.201
RS1 一網卡 ens33 192.168.226.130
RS2 一網卡 ens33 192.168.226.131
準備工作:
四臺機器都關閉selinux ,清空防火墻規則
兩臺調度器上安裝好keepalived,兩臺RS上安裝好web nginx
1 LB1 作為主調度器
編輯keepalived 配置文件
vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    //備用服務器上為 BACKUP
    state MASTER
    //綁定vip的網卡為ens37,
    interface ens37
    virtual_router_id 51
    //備用服務器上為90
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass lvlinux
    }
    virtual_ipaddress {
        192.168.226.100
    }
}
virtual_server 192.168.226.100 80 {
   //(每隔10秒查詢realserver狀態)
    delay_loop 10
    //(lvs 算法)
    lb_algo wrr
    //(DR模式)
    lb_kind DR
    //(同一IP的連接60秒內被分配到同一臺realserver)
    persistence_timeout 60
    //(用TCP協議檢查realserver狀態)
    protocol TCP
    real_server 192.168.226.130 80 {
        //(權重)
        weight 100
        TCP_CHECK {
        //(10秒無響應超時)
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 192.168.226.131 80 {
        weight 100
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}

備註:上面我們定義了vip 為192.168.226.100,並且綁定在網卡ens37

LB2 操作
vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    //備用服務器上為 BACKUP
    state BACKUP
    //綁定vip的網卡為ens37
    interface ens37
    virtual_router_id 51
    //備用服務器上為90
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass lvlinux
    }
    virtual_ipaddress {
        192.168.226.100
    }
}
virtual_server 192.168.226.100 80 {
    //(每隔10秒查詢realserver狀態)
    delay_loop 10
    //(lvs 算法)
    lb_algo wrr
    //(DR模式)
    lb_kind DR
    //(同一IP的連接60秒內被分配到同一臺realserver)
      persistence_timeout 60    
    //(用TCP協議檢查realserver狀態)
    protocol TCP
    real_server 192.168.226.130 80 {
        #(權重)
        weight 100
        TCP_CHECK {
        #(10秒無響應超時)
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 192.168.226.131 80 {
        weight 100
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}

也就是將state master 更改為backup , priority 100 改為90
RS1 和RS2 上編輯腳本
vim /usr/local/sbin/lv_dr_rs.sh

#/bin/bash
vip=192.168.226.100
#把vip綁定在lo上,是為了實現rs直接把結果返回給客戶端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作為更改arp內核參數,目的是為了讓rs順利發送mac地址給客戶端
#參考文檔www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

RS 上 sh 運行腳本後, 在LB1上和LB2上 啟動keepalived
ipvsadm -ln 查看RS鏈接狀態
ip add 查看vip 綁定情況
LB1上關閉keepalived 後發現,LB2上重新綁定了vip 接管了服務,在/var/log/messages中可以看到vrrp 主從變更
lB2 上ipvsadem -ln 查看RS鏈接狀態
關閉一臺RS nginx ,測試高可用

Linux學習總結(五十四)keepalived+lvs 雙機熱備負載均衡架構