equalize更新檔可以解決路由的負載均衡問題,然而其實作的代價卻是禁用了均衡路由的緩存,每次都要查詢路由表,查詢路由表的開銷抵消了一部分負載均衡帶來的性能提升。是以最好的方法就是既實作了路由的負載均衡,又實作了路由緩存,實作思路如下:
為每一系列需要在其間做負載均衡的路由準備一個均衡連結清單T,添加路由的時候連結在一起,核心進行下列動作:
1.資料到來,如果緩存中沒有找到路由則在路由表中查找路由
2.如果在緩存中找到了路由,但是該路由需要均衡,則按照均衡政策選擇一條路由
2.1.最簡單的方式就是輪轉政策,在連結清單中依次使用各個路由
然而這樣做會導緻一個問題,那就是緩存中到底緩存均衡路由的哪一條呢?事實上,由于它們是雙向連結清單(list_head)彼此連結在一起的,随便存一條就可以了,在緩存中查找的時候,隻要發現一條就帶有均衡标志的,那麼就緊接着周遊連結清單上的所有路由,隻要連結清單中有一條命中,就說明緩存命中,然後再根據均衡政策進行最終路由的選擇。
以上的方法實作地比較簡單,不是很和諧,并且如何将所有需要均衡的路由連結在一起也是個問題,如果是基于linux修改的話,就要大量修改源代碼。事實上,可以通過netfilter來實作,首先自定義一個鍊,然後實作一個target,這條自定義的鍊上添加所有的需要做負載均衡的路由,target中實作均衡政策最終選擇出一條路由,可以使用緩存,如果均衡路由很少的話也可以不使用緩存,反正怎麼實作都行,隻要按照netfilter的接口來即可,這就實作了一種階層化的設計,但是還是需要修改源代碼,我們将這個hook挂載在prerouting上,然後添加一個标志,如果netfilter找到了均衡路由,那麼就設定這個标志,然後在路由子產品中一旦查找到這個标記就不再按照正常的方式查找路由了(注意,不能用norouting标志)。需要注意的是,這種方式暫時還不能用于本地輸出的包,因為output這個hook點是在路由之後進行的。
本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1271179