資源描述:
《lvs集群系統(tǒng)網(wǎng)絡(luò)核心原理分析》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、LVS集群系統(tǒng)網(wǎng)絡(luò)核心原理分析 1、LVS結(jié)構(gòu)與工作原理 LVS由前端的負(fù)載均衡器(LoadBalancer,LB)和后端的真實(shí)服務(wù)器(RealServer,RS)群組成。RS間可通過(guò)局域網(wǎng)或廣域網(wǎng)連接。LVS的這種結(jié)構(gòu)對(duì)用戶是透明的,用戶只能看見一臺(tái)作為L(zhǎng)B的虛擬服務(wù)器(VirtualServer),而看不到提供服務(wù)的RS群?! ‘?dāng)用戶的請(qǐng)求發(fā)往虛擬服務(wù)器,LB根據(jù)設(shè)定的包轉(zhuǎn)發(fā)策略和負(fù)載均衡調(diào)度算法將用戶請(qǐng)求轉(zhuǎn)發(fā)給RS。RS再將用戶請(qǐng)求結(jié)果返回給用戶。同請(qǐng)求包一樣,應(yīng)答包的返回方式也與包轉(zhuǎn)發(fā)策略有關(guān)?! VS的包轉(zhuǎn)發(fā)策略有三種: NAT(Netpty(nf_ho
2、oks[(pf)][(hook)])?(okfn)(skb):nf_hook_sloheredo;/*Hooksareorderedinascendingpriority.*/intpriority;}; 其實(shí),類似LVS的做法就是生成一個(gè)structnf_hook_ops結(jié)構(gòu)的實(shí)例,并用nf_register_hook將其HOOK上。其中l(wèi)123下一頁(yè)....,。ist項(xiàng)要初始化為{NULL,NULL};由于一般在IP層工作,pf總是PF_I;hooknum就是HOOK點(diǎn);一個(gè)HOOK點(diǎn)可能掛多個(gè)處理函數(shù),誰(shuí)先誰(shuí)后,便要看優(yōu)先級(jí),即priority的指定了。filte
3、r_ipv4.h中用一個(gè)枚舉類型指定了內(nèi)置的處理函數(shù)的優(yōu)先級(jí):enumnf_ip_hook_priorities{NF_IP_PRI_FIRST=INT_MIN,NF_IP_PRI_CONNTRACK=-200,NF_IP_PRI_MANGLE=-150,NF_IP_PRI_NAT_DST=-100,NF_IP_PRI_FILTER=0,NF_IP_PRI_NAT_SRC=100,NF_IP_PRI_LAST=INT_MAX,}; hook是提供的處理函數(shù),也就是我們的主要工作,其原型為:unsignedintnf_hookfn(unsignedinthooknum,s
4、tructsk_buff**skb,conststruct_device*in,conststruct_device*out,int(*okfn)(structsk_buff*)); 它的五個(gè)參數(shù)將由NFHOOK宏傳進(jìn)去。 以上是NetFillter編寫自己模塊時(shí)的一些基本用法,接下來(lái),我們來(lái)看一下LVS中是如何實(shí)現(xiàn)的?! ?、LVS中Netfiler的實(shí)現(xiàn) 利用Netfilter,LVS處理數(shù)據(jù)報(bào)從左邊進(jìn)入系統(tǒng),進(jìn)行IP校驗(yàn)以后,數(shù)據(jù)報(bào)經(jīng)過(guò)第一個(gè)鉤子函數(shù)NF_IP_PRE_ROUTING[HOOK1]進(jìn)行處理;然后進(jìn)行路由選擇,決定該數(shù)據(jù)報(bào)是需要轉(zhuǎn)發(fā)還是發(fā)給本機(jī);
5、若該數(shù)據(jù)報(bào)是發(fā)被本機(jī)的,則該數(shù)據(jù)經(jīng)過(guò)鉤子函數(shù)NF_IP_LOCAL_IN[HOOK2]處理后傳遞給上層協(xié)議;若該數(shù)據(jù)報(bào)應(yīng)該被轉(zhuǎn)發(fā),則它被NF_IP_FORP數(shù)據(jù)報(bào)包頭的ip地址,并重新計(jì)算和修改各個(gè)包頭中的檢驗(yàn)和,之后查找路由調(diào)用ip_send()發(fā)送修改過(guò)的數(shù)據(jù)報(bào),并返回NF_STOLEN(退出數(shù)據(jù)報(bào)的處理過(guò)程)?! p_vs_in()調(diào)用的函數(shù)ip_vs_schedule()為虛擬服務(wù)器調(diào)度可用的RS并建立相應(yīng)連接。它將根據(jù)虛擬服務(wù)器綁定的調(diào)度算法分配一個(gè)RS,如果成功,則調(diào)用ip_vs_conn_neit()、ip_vs_tunnel_xmit()、ip_vs_d
6、r_xmit()。例如ip_vs_nat_xmit()的主要操作是:修改報(bào)文的目的地址和目的端口為RS信息,重新計(jì)算并設(shè)置檢驗(yàn)和,調(diào)用ip_send()發(fā)送修改后的數(shù)據(jù)報(bào)?! ?.2NF_IP_FORp數(shù)據(jù)報(bào)則直接調(diào)用ip_vs_out_icmp();其次判斷是否為tcp/udp數(shù)據(jù)報(bào),如果不是這二者則返回NF_ACCEPT。余下就是tcp/udp數(shù)據(jù)報(bào)的處理。首先,調(diào)用ip_vs_header_check()檢查報(bào)頭,如果異常上一頁(yè)123下一頁(yè)....,。則返回NF_DROP。其次,調(diào)用ip_vs_conn_out_get()判斷是否存在相應(yīng)的連接。若不存在相應(yīng)連接:調(diào)
7、用ip_vs_lookup_real_service()去哈希表中查找發(fā)送數(shù)據(jù)報(bào)的RS是否仍然存在,如果RS存在且報(bào)文是tcp非復(fù)位報(bào)文或udp報(bào)文,則調(diào)用icmp_send()給RS發(fā)送目的不可達(dá)icmp報(bào)文并返回NF_STOLEN;其余情況下均返回NF_ACCEPT。若存在相應(yīng)連接:檢查數(shù)據(jù)報(bào)的檢驗(yàn)和,如果錯(cuò)誤則返回NF_DROP,如果正確,修改數(shù)據(jù)報(bào),將源地址修改為虛擬服務(wù)器ip地址,源端口修改為虛擬服務(wù)器端口號(hào),重新計(jì)算并設(shè)置檢驗(yàn)和,并返回NF_ACCEPT?! p_vs_out_icmp()的流程與ip_vs_in