本技術涉及互聯網和數據庫,更具體地,涉及一種基于負載均衡設備的源端口快速搜索的方法和系統。
背景技術:
::1、負載均衡是應用高可用的基本要素。通過將流量分發到不同的后端服務器來擴展應用系統的服務吞吐能力,消除單點故障并提升應用系統的可用性。2、負載均衡器在接收到客戶端的tcp握手/udp包后,需要把請求的數據包根據負載均衡配置的規則產生發送給真實服務器的tcp握手/udp包,客戶端就好像在和真實服務器直接通信一樣。如圖2所示,客戶端數據包需要轉換為服務端數據包,然后發送給真實服務器,發送給真實服務器的tcp握手/udp包需要確定五元組數據(proto、sip、sport、dip和dport),通過配置的dnat規則負載均衡器可以快速找到dip和dport,通過配置的snat規則負載均衡器可以快速找打sip,根據snat、dnat規則確定了proto、dip、dport和sip,需要搜索sport。因為五元組確定一條連接,服務端上下文環境,新的連接不能和已經存在的連接存在相同的五元組,故四元組確定且相同的情況下,源端口必須不同。3、當前存在多種源端口并發搜索算法:4、1、源端口隨機碰撞搜索算法:5、創建一個有bucket_max個桶的哈希表(hashtable),用拉鏈法解決哈希沖突。6、a)四元組(proto、sip、dport、dip)已經確定的情況下,隨機一個源端口(端口排除0-1023),根據這個五元組計算一個哈希值hash,獲取哈希桶hashtable[hash%bucket_max];7、b)加寫鎖,通過五元組對比遍歷該哈希桶下的元素;8、c)如果搜索到了五元組相同的節點,則釋放寫鎖返回a)繼續執行,執行次數加1,執行次數大于n(1024)次后,跳轉到e;9、d)如果沒有搜索到五元組相同的節點,就創建五元組節點并插入該節點,釋放寫鎖,返回端口號;10、e)循環最大n(1024)次,如果無法搜索到有用的源端口,則返回源端口分配失敗。11、該算法簡單,但比較次數較多,搜索慢,且端口無法全部使用完。12、2、四元組(proto、sip、dport、dip)確定性搜索算法:13、struct?list結構體聲明如下:14、
名字
類型
prev
struct?list*
next
struct?list*
15、struct?port_node結構體聲明如下:16、
名字
類型
node
struct?list
lock
spinlock_t
hash
uint32_t
proto
uint8_t
dport
uint16_t
sip
uint8_t[16]
dip
uint8_t[16]
port_bitmap
uint8_t[8192]
17、創建有bucket_max個桶的哈希表hashtable(struct?list?hashtable[bucket_max]),用拉鏈法解決哈希沖突。算法描述如下:18、a)根據規則選定的四元組(proto、sip、dport、dip)產生一個哈希值hash,獲取哈希桶hashtable[hash%bucket_max];19、b)對該哈希桶加讀鎖,遍歷該哈希桶下的鏈表,確定是否有四元組相同的節點,接口傳入的四元組和struct?port_node對應的成員都相等則相同;20、c)如果存在四元組相同的節點,對該節點加自旋鎖,然后隨機一個端口號,檢查端口號對應的port_bitmap位是否為1((port_bitmap[port/8]>>(port%8))&0x1),如果是1則把該位置0(port_bitmap[port%8]&=~(1<<(port%8))),釋放自旋鎖,釋放讀鎖,返回該端口號;如果該位不為1,就往高位遍歷,找到第一個不為1的位,并置位0,并獲取該位在port_bitmap中的下標,就是端口號,釋放自旋鎖,釋放讀鎖,返回端口號;如果高位遍歷未找到為1的位,就從隨機的端口號往低位查找,找到為1的位就置為0,并釋放自旋鎖,釋放讀鎖,返回端口號;如果都未找到,就返回失敗。21、d)如果不存在四元組相同的節點,釋放讀鎖,對該哈希桶加寫鎖,四元組對比遍歷該哈希桶,如果不存在四元組相同的節點,就創建節點并初始化四元組、自旋鎖、port_bitmap(數組全部(除0-1023)置位1),加入該節點到該哈希桶中,隨機一個端口號(除0-1023),置對應的位為0,返回該端口號,釋放寫鎖返回端口號;如果存在四元組相同的節點,則從隨機端口號往高位搜索,未找到則往低位搜索,找到第一個為1的位,置位0,然后釋放寫鎖,返回端口號,如果都未找到,釋放寫鎖后,返回失敗;22、該算法在端口數目較多時,速度較快,可用端口數目變少時,遍歷port_bitmap耗時會顯著增加。23、綜上所述,有必要引入一種新的方法和系統,基于一種新的搜索結構能夠用較少的搜索次數,快速找到需要的源端口,以解決現有技術中存在的算法簡單、搜索比較次數較多、搜索慢,且端口無法全部使用完,以及可用端口數目變少時,遍歷port_bitmap耗時會顯著增加的技術問題,從而提升源端口搜索的效率和準確性,降低服務資源的消耗。技術實現思路1、針對上面提到的技術問題,本發明提供了一種基于負載均衡設備的源端口快速搜索的方法和系統,基于一種新的搜索結構,即基于源端口搜索數據結構的最高層、中間層和最低層之間的三層哈希結構,能夠在快速鎖定目標哈希桶的基礎上,準確并快速從目標哈希桶內的節點中確定目標源端口,以解決現有技術中存在的算法簡單、搜索比較次數較多、搜索慢,且端口無法全部使用完,以及可用端口數目變少時,遍歷port_bitmap耗時會顯著增加的技術問題,進而在減少搜索次數的基礎上,提升源端口搜索的效率和準確性,降低服務資源的消耗,使得端口資源得到充分利用。2、本發明提供了一種基于負載均衡設備的源端口快速搜索的方法,所述方法包括:3、s1,基于負載均衡設備,定義并初始化源端口搜索數據結構以及最高層、中間層和最低層之間的映射關系,根據所述源端口搜索數據結構創建哈希桶,并設定所述哈希桶的數量;s2,所述負載均衡設備實時接收源端口搜索任務請求,對所述源端口搜索任務請求進行解析,獲取所述源端口搜索任務請求對應的目標四元組數據,并根據所述目標四元組數據計算獲得目標哈希值;s3,根據所述目標哈希值和所述目標四元組數據從所述目標哈希桶中確定目標節點node,根據所述最高層、所述中間層和所述最低層之間的映射關系對所述目標節點中的源端口進行遍歷處理,并根據遍歷處理結果確定目標源端口;其中,所述哈希桶以鏈表的方式存儲各個所述節點node中的源端口搜索數據。4、優選地,所述源端口搜索數據結構,包括:成員名稱、成員類型、節點node、哈希值hash、協議proto、目的端口dport、目的地址dip、源地址sip、源端口sport、鎖lock、統計值count和三層哈希數據結構;其中,所述鎖lock,包括讀鎖、寫鎖和自旋鎖;所述三層哈希數據結構,包括所述最高層、所述中間層和所述最低層;所述最低層為m"p2[&],所述中間層為map1[j],所述最高層為map0[.],5、6、i為大于等于0的正整數,且i小于或者等于1024,s"z$%&((")*64t)為一個數據類型為uint64_t類型的元素的長度,m"p0[&]的最大長度為&×s&2345(7&8964_9);7、8、j為大于等于0的正整數,且j小于或者等于16,s"z$%&(uint64_t)為一個數據類型為uint64_t類型的元素的長度,map1[j]的最大長度為j×sizeof(uint64_t);9、10、k為大于等于0的正整數,且k小于或者等于16,map2[.]的最大長度為0xffff,0xffff為十六進制數值。11、優選地,步驟s1中,所述基于負載均衡設備,定義并初始化源端口搜索數據結構以及最高層、中間層和最低層之間的映射關系,根據所述源端口搜索數據結構創建哈希桶,并設定所述哈希桶的數量的步驟進一步包括:s111,基于負載均衡設備,定義所述源端口搜索數據結構,包括成員名稱、成員類型、節點node、哈希值hash、協議proto、目的端口dport、目的地址dip、源地址sip、源端口sport、鎖lock、統計值count和三層哈希數據結構,所述三層哈希數據結構包括最低層m"p2[&]、中間層map1[j]和最高層map0[.];s112,確定所述最低層m"p2[&]、所述中間層map1[j]和所述最高層map0[.]之間的映射關系,所述最低層m"p2[&]有i×sizeof(uint64_t)位,每一位的值表征一個源端口號,每一個map1[j]最多可以存儲j×sizeof(uint64_t)個源端口號對應的哈希值,所述中間層map1[j]中的每一位的值為所述最低層m"p0[&]中64位的整數值,所述最高層map0[.]的每一位的值為所述中間層map1[j]中64位的整數值;s113,基于所述源端口搜索數據結構和所述映射關系,根據設定的所述哈希桶的數量創建所述哈希桶;s114,根據所述哈希桶的數量為各個所述哈希桶添加編號,并對各個所述哈希桶中全部源端口搜索數據的值進行初始化;其中,s"z$%&(uint64_t)為一個數據類型為uint64_t類型的元素的長度,i為大于等于0的正整數,且i小于或者等于1024,j為大于等于0的正整數,且j小于或者等于16,k為大于等于0的正整數,且k小于或者等于16;初始化時,所述哈希桶中的源端口搜索數據的值均為空值;所述哈希桶的數量為hnum,hnum為大于或等于1的正整數;所述哈希桶的編號的最小值為零,最大值為(hnum-1)。12、優選地,步驟s2中,所述對所述源端口搜索任務請求進行解析,獲取所述源端口搜索任務請求對應的目標四元組數據,并根據所述目標四元組數據計算獲得目標哈希值的步驟進一步包括:s21,根據所述源端口搜索任務請求的解析結果,獲取所述源端口搜索任務請求對應的協議proto、目的端口dport、目的地址dip和源地址sip;s22,根據所述源端口搜索任務請求對應的協議proto、目的端口dport、目的地址dip和源地址sip,獲取所述目標四元組數據的目標哈希值secondhash;其中,所述目標四元組數據包括所述協議proto、所述目的端口dport、所述目的地址dip和所述源地址sip。13、優選地,步驟s3中,所述根據所述目標哈希值和所述目標四元組數據從所述目標哈希桶中確定目標節點node,根據所述最高層、所述中間層和所述最低層之間的映射關系對所述目標節點中的源端口進行遍歷處理的步驟進一步包括:s31,根據所述目標哈希值secondhash和所述哈希桶的數量hnum確定所述目標哈希桶,如果.目標哈希值secondhash%哈希桶的數量hnum;的余數等于所述哈希桶的編號,則確定所述編號對應的哈希桶為所述目標哈希桶;s32,對所述目標哈希桶添加讀鎖,并對所述目標哈希桶中的節點node進行遍歷,確定所述目標節點node,如果所述節點node中的全部四元組數據的哈希值均大于或者小于所述目標哈希值secondhash,則跳轉至步驟s33,如果所述節點node中存在哈希值等于所述目標哈希值secondhash的四元組數據,且所述四元組數據與所述目標四元組數據相等,則確定所述節點node為所述目標節點node,并跳轉至步驟s34;s33,重復步驟s32,直到所述目標哈希桶內的所有節點node全部遍歷完成,如果所述目標哈希桶內中不存在所述目標節點node,則釋放所述目標哈希桶的讀鎖,并跳轉至步驟s35,如果所述目標哈希桶內存在所述目標節點node,則跳轉至步驟s34;s34,對所述目標節點node添加自旋鎖,并根據所述最高層、所述中間層和所述最低層之間的映射關系,從所述目標節點node中確定所述目標源端口,并向所述源端口搜索任務請求返回執行結果,如果所述目標節點node中沒有可用的源端口,則跳轉至步驟s35;s35,對所述目標哈希桶添加寫鎖,根據所述目標四元組數據創建所述新的節點node,根據所述最高層、所述中間層和所述最低層之間的映射關系,確定所述新的節點node的四元組數據和源端口sport,以及源端口sport的統計值count和鎖lock,并更新至所述目標哈希桶中,然后將所述新的節點node設置為所述目標節點node,返回步驟s34;其中,所述目標節點node為哈希值等于所述目標哈希值secondhash,且四元組數據與所述四元組數據相等的節點node。14、優選地,所述s33的步驟還包括源端口分配處理的步驟,具體為:s33-1,對所述目標節點node對應的最高層map0[.]從低位到高位進行校驗,獲取第一校驗值,如果所述第一校驗值為零,則返回源端口分配失敗的通知,所述第一校驗值大于零,跳轉至步驟s33-2;s33-2,對所述目標節點node對應的中間層map1[j]從低位到高位進行校驗,獲取第二校驗值,如果所述第二校驗值為零,則返回源端口分配失敗的通知,如果所述第二校驗值大于零,從所述中間層map1[j]中確定值均為1的最低位,跳轉至步驟s33-3;s33-3,根據所述最低位對所述目標節點node對應的最低層m"p2[&]從低位到高位進行校驗,根據所述最低層m"p2[&]中值為1的最低位獲取第三校驗值,并確定所述目標源端口;其中,所述第一校驗值為first,所述第二校驗值為second,所述第三校驗值為three,所述目標源端口為port,則15、n4o9=(first×64+second)×64+9ho33;16、*h=$$=m"p2[5&o19×64+13u48v];17、second=map1[5&o19]。18、優選地,所述s33-3,在確定和分配所述目標源端口后還包括端口重置處理的步驟,具體為:s33-31,將所述目標節點node對應的最低層m"p2[first×64+second]的第*h=$$位置為零,如果第*h=$$位置為零后的所述目標節點node對應的最低層m"p2[first×64+second]的值為零,則跳轉至步驟s33-32,否則,返回搜索結束的通知,并釋放所述目標節點node的自旋鎖;s33-32,將所述目標節點node對應的中間層map1[5&o19]的第second位置為零,并返回搜索結束的通知,釋放所述目標節點node的鎖lock;其中,所述鎖lock包括讀鎖、寫鎖和自旋鎖。19、優選地,步驟s35中,所述根據所述目標四元組數據創建所述新的節點node,根據所述最高層、所述中間層和所述最低層之間的映射關系,確定所述新的節點node的四元組數據和源端口sport,以及源端口sport的統計值count和鎖lock,并更新至所述目標哈希桶中的步驟進一步包括:s34-1,根據所述源端口搜索任務請求對應的四元組數據獲取所述新的節點node的編號,以及所述新的節點node中與所述四元組數據對應的全部源端口sport;s34-2,基于所述最高層、所述中間層和所述最低層之間的映射關系,將所述新的節點的編號,以及所述新的節點中與所述四元組數據對應的全部源端口sport進行排序并存儲至所述目標哈希桶中。20、優選地,所述s34-2的步驟進一步包括:21、s34-21,如果所述新的節點node的協議proto的值小于所述目標哈希桶中的另一個節點node的協議proto的值,則在所述目標哈希桶中,所述新的節點node對應的源端口搜索數據的存儲位置在所述另一個節點node對應的源端口搜索數據在的存儲位置之前,如果所述新的節點node的協議proto的值大于所述目標哈希桶中的另一個節點node的協議proto的值,則在所述目標哈希桶中,所述另一個節點node對應的源端口搜索數據的存儲位置在所述新的節點node對應的源端口搜索數據在的存儲位置之前,如果所述新的節點node的協議proto的值等于所述目標哈希桶中的另一個節點node的協議proto的值,則跳轉至步驟s34-22;22、s34-22,如果新的所述節點node的目的端口dport的值小于另一個節點node的目的端口dport的值,則將在所述目標哈希桶中,所述另一個節點node對應的源端口搜索數據的存儲位置在所述新的節點node對應的源端口搜索數據在的存儲位置之前,如果所述新的節點node的目的端口dport的值大于所述目標哈希桶中的另一個節點node的目的端口dport的值,則在所述目標哈希桶中,所述另一個節點node對應的源端口搜索數據的存儲位置在所述新的節點node對應的源端口搜索數據在的存儲位置之前,如果所述新的節點node的目的端口dport的值等于所述目標哈希桶中的另一個節點node的目的端口dport的值,則跳轉至步驟s34-23;23、s34-23,如果所述新的節點node的源地址sip的值小于所述目標哈希桶中的另一個節點node的源地址sip的值,則在所述目標哈希桶中,所述另一個節點node對應的源端口搜索數據的存儲位置在所述新的節點node對應的源端口搜索數據在的存儲位置之前,如果所述新的節點node的源地址sip的值大于所述目標哈希桶中的另一個節點node的源地址sip的值,則在所述目標哈希桶中,所述另一個節點node對應的源端口搜索數據的存儲位置在所述新的節點node對應的源端口搜索數據在的存儲位置之前,如果所述新的節點node的源地址sip的值等于所述目標哈希桶中的另一個節點node的源地址sip的值,則跳轉至步驟s34-24;24、s34-24,如果所述新的節點node的目的地址dip的值小于或者等于所述目標哈希桶中的另一個節點node的目的地址dip的值,則在所述目標哈希桶中,所述另一個節點node對應的源端口搜索數據的存儲位置在所述新的節點node對應的源端口搜索數據在的存儲位置之前,如果所述新的節點node的目的地址dip的值大于所述目標哈希桶中的另一個節點node的目的地址dip的值,則在所述目標哈希桶中,所述另一個節點node對應的源端口搜索數據的存儲位置在所述新的節點node對應的源端口搜索數據在的存儲位置之前;25、s34-25,重復步驟s34-21、s34-22、s34-23和s34-24,直到所述目標哈希桶中的所有節點node全部對比排序完成,則確定所述新的節點node對應的源端口搜索數據在所述目標哈希桶中的存儲位置,根據所述存儲位置將所述目標哈希值secondhash、所述新的節點node的編號、與所述四元組數據對應的五元組數據,以及最高層、中間層和最低層之間的映射關系存儲至所述目標哈希桶中,并將所述目標哈希桶的鎖lock更新為讀鎖,將所述新的節點node的統計值count設為零;26、其中,所述五元組數據包括所述協議proto、所述目的端口dport、所述目的地址dip、所述源地址sip和所述源端口sport。27、相應的,本發明還提供了一種基于負載均衡設備的源端口快速搜索的系統,所述系統包括搜索初始化模塊、搜索請求預處理模塊和源端口搜索確定模塊;28、其中,所述搜索初始化模塊,用于定義并初始化源端口搜索數據結構以及最高層、中間層和最低層之間的映射關系,根據所述源端口搜索數據結構創建哈希桶,并設定所述哈希桶的數量;所述搜索請求預處理模塊,用于所述負載均衡設備實時接收源端口搜索任務請求,對所述源端口搜索任務請求進行解析,獲取所述源端口搜索任務請求對應的目標四元組數據,并根據所述目標四元組數據計算獲得目標哈希值;所述源端口搜索確定模塊,用于根據所述目標哈希值和所述目標四元組數據從所述目標哈希桶中確定目標節點node,根據所述最高層、所述中間層和所述最低層之間的映射關系對所述目標節點中的源端口進行遍歷處理,并根據遍歷處理結果確定目標源端口;所述哈希桶以鏈表的方式存儲各個所述節點node中的源端口搜索數據。29、本發明通過應用以上技術方案,實現了通過定義和構建源端口搜索數據結構的最高層、中間層和最低層之間的三層哈希結構,在速鎖定目標哈希桶的基礎上,準確并快速從目標哈希桶內的節點中確定目標源端口,以解決現有技術中存在的算法簡單、搜索比較次數較多、搜索慢,且端口無法全部使用完,以及可用端口數目變少時,遍歷port_bitmap耗時會顯著增加的技術問題,進而在減少搜索次數的基礎上,提升源端口搜索的效率和準確性,降低服務資源的消耗,使得端口資源得到充分利用。當前第1頁12當前第1頁12