路由應用 使用路由實現負載流量均衡

2021-05-27 10:30:58 字數 2106 閱讀 4997

要實現負載流量均衡,有很多方法,在linux上lvs是一種不錯的選擇,然則配置卻相對複雜,其實現原理很奇怪,在netfilter的input鏈上實現了乙個hook,然後處理後再將資料報output出去。我們知道netfilter的hook方式雖然功能強大,幾乎無所不能(你甚至可以在裡面註冊乙個usb裝置檢測程式),然而過多的條件判斷和處理邏輯在網路多併發大負載的情況下會嚴重影響效能,因此對於效能要求高的需求,還是對netfilter的方案敬而遠之吧,比如,在部署ipsec時,雖然freeswan幾乎完全相容了ipsec標準,然而由於它是netfilter實現的,效能上會大打折扣。

我們希望用原生的協議棧特性來實現負載均衡。我首選路由,因為路由的靈活性最高,它完全是使用者自己配置的,而不像協議解析時是標準規定的。正如《使用策略路由實現訪問控制》裡面的方案一樣,本文使用路由來實現本應該由第三方協議棧過濾驅動實現的負載均衡模組

所謂高可用性負載均衡本質的乙個解釋就是將本應該由乙個服務處理的請求分擔給多個伺服器,其實現的要點首先就是將請求資料報分離,然後導向不同的伺服器,這種方式是最平滑的,我們知道,路由是專門將資料報分離到不同的路徑的。

實現請求資料報的分離的根本就是將目的位址分離,比如本來是乙個目的位址addr,現在需要將其分離為addr1,addr2,addr3,...addrn。我們知道,做到這點,最好的辦法就是做dnat。linux的ndat是用netfilter做的,然而它的實現卻和filter不同,dnat基於ip_conntrack,而conntrack狀態的維護是hash表做的,實現很高效,再者,conntrack是基於狀態的,只有對每個流的第乙個資料報才會經過所有的規則,後續的包只須匹配到流,然後直接取target結果,而匹配到流是hash完成的,十分高效。

本文討論是一種方案,並不限於linux,cisco系統,h3c系統的dnat實現可能都比linux更高效,這樣再配合其高效的路由系統,負載均衡就更完美了。

比如乙個位址addr被dnat隨機分離成了addr1,addr2,那麼我們就可以配置到達addr1和addr2的路由,使之到達不同的伺服器。這條原理十分簡單。

上述的addr1,addr2,...addrn,並不一定要通過不同的網絡卡出去,我們知道鏈路層是可以被不同ip網段的流量所復用的,也就是說,乙個用交換機互聯(hub亦可)的乙太網上可以配置多個ip網段,交換機對arp通訊是完全通透的,因此即使負責負載均衡的機器中只有兩個網絡卡,那麼也可以使用另一塊網絡卡來作為總的出口,然後將addr1,addr2...addrn等n臺伺服器部署在乙個乙太網中。

2.4.使用30位子網掩碼省去路由的配置

上述的方案需要手動配置到達addr1,addr2,addrn的路由,當然你也可以在鏈路層復用的情況下手動配置一條預設路由。然而有沒有辦法不用配置路由呢?答案是肯定的,我們考慮乙個30為掩碼的網段,其中共有4個ip位址,除去全0的網路位址和全1的廣播位址,剩下兩個主機位址,可以將這兩個主機位址中其中的乙個配置在負載均衡器上,另乙個配置在真實的伺服器上,也就是dnat的目的位址的那個。當然這種方案雖然不用配置路由,然而卻需要用30位(如果不怕浪費ip位址,你也可以用更短掩碼的ip位址)的配置ip位址,並且在dnat的時候需要乙個不連續ip位址的ip-pool。

配置dnat:

iptables -t nat -a prerouting -d 1.2.3.1 -p tcp --dport 1234 -j dnat --to 2.3.4.1-2.3.4.3

配置路由:

route add -host 2.3.4.1 dev eth1

route add -host 2.3.4.2 dev eth2

route add -host 2.3.4.3 dev eth3

很簡單,略

如果使用鏈路層復用的話,和本節的配置是一樣的,故不再單列討論

配置dnat:

配置ip位址

ip addr add dev eth1 1.2.3.1/30

ip addr add dev eth2 1.2.3.5/30

這種使用路由的方式實現負載均衡很直接,又很高效,然而對於審計的支援卻不是很好,也沒有什麼地方可以很好的記錄日誌,因為本來dnat模組或者路由模組就是乙個綜合的模組,而不是乙個專門用於負載均衡的模組,這樣的話,出了問題也不好排查,相比之下,lvs就好得多。

路由應用 使用路由實現負載流量均衡

要實現負載流量均衡,有很多方法,在linux上lvs是一種不錯的選擇,然則配置卻相對複雜,其實現原理很奇怪,在netfilter的input鏈上實現了乙個hook,然後處理後再將資料報output出去。我們知道netfilter的hook方式雖然功能強大,幾乎無所不能 你甚至可以在裡面註冊乙個usb...

Nginx使用upstream實現負載均衡

upstream模組相關說明 1 upstream模組應放於nginx.conf配置的http 標籤內 2 upstream模組預設演算法是wrr 權重輪詢 weighted round robin 一 分配方式 nginx的upstream支援5種分配方式,下面將會詳細介紹,其中前三種為nginx...

使用Nginx實現Tomcat集群負載均衡

概述 要解決的問題 環境準備以及問題解決思路 配置 測試 小結 一 概述 使用nginx主要是來解決高併發情況下的負載均衡問題。二 要解決的問題 1 最主要是負載均衡請求分發。3 多個tomcat之間session共享問題,否則會出現不斷要求登入的情況。三 環境準備以及問題解決思路 1 第乙個問題肯...