1. 程式人生 > >3-5-基於LVS實現4層負載均衡配置和DR模型實戰

3-5-基於LVS實現4層負載均衡配置和DR模型實戰

ast 冗余 .html linux 詳細 橋接 綁定 info 環回接口

DR類型
directer只響應請求報文,然後調度某一個RS,而響應報文由RS直接返回給請求者
RS和directer都需要配置VIP,(在同一網絡中有可能沖突)
本地局域網通告(通告自己的IP),ARP廣播通告,ARP廣播請求的響應
RS配置VIP僅用於構建響應報文的源地址,不是用來真正通信的
為了實現請求報文直接發送給director,而不是RS,有三種方式
1、在路由器出口處做靜態綁定,最不靠譜(因為director要做冗余的,需要重新綁定,二是不能阻斷RS的ARP響應)
2、在RS上安裝arptables,阻斷RS的ARP通告和響應
3、利用給內核傳遞參數來阻斷通告和響應

客戶端的請求報文如何傳遞到director

客戶端的請求報文-->路由器(解封裝二層,然後封裝新的二層給director)-->director
director怎麽轉發報文給RS
director發現是集群服務,重新封裝二層mac,轉發給RS

RS的網卡有物理接口和環回接口,RIP配置在物理接口,VIP配置在lo接口的別名上

視頻中的課件:
負載均衡集群設計時要註意的問題:
(1)是否需要會話保持;
(2)是否需要共享存儲;
共享存儲:NAS,SAN,DS(分布式存儲)
數據同步:
課外作業:rsync+inorify實現數據同步

lvs-nat:
設計要點:
(1)RIP與DIP在同一IP網絡,RIP的網關要指向DIP;
(2)支持端口映射;
(3)Director要打開核心轉發功能;

實踐作業(博客):負載均衡兩個PHP應用(wordpress,discuzx);
測試:(1)是否需要會話保持;(2)是否需要共享存儲;

lvs-dr:
dr模型中,各主機上均需要配置VIP,解決地址沖突的方式有三種:
(1)在前端網關做靜態綁定;
(2)在各RS使用arptables;
(3)在各RS修改內核參數,來限制arp響應和通告的級別;---對於linux來講,IP屬於內核而不是網卡,linux有三個網卡及IP,那麽開機就會向各個網絡通告自己所有的三個網卡MAC和IP(就是向每一個接口通告自己所有的網絡地址和mac);如果連接這臺服務器網卡的其他主機不在同一個網段,服務器仍然會響應,雖然接收請求的網卡不在同一網段

限制響應級別:arp_ignore---定義自己的應答方式,默認為0,還有其他的級別0~8
0:默認值,表示可使用本地任意接口上配置的任意地址進行響應;
1:僅在請求的目標IP配置在本地主機的接收到請求報文接口上時,才給予響應;
限制通告級別:arp_announce(響應)---定義自己的通告方式,默認為0
0:默認值,把本機上的所有接口的所有信息向每個接口上的網絡進行通告;
1:盡量避免向非直接連接網絡進行通告;
2:必須避免向非本網絡通告;
實踐作業(博客):負載均衡兩個PHP應用(wordpress,discuzx);
測試:(1)是否需要會話保持(2)是否需要共享存儲

RS的預配置腳本:
    #!/bin/bash
    #
    vip=10.1.0.5
    mask=255.0.0.0

    case $1 in
    start)
        echo 1> /proc/sys/net/ipv4/conf/all/arp_ignore---一般配置all就可以
        echo 1> /proc/sys/net/ipv4/conf/lo/arp_ignore---為了保險起見,才配置這個
        echo 2> /proc/sys/net/ipv4/conf/all/arp_announce
        echo 2> /proc/sys/net/ipv4/conf/lo/arp_announce

        ifconfig lo:0 $vip netmask $mask broadcast $vip up
        route add-host $vip dev lo:0
        ;;
    stop)
        ifconfig lo:0 down

        echo 0> /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0> /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0> /proc/sys/net/ipv4/conf/all/arp_announce
        echo 0> /proc/sys/net/ipv4/conf/lo/arp_announce
        ;;
    *)
        echo "Usage:$(basename $0) start|stop"
        exit 1
        ;;
    esac

VS的配置腳本:
    #!/bin/bash
    #
    vip=‘10.1.0.5‘
    iface=‘eno16777736:0‘
    mask=‘255.255.255.255‘
    port=‘80‘
    rs1=‘10.1.0.7‘
    rs2=‘10.1.0.8‘
    scheduler==‘wrr‘
    type=‘-g‘

    case $1 in
    start)
        ifconfig $iface $vip netmask $mask broadcast $vip up
        iptables -F

        ipvsadm -A-t ${vip}:${port} -s $scheduler
        ipvsadm -a -t ${port} -r ${rs1} $type -w 1
        ipvsadm -a -t ${port} -r ${rs2} $type -w 1
        ;;
    stop)
        ipvsadm -C
        ifconfig $iface down
        ;;
    *)
        echo "Usage $(basename $0) start|stop"
        exit 1
        ;;
    esac

    課外擴展作業:vip與dip/rip不在同一網段的實驗環境設計及配置實現;
    博客作業:lvs的詳細應用
        講清楚類型、調度方法;並且給出nat和dr類型的設計拓撲及具體實現;

下邊是演示如何創建DR模型,三臺服務器都只需要一塊網卡,並且都是橋接模型。
Director:172.16.0.6/16
ifconfig---查看網卡接口172.16.0.6/16
route -n---查看路由信息,IP,網關
nmtui---修改ip地址,出現命令行窗口
systemctl restart network---重啟下網絡服務
ntpdate 172.16.0.1---同步一下時間

curl http://172.16.0.7
curl http://172.16.0.7/test1.html---這裏請求RIP是沒有問題的,但是請求VIP不會應答

下邊是把VIP配置到Directory上。
ifconfig---查看一下有幾個網卡
ifconfig eno16777736:0 172.16.0.99 netmask 255.255.255.255 broadcast 172.16.0.99 up---在物理網卡上配置VIP,一樣可以使用4個255,broadcast這裏的廣播地址和4個255是不一樣的,只是為了統一風格,在這個網絡中,受限廣播這個地址

yum install -y ipvsadm
ipvsadm -A -t 172.16.0.99:80 -s rr---添加一條規則,並且使用輪調機制,去往這個地址這個端口是一個集群服務
ipvsadm -ln---查看ipvs
ipvsadm -a -t 172.16.0.99:80 -r 172.16.0.7 -g---g表示dr類型
ipvsadm -a -t 172.16.0.99:80 -r 172.16.0.8 -g
for i in {1..20};do curl http://172.16.0.99/test1.html;done---循環20次訪問這個url,有可能有保持連接的緣故,所以有可能不是輪掉
也可以使用arp-a看哪個ip在哪個mac上
此時去ping,會有應答,並且是directory響應的,兩個realserver不會應答

rs1:172.16.0.7/16
hostnamectl set-hostname rs1.ilinux.io---重新修改主機名
yum repolist---列出倉庫
yum clean all---清空倉庫緩存
scp /etc/yum.repos.d/epel.repo 172.16.0.8:/etc/yum.repos.d/
yum install -y httpd php php-mysql---安裝動態內容站點程序包
vim /var/www/html/phpinfo.php
<h1>RS1</h1>
<?php
phpinfo();
?>
vim /var/www/html/test1.html
<h1>RS1,172.16.0.7</h1>
scp /var/www/html/* 172.16.0.8:/var/www/html

先配置內核參數(不讓其通告並響應),再配置IP地址
ls /proc/sys/net/ipv4/conf/網卡名稱/arp_ignore---網卡名稱有4個all,default,網卡,lo---一般配置all就可以了,為了保險網卡或lo需要再配置一下

為了配置方便,寫一個配置腳本
vim setparameter.sh
#!/bin/bash
#
vip=‘172.16.0.99’
mask=255.255.255.255---為了限制廣播域,因為廣播地址就是自己,表明自己在一個網絡
iface=‘lo:0’

    case $1 in
    start)
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore---一般配置all就可以
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore---為了保險起見,才配置這個
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

        ifconfig $iface $vip netmask $mask broadcast $vip up
        route add -host $vip dev $iface
        ;;

    stop)
        ifconfig $iface down---停止的時候路由會自動刪除

        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
        ;;
    *)
        echo "Usage:$(basename $0) start|stop"
        exit 1
        ;;
    esac

bash -n setparameter.sh---測試語法有沒有問題
bash -x setparameter.sh start---直接執行,加start是查看過程
cat /proc/sys/net/ipv4/conf/all/arp_announce---查看一下是不是改成2了
cat /proc/sys/net/ipv4/conf/all/arp_ignore---查看一下是不是改成1了
scp setparameter.sh 172.16.0.8:/root/---復制一下

ifconfig lo:0 172.16.0.99 netmask 255.255.255.255 broadcast 172.16.0.99 up---配置環回接口的IP,掩碼,廣播地址,並且啟用up
使用ifconfig命令可以查看,並且從外部主機ping一下,不會應答
route add -host 172.16.0.99 dev lo:0---添加一條路由,如果目標地址是172,那麽到達VIP的時候,要經由lo這個接口進來,並且經由這個接口出去---這裏很重要,為了讓信息到達網卡並轉發給lo接口
systemctl start httpd---啟動web服務
ss -tnl---查看80端口是否已經啟動起來

rs2:172.16.0.8/16
nmtui---修改ip地址,出現命令行窗口172.16.0.8/16
systemctl restart network---重啟下網絡服務
ntpdate 172.16.0.1---同步一下時間
ifconifg---查看下修改後的ip對不對
hostnamectl set-hostname rs2.ilinux.io---重新修改主機名
hostname---查看下主機名
cd /var/www/html/
vim phpinfo.php---rs1創建的並復制過來的。
<h1>RS2</h1>
<?php
phpinfo();
?>
vim test1.html
<h1>RS2,172.16.0.8</h1>
上邊rs1復制過來了修改內核參數的腳本,直接執行
bash -x setparameter.sh start---直接執行,加start是查看過程
ifconfig lo:0 172.16.0.99 netmask 255.255.255.255 broadcast 172.16.0.99 up---配置環回接口的IP,掩碼,廣播地址,並且啟用up
使用ifconfig命令可以查看,並且從外部主機ping一下,不會應答
route add -host 172.16.0.99 dev lo:0---添加一條路由,如果目標地址是172,那麽經由lo這個接口進來,並且經由這個接口出去
systemctl start httpd---啟動web服務
ss -tnl---查看80端口是否已經啟動起來

3-5-基於LVS實現4層負載均衡配置和DR模型實戰