Linux學習總結(五十五)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隧道設備上,因此就處理這個請求,而後根據路由表將響應報文直接返回給客戶。
Linux學習總結(五十五)keepalived+lvs 雙機熱備負載均衡架構html

二 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的地址便可以是內部地址,也能夠是真實地址。
Linux學習總結(五十五)keepalived+lvs 雙機熱備負載均衡架構
具體實現過程爲:
DR模式將報文直接路由給目標真實服務器。在DR模式中,調度器根據各個真實服務器的負載狀況,鏈接數多少等,動態地選擇一臺服務器,不修改目標IP地址和目標端口,也不封裝IP報文,而是將請求報文的數據幀的目標MAC地址改成真實服務器的MAC地址。而後再將修改的數據幀在服務器組的局域網上發送。由於數據幀的MAC地址是真實服務器的MAC地址,而且又在同一個局域網。那麼根據局域網的通信原理,真實復位是必定可以收到由LB發出的數據包。真實服務器接收到請求數據包的時候,解開IP包頭查看到的目標IP是VIP。(此時只有本身的IP符合目標IP纔會接收進來,因此咱們須要在本地的迴環藉口上面配置VIP。另:因爲網絡接口都會進行ARP廣播響應,但集羣的其餘機器都有這個VIP的lo接口,都響應就會衝突。因此咱們須要把真實服務器的lo接口的ARP響應關閉掉。)而後真實服務器作成請求響應,以後根據本身的路由信息將這個響應數據包發送回給客戶,而且源IP地址仍是VIP。linux

三 lvs DR 模式搭建

結構框圖以下
Linux學習總結(五十五)keepalived+lvs 雙機熱備負載均衡架構nginx

Linux學習總結(五十五)keepalived+lvs 雙機熱備負載均衡架構
上圖是客戶端發過來的請求報文,咱們知道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地址),直接轉發就能夠了,請看下圖web

Linux學習總結(五十五)keepalived+lvs 雙機熱備負載均衡架構
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//內容以下vim

#/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

分別運行以上腳本後,在瀏覽器測試
Linux學習總結(五十五)keepalived+lvs 雙機熱備負載均衡架構
刷新後
Linux學習總結(五十五)keepalived+lvs 雙機熱備負載均衡架構瀏覽器

四 keepalived +lvs

以前咱們試驗過lvs的nat 和dr 兩種模型的負載均衡,keepalived 不光能夠基於vrrp((Virtual Router Redundancy Protocol)協議實現高可用,他自己集成有lvs功能,能夠實現負載均衡。下面咱們用四臺機器作下實驗,基本拓撲結構以下
Linux學習總結(五十五)keepalived+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 bash

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上 啓動keepalivedipvsadm -ln 查看RS連接狀態ip add 查看vip 綁定狀況LB1上關閉keepalived 後發現,LB2上從新綁定了vip 接管了服務,在/var/log/messages中能夠看到vrrp 主從變動LB2 上ipvsadem -ln 查看RS連接狀態關閉一臺RS nginx ,測試高可用

相關文章
相關標籤/搜索