一、簡介
企業中常用的web架構主要的目的是實現高可用及其容災備份,說白了就是讓用戶有更好的用提體驗,一個架構的可用性只有在經歷過上線後接受用戶的使用才能體現出其穩定性及其不足之處。利用週末的時間出於無聊,所以想總結以前所學的知識,本文主要介紹lvs,keepalived,nginx-proxy,等常用服務的搭建及其原理。
二、lvs概述及NAT、DR原理
專題一:
lvs-nat(Linux virtual system)是根據請求報文的目標ip和目標端口進行調度轉發至後端某主機。在實際生產中常用的模型有NAT(Network Address Translation)和DR(Direct Routing),下面我們從這兩開始展開敘述。
NAT模型拓撲圖:
原理:客服端發起請求,請求到達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.
添加ipvsadm規則,使用默認權重爲1,進行測試,實驗結果爲輪詢。
修改默認權重爲1:2,及其靜態調度算法爲加權輪詢,測試結果爲1:2加權輪詢。
總結: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模型拓撲圖:
原理: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規則
實驗結果如下圖,實現1:2說明實驗成功 ,可修改其調度算法再次驗證其結果的真實性。
總結: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拓撲圖:
原理: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規則
測試結果爲設定的輪詢算法,同時模擬後端某服務器故障,查看相應的服務器是否能符合正常需求
測試結果爲設定的輪詢算法,同時模擬後端服務器故障,查看相應的ipvs規則是否自動生成
測試結果爲設定的輪詢算法,同時模擬後端某服務器故障,查看相應的應急頁面是否能符合正常需求
總結:在keepalived中需注意的事項爲,配置vrrp_instance實例時需注意主備的狀態及其優先級,比起lvs來說keepalived總體配置簡單,且ipvs規則自動生成省去了“人工智能”。
四、nginx前端調度高可用實戰
專題四:
對於一個大型網站來說,負載均衡是永恆的話題。隨着硬件技術的迅猛發展,越來越多的負載均衡硬件設備涌現出來,如F5 BIG-IP、Citrix NetScaler、Radware等等,雖然可以解決問題,但其高昂的價格卻往往令人望而卻步,因此負載均衡軟件仍然是大部分公司的不二之選。nginx作爲webserver的後起之秀,其優秀的反向代理功能和靈活的負載均衡策略受到了業界廣泛的關注。
nginx高可用拓撲圖:
原理: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地址及其自動實現地址漂移
模擬將後端一臺服務器故障和全體故障的測試結果
實例中內嵌檢測nginx健康狀態檢測腳本當nginx宕機時,則會自動將權重減去5,VIP地址漂移至優先級高的主機
總結:在所有的負載均衡調度中nginx配置最爲簡單而且高效,同時很靈活,所以可根據自己業務需求將選擇合適自己企業的解決方案。