簡述LVS調(diào)度方案及應(yīng)用場景
調(diào)度算法可以分為靜態(tài)調(diào)度和動態(tài)調(diào)度
1、靜態(tài)調(diào)度即根據(jù)算法本身的結(jié)果來進行調(diào)度**
1.1慷妙、輪詢調(diào)度算法(RR)
輪詢算法適用于所有服務(wù)器的處理性能相近的應(yīng)用場景,因為輪詢算法相對簡單,其調(diào)度方式是不管服務(wù)器當(dāng)前的連接數(shù)和響應(yīng)速度如何的。因此當(dāng)后端服務(wù)器的處理性能殘次不齊袁稽,請求服務(wù)的時間變化較大時,輪詢算法很容易導(dǎo)致服務(wù)器之間的負(fù)載不均衡擒抛。因此輪詢算法只適用于后端服務(wù)器性能相近推汽,請求時間變化不大的場景使用。
1.2歧沪、加權(quán)輪詢調(diào)度算法(WRR)
可以理解為輪詢算法的進階版歹撒。通過設(shè)置權(quán)重來表示后端服務(wù)器的處理型男,權(quán)重越大表示服務(wù)器的處理能力越強诊胞,但是當(dāng)請求時間變化很大時暖夭,加權(quán)輪詢算法依然會導(dǎo)致服務(wù)器間的負(fù)載不平滑。
1.3撵孤、目標(biāo)地址哈希調(diào)度算法(DH)
指針對通過計算目前地址的散列(HASH)函數(shù)來將一個目標(biāo)IP地址映射到一臺服務(wù)器迈着。DH算法首先根據(jù)請求的目標(biāo)IP地址作為散列鍵(Hask key),從靜態(tài)分配的散列表中找出對應(yīng)的服務(wù)器邪码。若該服務(wù)器是可用且未超載裕菠,則將請求發(fā)送到該服務(wù)器,否則返回為空闭专。此調(diào)度算法可保證用戶訪問同一個應(yīng)用服務(wù)時奴潘,請求均被送往同一個后端服務(wù)器。典型應(yīng)用場景為正向代理緩存場景中的負(fù)載均衡影钉。
1.4画髓、源地址散列調(diào)度算法(SH)
是指根據(jù)請求的源IP地址作為散列鍵(Hash key),從靜態(tài)分配的散列表中找出其對應(yīng)的服務(wù)器平委。若服務(wù)器是可能且未超載雀扶,否則將返回空。SH算法可將來自于同一個IP地址的請求始終發(fā)往同一個后端服務(wù)器肆汹,從而實現(xiàn)會話綁定愚墓。
2、動態(tài)調(diào)度算法即指結(jié)合算法及當(dāng)前每個后端服務(wù)器的負(fù)載狀態(tài)進行計算調(diào)整選出最優(yōu)的后端服務(wù)器進行分配負(fù)載昂勉。
2.1浪册、最小連接調(diào)度算法(LC)
是指把新的連接請求分配到當(dāng)前連接數(shù)最小的服務(wù)器。調(diào)度器會記錄各個服務(wù)器已建立連接的數(shù)目岗照,當(dāng)一個請求被調(diào)度分配到一個后端服務(wù)器村象,其連接數(shù)就加一;當(dāng)連接超時或終止時攒至,其連接數(shù)減一厚者。
LC算法則會把新的連接請求分配到已建立連接數(shù)最小的服務(wù)器上,保證后端服務(wù)器迫吐,每一個都始終處于工作狀態(tài)库菲。
此算法適用于后端服務(wù)器性能差不多,請求時間不一樣的情況下使用志膀。
2.2熙宇、加權(quán)最小連接調(diào)度算法(WLC)
是在一個服務(wù)器性能差異較大的集群中,根據(jù)最小連接數(shù)及服務(wù)器的權(quán)重來分配的連接請求溉浙。對比LC算法來說烫止,WLC可優(yōu)化負(fù)載均衡的性能,使得具有較高權(quán)重的服務(wù)器承受較大比例的活動連接負(fù)載戳稽。
2.3馆蠕、最小期望延遲調(diào)度算法(SED)
是WLC算法的改進版,根據(jù)算法(active+1)*256/weight的結(jié)果惊奇,將請求分配給計算結(jié)果最小的服務(wù)器互躬。
2.4、從不排隊調(diào)度(NQ)
增強改進的sed算法赊时,即在sed算法結(jié)果之后增加了輪詢的機制吨铸。如果有臺real server的連接數(shù)=0直接分配,不需要再進行sed運算祖秒,而是直接分配請求連接到指定的服務(wù)器诞吱。
因此這種算法就會盡量不讓請求出現(xiàn)排隊的情況,即避免了某個節(jié)點非常繁忙而其他節(jié)點相對空閑的情況竭缝。
避免了權(quán)重小的節(jié)點不會現(xiàn)沒有請求被調(diào)度的情況房维。
2.5、基于局部性的最少連接(LBLC)
基于局部性的最少連接算法是針對請求報文的目標(biāo)IP地址的負(fù)載均衡調(diào)度抬纸,主要用于cache集群系統(tǒng)咙俩,因為cache集群中客戶請求報文的目標(biāo)IP地址是變化的,這里假設(shè)任何后端服務(wù)器都可以處理任何請求,算法的設(shè)計目標(biāo)在服務(wù)器的負(fù)載基本平衡的情況下阿趁,將相同的目標(biāo)IP地址的請求調(diào)度到同一臺服務(wù)器膜蛔,來提高服務(wù)器的訪問局部性和主破cache命中率,從而調(diào)整整個集群系統(tǒng)的處理能力脖阵。
2.6皂股、基于局部性的帶復(fù)制功能的最少連接(LBLCR)
基于局部性的帶復(fù)制功能的最少連接調(diào)度算法也是針對目標(biāo)IP地址的負(fù)載均衡,該算法根據(jù)請求的目標(biāo)IP地址找出該 目標(biāo)IP地址對應(yīng)的服務(wù)器組命黔,按“最小連接”原則從服務(wù)器組中選出一臺服務(wù)器呜呐,若服務(wù)器沒有超載,將請求發(fā)送到該服務(wù)器悍募;若服務(wù)器超載蘑辑,則按“最小連接”原則從這個集群中選出一臺服務(wù)器,將該服務(wù)器加入服務(wù)器組中坠宴,將請求發(fā)送到該服務(wù)器洋魂。同時,當(dāng)該服務(wù)器組有一段時間沒有被修改啄踊,將最忙的服務(wù)器從服務(wù)器組中刪除忧设,以降低復(fù)制的程度。
詳細(xì)描述nginx模塊并舉例說明
1)ngx_http_access_module模塊:
實現(xiàn)基于IP的訪問控制功能
allow address | CIDR | unix: | all; 允許
deny address | CIDR | unix: | all; 拒絕
2)ngx_http_auth_basic_module模塊:
實現(xiàn)基于用戶的訪問控制颠通,使用basic機制進行用戶認(rèn)證
auth_basic string | off;
auth_basic_user_file file;
location /admin/ {
alias /webapps/app1/data/;
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
注意:htpasswd命令由httpd-tools提供
3)ngx_http_stub_status_module模塊
用于輸出nginx的基于狀態(tài)信息
Active connections: 291
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106
Active connections: 活動狀態(tài)的連接數(shù)址晕;
accepts:已經(jīng)接受的客戶端請求的總數(shù);
handled:已經(jīng)處理完成的客戶端請求的總數(shù)顿锰;
requests:客戶端發(fā)來的總的請求數(shù)谨垃;
Reading:處于讀取客戶端請求報文首部的連接的連接數(shù);
Writing:處于向客戶端發(fā)送響應(yīng)報文過程中的連接數(shù)硼控;
Waiting:處于等待客戶端發(fā)出請求的空閑連接數(shù)刘陶;
stub_status
配置示例
location /basic_status {
stub_status;
}
4) ngx_http_log_module模塊
log_format name string ...;
string可以使用nginx核心模塊及其它模塊內(nèi)嵌的變量;
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
訪問日志文件路徑牢撼,格式及相關(guān)的緩沖的配置匙隔;
buffer=size
flush=time
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
緩存各日志文件相關(guān)的元數(shù)據(jù)信息;
max:緩存的最大文件描述符數(shù)量熏版;
min_uses:在inactive指定的時長內(nèi)訪問大于等于此值方可被當(dāng)作活動項纷责;
inactive:非活動時長;
valid:驗正緩存中各緩存項是否為活動項的時間間隔撼短;
5) ngx_http_gzip_module模塊
gzip on | off;
Enables or disables gzipping of responses.
gzip_comp_level level;
Sets a gzip compression level of a response. Acceptable values are in the range from 1 to 9.
gzip_disable regex ...;
Disables gzipping of responses for requests with “User-Agent” header fields matching any of the specified regular expressions.
gzip_min_length length;
啟用壓縮功能的響應(yīng)報文大小閾值再膳;
gzip_buffers number size;
支持實現(xiàn)壓縮功能時為其配置的緩沖區(qū)數(shù)量及每個緩存區(qū)的大小曲横;
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
nginx作為代理服務(wù)器接收到從被代理服務(wù)器發(fā)送的響應(yīng)報文后喂柒,在何種條件下啟用壓縮功能的;
off:對代理的請求不啟用
no-cache, no-store,private:表示從被代理服務(wù)器收到的響應(yīng)報文首部的Cache-Control的值為此三者中任何一個灾杰,則啟用壓縮功能蚊丐;
gzip_types mime-type ...;
壓縮過濾器,僅對此處設(shè)定的MIME類型的內(nèi)容啟用壓縮功能吭露;
------------------------------------分割線----------------------------
gzip on;
gzip_comp_level 6;
gzip_min_length 64;
gzip_proxied any;
gzip_types text/xml text/css application/javascript;
6) ngx_http_ssl_module模塊
ssl on | off;
Enables the HTTPS protocol for the given virtual server.
ssl_certificate file;
當(dāng)前虛擬主機使用PEM格式的證書文件吠撮;
ssl_certificate_key file;
當(dāng)前虛擬主機上與其證書匹配的私鑰文件;
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
支持ssl協(xié)議版本讲竿,默認(rèn)為后三個;
ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
builtin[:size]:使用OpenSSL內(nèi)建的緩存弄屡,此緩存為每worker進程私有题禀;
[shared:name:size]:在各worker之間使用一個共享的緩存;
ssl_session_timeout time;
客戶端一側(cè)的連接可以復(fù)用ssl session cache中緩存 的ssl參數(shù)的有效時長膀捷;
--------------------------------------分割線------------------------------
server {
listen 443 ssl;
server_name www.magedu.com;
root /vhosts/ssl/htdocs;
ssl on;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_cache shared:sslcache:20m;
7) ngx_http_rewrite_module模塊
將用戶請求的URI基于regex所描述的模式進行檢查迈嘹,而后完成替換;
rewrite regex replacement [flag]
將用戶請求的URI基于regex所描述的模式進行檢查全庸,匹配到時將其替換為replacement指定的新的URI秀仲;
注意:如果在同一級配置塊中存在多個rewrite規(guī)則,那么會自下而下逐個檢查壶笼;被某條件規(guī)則替換完成后神僵,會重新一輪的替換檢查,因此覆劈,隱含有循環(huán)機制保礼;[flag]所表示的標(biāo)志位用于控制此循環(huán)機制;
如果replacement是以http://或https://開頭责语,則替換結(jié)果會直接以重向返回給客戶端炮障;
301:永久重定向;
[flag]:
last:重寫完成后停止對當(dāng)前URI在當(dāng)前l(fā)ocation中后續(xù)的其它重寫操作坤候,而后對新的URI啟動新一輪重寫檢查胁赢;提前重啟新一輪循環(huán);
break:重寫完成后停止對當(dāng)前URI在當(dāng)前l(fā)ocation中后續(xù)的其它重寫操作白筹,而后直接跳轉(zhuǎn)至重寫規(guī)則配置塊之后的其它配置智末;結(jié)束循環(huán);
redirect:重寫完成后以臨時重定向方式直接返回重寫后生成的新URI給客戶端遍蟋,由客戶端重新發(fā)起請求吹害;不能以http://或https://開頭;
permanent:重寫完成后以永久重定向方式直接返回重寫后生成的新URI給客戶端虚青,由客戶端重新發(fā)起請求它呀;
return
return code [text];
return code URL;
return URL;
Stops processing and returns the specified code to a client.
rewrite_log on | off;
是否開啟重寫日志;
if (condition) { ... }
引入一個新的配置上下文 ;條件滿足時纵穿,執(zhí)行配置塊中的配置指令下隧;server, location;
condition:
比較操作符:
==:等于
!=:不等于
~:模式匹配谓媒,區(qū)分字符大小寫淆院;
~*:模式匹配,不區(qū)分字符大小寫句惯;
!~:模式不匹配土辩,區(qū)分字符大小寫;
!~*:模式不匹配抢野,不區(qū)分字符大小寫拷淘;
文件及目錄存在性判斷:
-e, !-e
-f, !-f
-d, !-d
-x, !-x
set $variable value;
用戶自定義變量 ;
8) ngx_http_referer_module模塊
valid_referers none | blocked | server_names | string ...;
定義referer首部的合法可用值指孤;
none:請求報文首部沒有referer首部启涯;
blocked:請求報文的referer首部沒有值;
server_names:參數(shù)恃轩,其可以有值作為主機名或主機名模式结洼;
arbitrary_string:直接字符串,但可使用*作通配符叉跛;
regular expression:被指定的正則表達(dá)式模式匹配到的字符串松忍;要使用~打頭,例如 ~.*\.magedu\.com昧互;
配置示例:
valid_referers none block server_names *.magedu.com *.mageedu.com magedu.* mageedu.* ~\.magedu\.;
if($invalid_referer) {
return http://www.magedu.com/invalid.jpg;
}