常用集羣架構實戰練習篇

    一、簡介

    企業中常用的web架構主要的目的是實現高可用及其容災備份,說白了就是讓用戶有更好的用提體驗,一個架構的可用性只有在經歷過上線後接受用戶的使用才能體現出其穩定性及其不足之處。利用週末的時間出於無聊,所以想總結以前所學的知識,本文主要介紹lvs,keepalived,nginx-proxy,等常用服務的搭建及其原理。

    

    二、lvs概述及NAT、DR原理

    專題一:

    lvs-nat(Linux virtual system)是根據請求報文的目標ip和目標端口進行調度轉發至後端某主機。在實際生產中常用的模型有NAT(Network Address Translation)和DR(Direct Routing),下面我們從這兩開始展開敘述。

    NAT模型拓撲圖:

wKiom1gfHYDioZKxAAHmvS2vKsI619.png

    原理:客服端發起請求,請求到達lvs前端調度器,通過將請求報文中的目標IP地址和目標端口修改爲後端真實服務器的IP地址和端口實現轉發,後端真實主機處理請求後又將響應報文以相同的原理經過調度器響應給用戶。如圖所示,開始時源地址爲CIP目標地址爲VIP,經過LVS發生目標地址轉換,將VIP轉換爲RIP,則源地址爲CIP目標地址爲RIP,real server發現目標地址爲自己地址時開始拆報文並給出響應。

    

    實戰部署:

   VIP1:10.1.10.65

   DIP1:192.168.184.128

   RIP1:192.168.184.129

   RIP2:192.168.184.130

    

    要求:兩臺real server網關要指向DIP.VIP和DIP需在同一個網段,且爲內網地址   

Real server1:
    route add default gw 192.168.184.128 
Real server2:
    route add default gw 192.168.184.128 
Virutal server:
ipvsadm -A -t 10.1.10.65:80 -s rr 
ipvsadm -a -t 10.1.10.65:80 -r 192.168.184.129 -m -w 1 
ipvsadm -a -t 10.1.10.65:80 -r 192.168.184.130 -m -w 2 
echo 1>/proc/sys/net/ipv4/ip_forward #開啓ip_forward轉發功能

示例圖:


    兩臺real server網關必須指向directory routing.

wKioL1gfLR6yra7yAAA8BoNd2T8421.png



    添加ipvsadm規則,使用默認權重爲1,進行測試,實驗結果爲輪詢。

wKiom1gfLR7RcxjOAABHT6s6aRY588.png



    修改默認權重爲1:2,及其靜態調度算法爲加權輪詢,測試結果爲1:2加權輪詢。

wKioL1gfLR7gDp2YAABfKVg-Asc695.png


    總結:lvs-nat重要的注意點爲路由需指向直連路由,需開啓轉發功能,常用的靜態和動態輪詢算法有:rr,wrr,SH,DH,LC,WLC.SED,NQ,LBLC,LBLCR等



    專題二:   

     lvs-dr(lvs director routing)是通過將請求報文重新封裝其MAC地址進行轉發,源MAC地址爲DIP所在接口的IP地址,而目標MAC地址爲從後端挑選出來的real server的MAC地址IP首部不發生變換 。  

    DR模型拓撲圖:   

wKioL1gfMe6xxtpJAAINScCOfME443.png

    原理:lvs-dr模型中,請求報文的目標地址和源地址爲發生改變,而在dr上重新封裝了MAC地址,最大的改變是後端的real server和dr都配備了VIP地址,而real server響應用戶請求時不經由dr進行轉發,直接將報文發送給客服端主機。在每個real server和dr上配有VIP地址,因此爲了達到real sever不直接響應dr,需修改內核參數,將VIP綁定在lo迴環接口的別名上,兩參數分別爲:arp_ignore,arp_announce。  


    實戰部署:

    VIP1:10.1.10.88

    DIP1:10.1.10.65

    RIP1:10.1.10.66

    VIP1:10.1.10.88

    RIP2:10.1.10.67

    VIP1:10.1.10.88

    要求:需調整內核參數,爲每一個需要VIP地址的主機添加VIP地址   

real server01:
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
ifconfig lo:0 10.1.10.66 netmask 255.255.255.255 broadcast 10.1.10.66 
route add -host 10.1.10.66 dev lo:0   
real server02
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
ifconfig lo:0 10.1.10.67 netmask 255.255.255.255 broadcast 10.1.10.67
route add -host 10.1.10.67dev lo:0
virtual server
ifconfig eno16777736:0 10.1.10.66 netmask 255.255.255.255 broadcast 10.1.10.65
ipvsadm -A -t 10.1.10.88:80 -s rr 
ipvsadm -a -t 10.1.10.88:80 -r 10.1.10.66 -g -w 1 
ipvsadm -a -t 10.1.10.88:80 -r 10.1.10.67 -g -w 2

    上訴均可使用腳本實現如下:

#!/bin/bash
#
vip='10.1.10.99'
iface='eno16777736:0'
mask='255.255.255.255'
port='80'
rs1='10.1.10.66'
rs2='10.1.10.67'
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 ${vip}:${port} -r ${rs1} $type -w 1
  ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 2
  ;;
stop)
  ipvsadm -C
  ifconfig $iface down
  ;;
*)
  echo "Usage $(basename $0) start|stop"
  exit 1
  ;;
esac



     示例圖:

    設置爲加權輪詢權重比爲1:2,及其添加ipvs規則

wKiom1gfPUCC_DlUAAB8Ca2X6cA959.png  


    實驗結果如下圖,實現1:2說明實驗成功 ,可修改其調度算法再次驗證其結果的真實性。

wKioL1gfPeKhoazAAAAfeRAtUno360.png

   

    

    總結:lvs-dr重點在於給dr及其real server配置VIP地址,並且向real server設置內核參數,是的real server中的lo:0上的VIP地址不直接響應dr,而是由real server直接響應客服端請求。上訴實驗中有個缺點,當real server主機服務提供服務時,用戶請求頁面很不友好,需給出相應的應急頁面。

   



    三、實戰keepalived高可用集羣解決方案

    專題三:

    keepalived是vrrp協議的實現,原生設計目的是爲了高可用ipvs服務,keepalived能夠配置文件中的定義生成ipvs規則,並能夠對各RS的健康狀態進行檢測;通過共用的虛擬IP地址對外提供服務;在主備模式下,每個熱備組內同一時刻只有一臺主服務器提供服務,其他服務器處於冗餘狀態,若當前在線的服務器宕機,其虛擬IP地址將會被其他服務器接替(優先級決定接替順序),實現高可用爲後端主機提供服務。主/備,備/主雙主模式下,兩臺調度器均處於提供服務的狀態,當其中一臺服務器宕機或出現故障時,VIP將會“漂移”至另一臺服務器。

    keepalived拓撲圖:

wKioL1gfRFXBcPUrAAI5zcL6kXg609.png

    原理:keepalived的實現主要是由vrrp協議,自定義vrrp_instance,vrrp_server和一些檢測腳本一起共同合作,實現自動分配VIP,和ipvs規則,少去了手動配置ipvs的麻煩,同時還能夠配置應急服務器、用簡單腳本能在恢復模式下進行系統修復等,比起lvs優越性更高。

    

    實戰部署:

    DIP1:10.1.10.65

    VIP1:10.1.10.88

    VIP2:10.1.10.99

    DIP2:10.1.10.68

    VIP1:10.1.10.88

    VIP2:10.1.10.99

    RIP1:10.1.10.66

    VIP1:10.1.10.88

    VIP2:10.1.10.99

    RIP2:10.1.10.67

    VIP1:10.1.10.88

    VIP2:10.1.10.99

    

    要求:配置過程中,主的優先級要高於備,同時將主備的state狀態互調。 

編輯/etc/keepalived/keepalived.conf,將此配置文件拷貝至另一臺keepalived主機修改相應部分即可。
! Configuration File for keepalived
global_defs {
   notification_email {
root@localhost
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id centos7s
   vrrp_mcast_group4 224.0.4.18
}
vrrp_instance VI_1 {
    state MASTER #實例狀態信息
    interface eno16777736
    virtual_router_id 51
    priority 100 #優先級
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass frSAmesXYSSFmw
    }
    virtual_ipaddress {
        10.1.10.88 dev eno16777736 labeleno16777736:0
    }
    notify_master "/etc/keepalived/notify.sh master" #此處調用腳本實現發郵件給管理員
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}
vrrp_instance VI_2 {
    state BACKUP
    interface eno16777736
    virtual_router_id 52
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass frSAresXYSSFmw
    }
    virtual_ipaddress {
        10.1.10.99 dev eno16777736 labeleno16777736:1
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}
virtual_server 10.1.10.88 80 {
    delay_loop 6 
    lb_algo rr #調度算法
    lb_kind DR #負載均衡模型
    protocol TCP
    sorry_server 127.0.0.1 80 #應急服務器
    real_server 10.1.10.66 80 {
        weight 1
        HTTP_GET {
            url {
              path /
status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 10.1.10.67 80 {
        weight 2
        HTTP_GET {
            url {
              path /
status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
virtual_server 10.1.10.99 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP
    sorry_server 127.0.0.1 80
    real_server 10.1.10.66 80 {
        weight 1
        HTTP_GET {
            url {
              path /
status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 10.1.10.67 80 {
        weight 2
        HTTP_GET {
            url {
              path /
status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}


    示例圖:

    配置完成後啓動keepalived會自動生成ipvs規則

wKiom1gf5rjTqcPGAABekt5FTBU366.png


    測試結果爲設定的輪詢算法,同時模擬後端某服務器故障,查看相應的服務器是否能符合正常需求   

wKioL1gf5rmgVJvtAABH9I8mKXQ896.png


    測試結果爲設定的輪詢算法,同時模擬後端服務器故障,查看相應的ipvs規則是否自動生成     

wKioL1gf5rqDiIGwAABQPxTSCtc032.png


    測試結果爲設定的輪詢算法,同時模擬後端某服務器故障,查看相應的應急頁面是否能符合正常需求

wKiom1gf5rnAzhu2AAArTAGdv1s669.png


    總結:在keepalived中需注意的事項爲,配置vrrp_instance實例時需注意主備的狀態及其優先級,比起lvs來說keepalived總體配置簡單,且ipvs規則自動生成省去了“人工智能”。

    

    四、nginx前端調度高可用實戰

    專題四:   

    對於一個大型網站來說,負載均衡是永恆的話題。隨着硬件技術的迅猛發展,越來越多的負載均衡硬件設備涌現出來,如F5 BIG-IP、Citrix NetScaler、Radware等等,雖然可以解決問題,但其高昂的價格卻往往令人望而卻步,因此負載均衡軟件仍然是大部分公司的不二之選。nginx作爲webserver的後起之秀,其優秀的反向代理功能和靈活的負載均衡策略受到了業界廣泛的關注。  

    nginx高可用拓撲圖:

wKioL1gf7RiAYSMIAAEKNSCZfoY169.png


    原理:nginx是高度模塊化的應用程序,其中nginx_proxy模塊即可實現負載均衡,將前端的用戶請求通過調度算法分攤在後端的真實主機,達到均衡的效果。nginx_proxy也依賴於vrrp協議來實現VIP的自動分配和漂移,和keepalived不同的是nginx將不會生成ipvs規則,而是使用upstream模塊將前端請求轉發至後端。 


    實戰部署:

    VIP1:10.1.10.88

    VIP2:10.1.10.99 

    RIP1:10.1.10.66 

    RIP2:10.1.10.67         

    要求:在配置過程中開啓nginx的upstream模塊,並代理到後端主機

! 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 centos7s
vrrp_mcast_group4 224.0.120.18
}
vrrp_script chk_down { #在恢復模式下實現將機器更新,或更換服務器
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1
weight -5
}
vrrp_script chk_nginx { #健康狀態檢測,檢測nginx是否存活
script "killall -0 nginx && exit 0 || exit 1"
interval 1
weight -5
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 53
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 9818sss1
}
virtual_ipaddress {
10.1.10.88/16 dev eno16777736
}
track_script {
chk_down
chk_nginx
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
vrrp_instance VI_2 {
state BACKUP
interface eno16777736
virtual_router_id 54
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 9818rss1
}
virtual_ipaddress {
10.1.10.99/16 dev eno16777736
}
track_script {
chk_down
chk_nginx
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
http {
upstream websrvs {
    server 10.1.10.66:80 weight=1;#設置其權重爲1,默認爲1
    server 10.1.10.67:80 weight=1;#設置其權重爲1,默認爲1
    server 127.0.0.1:8080 backup;#設置其應急響應服務器
}
...
server{
location / {
        #root   /usr/share/nginx/html;
        index   index.php index.html index.htm;
        proxy_pass http://websrvs;    #代理至後端主機
    }
}
...
}


示例圖示:

    配置vrrp實例後將遵循自動生成VIP地址及其自動實現地址漂移

wKiom1ggHauQuvcDAACKs8r-r4Q818.png


    模擬將後端一臺服務器故障和全體故障的測試結果

wKiom1ggHamyFU8jAABEiXLKclc787.png


    實例中內嵌檢測nginx健康狀態檢測腳本當nginx宕機時,則會自動將權重減去5,VIP地址漂移至優先級高的主機 

wKioL1ggHaqgf1PiAACKLadXapA774.png


    總結:在所有的負載均衡調度中nginx配置最爲簡單而且高效,同時很靈活,所以可根據自己業務需求將選擇合適自己企業的解決方案。







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