1. 程式人生 > >web集群時代

web集群時代

反向代理 enable lvs pad 優化 balance 七層 1-1 image

隨著業務的不斷增加,我們的單臺服務器承受不住需求,那麽我們就需要對此進行伸縮,有兩種維度,一種是縱向的也就是增大該臺服務器的硬件,再者就是加新服務器與之前的機器組成集群對外提供服務,我們都知道前者是有瓶頸的,so,集群技術是對web架構極其重要的!

集群的定義,我萌百度下就可以了:集群是一組相互獨立的、通過高速網絡互聯的計算機,它們構成了一個組,並以單一系統的模式加以管理。一個客戶與集群相互作用時,集群像是一個獨立的服務器

集群的作用:提高可用性和可縮放性

集群的種類:高可用、負載均衡、高性能

可縮放性我們很容易理解,高可用性其實也不難,因為我提供同一服務的機器多了,那麽其中一臺機器掛了其他機器撐住就可以了。由此可以看出,作為集群的機器的可用性不需要十分的高(是服務器都會有保證的,不會自己沒事就壞),所以我們在硬件采購時就可以節約一些成本,比如購買單電源的插頭,網卡也不需要太多,雙網卡就好等等,能節約成本老板一定會很開心的~

技術分享

貌似不該有右上角的緩存,好吧,圖是書上的,我也不會ps,先忽略吧,我們可以看出應用服務器變多了,前面還加了一個負載均衡調度器,只畫了一個,其實這是存在單點故障的,它的高可用性也是必需的!so,我們從它入手,常用的高可用集群軟件有heartbeat、keepalived、rhcs,最簡單常用大家都喜歡的是keepalived,它的安裝非常簡單,直接yum就可以,如果對版本有需求用編譯也還是那三步,這個不介紹了,我們來看配置文件,默認是在/etc/keepalived/keepalived.conf,編譯的自然就在你設置的目錄下了,如果你想看參數的意義,請搜索keepalived權威指南,這書很短,10分鐘就夠了,但是是絕對權威的~

 1 主機:
 2 ! Configuration File for keepalived
 3 global_defs {
 4    notification_email {
 5      [email protected]
 6    }
 7    notification_email_from [email protected]
 8    smtp_server 127.0.0.1
 9    smtp_connect_timeout 30
10    router_id haproxy_ha
11 }
12 
13 vrrp_instance haproxy_ha {
14 state MASTER 15 interface eth0 16 virtual_router_id 36 17 priority 150 18 advert_int 1 19 authentication { 20 auth_type PASS 21 auth_pass 1111 22 } 23 virtual_ipaddress { 24 192.168.56.21 25 } 26 }
 1 備機:
 2 ! Configuration File for keepalived
 3 global_defs {
 4    notification_email {
 5      [email protected]
 6    }
 7    notification_email_from [email protected]
 8    smtp_server 127.0.0.1
 9    smtp_connect_timeout 30
10    router_id haproxy_ha
11 }
12 
13 vrrp_instance haproxy_ha {
14 state BACKUP
15 interface eth0
16     virtual_router_id 36
17 priority 100
18     advert_int 1
19 authentication {
20 auth_type PASS
21         auth_pass 1111
22     }
23     virtual_ipaddress {
24        192.168.56.21
25     }
26 }

我們啟動後會發現主機成功備機失敗,wtf,這是什麽情況?那是因為我們需要更改一個內核保護參數,/proc/sys/net/ipv4/ip_nonlocal_bind,顧名思義,是否需要綁定非本地ip,因為我們的虛擬ip不是本地ip嘛,默認是0我們改成1,就可以了,此時主備機之間就建立了不可描述的關系~~~,停掉主機,備機會即可接管虛擬ip,速度極快我們根本感覺不到,如果你一直ping虛擬ip的話你可能會看到會頓上很小的毫秒數,我們的負載均衡器實現了高可用,這個虛擬ip是幹嘛的?其實這個虛擬ip有兩個作用,為負載均衡集群準備,再者它就是你的整個對外的ip了,也就是用戶只需要訪問此ip就可以了,後面的他不需要知道

再說負載均衡集群,註意是集群,實現負載均衡的方式有很多,網卡,dns,鏈路算,但是我們這裏討論服務器集群,組建服務器集群有軟硬件兩種方式,硬件使用F5跟Array,然而都不便宜,尤其是F5,價格真是頂小北方幾年工資了,so,我們還是整軟件吧~軟件也分為兩種

四層負載:轉發,維護一條tcp連接

七層負載:代理,維護兩條獨立的tcp連接

四層負載的lvs是很有名氣的,它有四種模式,十多種算法,幾乎支持任何場景,我們列舉四種模式需要註意的點就好了

1 NAT:他的瓶頸在於後端主機的路由必須為調度器,這樣才能保證回包時再通回調度器,因此進出都需要調度器來進行轉發,網卡流量扛不住。它比dr慢,但是這並不是致命缺點,其實這個所謂的“慢”幾乎可以忽略不計的
2 TUN:幾乎沒人用了,還得打專線...
3 DR:後端服務器都要綁定VIP並拒收VIP的訪問包,需要調度器與真機在一個vlan段內
4 FULL-NAT:你需要會跟ospf結合,並且編譯阿裏的內核

我所知道的10種算法

1.輪叫調度(Round Robin)(簡稱rr)
調度器通過“輪叫”調度算法將外部請求按順序輪流分配到集群中的真實服務器上,它均等地對待每一臺服務器,而不管服務器上實際的連接數和系統負載。
2.加權輪叫(Weighted Round Robin)(簡稱wrr)
調度器通過“加權輪叫”調度算法根據真實服務器的不同處理能力來調度訪問請求。這樣可以保證處理能力強的服務器能處理更多的訪問流量。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。
3.最少鏈接(Least Connections)(LC)
調度器通過“最少連接”調度算法動態地將網絡請求調度到已建立的鏈接數最少的服務器上。如果集群系統的真實服務器具有相近的系統性能,采用“最小連接”調度算法可以較好地均衡負載。
4.加權最少鏈接(Weighted Least Connections)(WLC)
在集群系統中的服務器性能差異較大的情況下,調度器采用“加權最少鏈接”調度算法優化負載均衡性能,具有較高權值的服務器將承受較大比例的活動連接負載。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。
5.基於局部性的最少鏈接(Locality-Based Least Connections)(LBLC)
“基於局部性的最少鏈接”調度算法是針對目標IP地址的負載均衡,目前主要用於Cache集群系統。該算法根據請求的目標IP地址找出該目標IP地址最近 使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於一半的工作負載,則用“最少鏈接” 的原則選出一個可用的服務器,將請求發送到該服務器。
6.帶復制的基於局部性最少鏈接(Locality-Based Least Connections with Replication)(LBLCR)
“帶復制的基於局部性最少鏈接”調度算法也是針對目標IP地址的負載均衡,目前主要用於Cache集群系統。它與LBLC算法的不同之處是它要維護從一個 目標 IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。該算法根據請求的目標IP地址找出該目標IP地址對應的服務器 組,按“最小連接”原則從服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載,則按“最小連接”原則從這個集群中選出一臺 服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低復制的程 度。
7.目標地址散列(Destination Hashing)(DH)
“目標地址散列”調度算法根據請求的目標IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。
8.源地址散列(Source Hashing)(SH)
“源地址散列”調度算法根據請求的源IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。
9.最短的期望的延遲(Shortest Expected Delay Scheduling SED)(SED)
基於wlc算法。這個必須舉例來說了
ABC三臺機器分別權重123 ,連接數也分別是123。那麽如果使用WLC算法的話一個新請求進入時它可能會分給ABC中的任意一個。使用sed算法後會進行這樣一個運算
A(1+1)/1
B(1+2)/2
C(1+3)/3
根據運算結果,把連接交給C
10.最少隊列調度(Never Queue Scheduling NQ)(NQ)
無需隊列。如果有臺 realserver的連接數=0就直接分配過去,不需要在進行sed運算

再來七層負載haproxy,它的配置文件在/etc/haproxy/haproxy.cfg

 1 主機備機
 2 global
 3     maxconn 100000
 4     chroot /var/lib/haproxy
 5     user haproxy
 6     group haproxy
 7     daemon
 8     nbproc 1
 9     pidfile /var/run/haproxy.pid
10     stats socket /var/lib/haproxy.sock mode 600 level admin
11     log 127.0.0.1 local3 info
12 
13 defaults
14     option http-keep-alive
15     maxconn 100000
16     mode http
17     timeout connect 5000ms
18     timeout client  50000ms
19     timeout server 50000ms
20 
21 listen stats
22     mode http
23     bind 0.0.0.0:8888
24     stats enable
25     stats uri     /haproxy-status
26     stats auth    haproxy:bfmq
27 
28 frontend frontend_www_example_com
29     bind 192.168.56.21:80
30     mode http
31     option httplog
32     log global
33         default_backend backend_www_example_com
34 
35 backend backend_www_example_com
36     option forwardfor header X-REAL-IP
37     option httpchk HEAD / HTTP/1.0
38     balance roundrobin
39     server web-node1  192.168.56.11:8080 check inter 2000 rise 30 fall 15
40 server web-node2  192.168.56.12:8080 check inter 2000 rise 30 fall 15

很明顯我們監聽的就是剛才虛擬ip192.168.56.21並將關於它80端口的訪問轉發到了兩臺web機器上,這兩臺機器的ip是真實存在的,並且也是提供了相應的端口服務

haproxy的算法(百度的~):

① roundrobin,表示簡單的輪詢,這個不多說,這個是負載均衡基本都具備的;
② static-rr,表示根據權重,建議關註;
③ leastconn,表示最少連接者先處理,建議關註;
④ source,表示根據請求源IP,這個跟Nginx的IP_hash機制類似,我們用其作為解決session問題的一種方法,建議關註;
⑤ ri,表示根據請求的URI;
⑥ rl_param,表示根據請求的URl參數’balance url_param’ requires an URL parameter name;
⑦ hdr(name),表示根據HTTP請求頭來鎖定每一次HTTP請求;
⑧ rdp-cookie(name),表示根據據cookie(name)來鎖定並哈希每一次TCP請求。

關於haproxy如何動態的啟用禁用配置那就需要我們配置的/var/lib/haproxy.sock了,我們直接對sock進行通信需要用到socat這個包

1 echo "disable server backend_www_example_com / web-node1" | socat /usr/local/haproxy/haproxy.sock stdio
2 echo "enable server backend_www_example_com / web-node1" | socat /usr/local/haproxy/haproxy.sock stdio

當然他還有其它的功能echo "help"| socat stdio /usr/local/haproxy/haproxy.sock可以自行查看,十分實用!

好了,haproxy的基本安裝就這樣,我們該對他進行優化了,在此之前我們還是要先把單機上本身該做的事情都做了哦,這樣其實就已經優化的不錯了。但是我們記得不論如何優化端口範圍是死的。

But,haproxy是專業的反向代理負載均衡調度器,它可以擴展多個IP以充分利用以擴大我們的端口範圍

1 server web-node1     192.168.56.11:8080 check source 192.168.56.100:10000-65000
2 server web-node2     192.168.56.11:8080 check source 192.168.56.101:10000-65000

這樣我們就的端口範圍就直接擴展了一倍,當然,我們可以繼續添加ip擴展

web集群時代