關於網路的負載均衡也是分層次的,曾經想過使用linux的bonding功能來做openvpn的tun網絡卡的負載均衡,在主機上啟動多個openvpn例項從而得到多個tun網絡卡,然後將多個tun網絡卡bond到乙個bonding上,可後來一想就不合適了,因為bonding所做的是鏈路層的負載均衡,所有的bonding中的網絡卡使用同乙個ip位址,這就和openvpn的使用不符合了,知道了這件事後,我決定修改bonding的源**,在資料報傳送到真實tun網絡卡之前重新設定ip位址或者重新做snat,結果還真的成功了!欣喜中...突然覺得這麼做不妥,為何非要在鏈路層做ip層的負載均衡呢?想想原因也是很簡單的,我需要的僅僅是乙個基於路由的負載均衡,就是每個包過來(注意不是每個連線)在選擇路由的時候在兩個或者多個路由之間做均衡,每條路由的出口裝置是不同的tun虛擬網絡卡,這就解決了openvpn單程序效率低的問題,但是因為linux不打equalize補丁的核心的路由是快取的,所以幾乎做不到同乙個流的每個資料報的負載均衡,然而只要打上equalize patch就可以了,何必非要修改bonding驅動呢?另外openvpn乙個應用程式,效率低下是它本身造成的,和核心有關係嗎?怎麼說也不能觸動鏈路層用於多網絡卡繫結的驅動**啊!
是的,是這樣的,負載均衡是分層次的,ip層的負載均衡的目標是對於同乙個基於五元素的策略,在不同的路由之間做均衡選擇,每個資料報都能在均衡路由之間選擇到不同的路由是最好的選擇了(對於輪轉策略來講),而網絡卡的負載均衡則目標是對於乙個既定的路由結果,在不同的網絡卡上傳送資料從而實現負載均衡,乙個路由結果本質上最重要的就是確定了乙個出口裝置,如果這個出口裝置是乙個bonding,那麼接下來這個虛擬的bonding網絡卡將負責在不同的真實網絡卡之間做均衡。
因此,如果想做到基於包的路由均衡,那麼最好的辦法就是打上equalize補丁,如果覺得這個補丁不合適,那麼就自己實現乙個類似的補丁,反正linux對於原始碼的修改是很靈活的,即使你改不得原始碼,你也可以利用netfilter在postrouting這個點上掛載乙個自己的鉤子,從而實現乙個基於路由的負載均衡,對於bonding之類的負載均衡,只有在你確定所有參與均衡的網絡卡上所流逝的包可以使用乙個ip位址的時候再使用,本質上說,bonding所做的均衡對於網路層是不可見的!
流量負載均衡的分層
關於網路的負載均衡也是分層次的,曾經想過使用linux的bonding功能來做openvpn的tun網絡卡的負載均衡,在主機上啟動多個openvpn例項從而得到多個tun網絡卡,然後將多個tun網絡卡bond到乙個bonding上,可後來一想就不合適了,因為bonding所做的是鏈路層的負載均衡,所...
路由應用 使用路由實現負載流量均衡
要實現負載流量均衡,有很多方法,在linux上lvs是一種不錯的選擇,然則配置卻相對複雜,其實現原理很奇怪,在netfilter的input鏈上實現了乙個hook,然後處理後再將資料報output出去。我們知道netfilter的hook方式雖然功能強大,幾乎無所不能 你甚至可以在裡面註冊乙個usb...
路由應用 使用路由實現負載流量均衡
要實現負載流量均衡,有很多方法,在linux上lvs是一種不錯的選擇,然則配置卻相對複雜,其實現原理很奇怪,在netfilter的input鏈上實現了乙個hook,然後處理後再將資料報output出去。我們知道netfilter的hook方式雖然功能強大,幾乎無所不能 你甚至可以在裡面註冊乙個usb...