網絡負載均衡本質上是分布式業務中調度系統的一種實現。作為網絡請求分配的控制者,負載均衡器起著至關重要的作用。考慮到在任何一個網絡請求中,都有一個源地址和目標地址(源IP和目標IP)。這樣,在負載均衡器中,我們就可以利用這兩個IP,通過一種散列算法把請求分配到不同的服務器上。這種算法就是目標散列調度(利用目標IP)和源地址散列調度(利用源IP)。這兩種算法為靜態算法。
下面我們分別簡要講述一下。
目標地址散列調度(Destination Hashing Scheduling)算法
目標地址散列調度(Destination Hashing Scheduling)算法的基本原理是:此算法根據請求的目標IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載的,則將請求發送到該服務器,否則返回空。這里我們設定某個服務器的連接數目大于2倍的權值,則表示此服務器已超載。
目標地址散列算法流程
假設有一組服務器S = {S0, S1, ..., Sn-1},W(i)表示服務器Si的權值,C(i)表示服務器Si的當前連接數。ServerNode[]是一個Hash表。此表大小就是服務器的數目,也可根據算法模塊中的具體條件修改。
算法的初始化是將所有服務器順序、循環地放置到ServerNode表中。
| n = ServerNode[hashkey(dest_ip)]; if ( (n is dead) OR (W(n) == 0) OR (C(n) > 2*W(n))) then return NULL; return n; // 如果一切OK |
上面的算法中,hashkey()為散列函數。在實現時,一般采用素數乘法Hash函數,通過乘以素數使得散列鍵值盡可能地達到較均勻的分布。
Hashkey實現如下:
| static inline unsigned hashkey(unsigned int dest_ip) { return (dest_ip* 2654435761UL) & HASH_TAB_MASK; } 其中,2654435761UL是2到2^32 (4294967296)間接近于黃金分割的素數, (sqrt(5) - 1) / 2 = 0.618033989 2654435761 / 4294967296 = 0.618033987 |
源地址散列調度(Source Hashing Scheduling)算法
源地址散列調度(Source Hashing Scheduling)算法的基本原理是:此算法根據請求的源IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載的,則將請求發送到該服務器,否則返回空。這里我們設定某個服務器的連接數目大于2倍的權值,則表示此服務器已超載。、
可以看出,這種方式和目標地址散列調度方法是類似的,唯一的區別是以源地址作為散列鍵。
源地址散列算法流程
源地址散列算法流程和目標地址散列算法流程類似,采用的散列函數也一樣。唯一不同的是,需要將請求的目標IP地址換成請求的源IP地址,所以這里不再贅述。
總結
源地址散列調度和目標散列調度屬于兩種靜態的調度算法,在實際應用中,這兩種調度算法可以結合使用在防火墻集群中,它們可以保證整個系統的唯一出入口。


