1. 程式人生 > >Akamai在內容分發網絡中的算法研究(翻譯總結)

Akamai在內容分發網絡中的算法研究(翻譯總結)

程序 占用 election etl 時延 dal 負載均衡 文件訪問 散列

BLOOM FILTERS

Bloom filters的研究主要用在akamai的CDN中的兩個場景:1)索引管理優化;2)內容過濾。

Bloom filters是hash算法的一個變種,有非常優秀的空間效率(使用位數組)和時間效率(插入的時間復雜度穩定為常數),但是會有一定的錯誤率。直觀的說,bloom算法類似一個hash set,用來判斷某個元素(key)是否在某個集合中。和一般的hash set不同的是,這個算法無需存儲key的值,對於每個key,只需要k個比特位,每個存儲一個標誌,用來判斷key是否在集合中。其基本算法如下:

1)首先需要k個hash函數,每個函數可以把key散列成為1個整數

2) 初始化時,需要一個長度為n比特的數組,每個比特位初始化為0

3) 某個key加入集合時,用k個hash函數計算出k個散列值,並把數組中對應的比特位置為1。

4) 判斷某個key是否在集合時,用k個hash函數計算出k個散列值,並查詢數組中對應的比特位,如果所有的比特位都是1,認為在集合中。

通過一系列balabala的數學證明,可以得出最優hash函數個數k、位數組的位數m、存儲的最元素數n關系如下:

再通過一系列balabala的數學證明,可以得出正向錯誤率、位數組的位數m、存儲的最元素數n關系如下:

根據這兩個公式,可以進行參數調整以達到預期目標。Bloom filters的主要場景如下:

1)索引管理優化:有些cache系統的索引查詢可能由於訪問慢設備導致查詢操作較慢,可以在索引查詢之前用使用Bloom filters搭建一層索引cache提升索引查詢速度,如果Bloom filters中無法查到該文件,則認為該文件不存在,如果Bloom filters中可以查到該文件,則請求索引系統。在這種場景中由於存在元素刪除操作,Bloom filters不能使用位數組,每一位需要用一個數字變量來代替,當多個文件共用一位時使用遞增。

2)內容過濾:akamai統計了一個server cluster兩天中web文件訪問次數,如下圖,可以發現,在總共4億左右的文件中,有74%的文件僅被訪問過一次,90%文件訪問次數少於4次。

僅有單次訪問的文件是沒有必要落盤的,對於這種文件落盤會占用磁盤io和存儲,並且可能會將更熱的文件擠掉,進而降低cache命中率導致回源帶寬增高。

以此為基礎,akamai實現了“Cache-on-second-hit rule.”算法,即文件被第二次訪問才落盤,而記錄是否有過第一次訪問所使用的算法就是Bloom filters。

由於cdn上被訪問的文件數趨近於無窮,所以可以使用兩個Bloom filters交替來記錄文件第一次被訪問,當第一個Bloom filters已經到了能記錄的上限,就使用第二個Bloom filters,如果第二個也到了上限,則清空第一個Bloom filters重新使用第一個,每次查詢文件是否曾經被訪問需要查詢兩個Bloom filters。

Akamai實現了這個組件之後在測試環境進行了測試,從下面的測試結果來看,測試環境緩存命中率從74%上升到了83%,磁盤寫數據量下降了44%,磁盤操作時延下降了24%。

穩定分配問題

穩定分配問題的研究主要被用於全局負載均衡。

在cdn中的網絡中可以抽象出兩個概念。

1)map unit,map unit包含兩個元素,第一個元素是用戶ip的集合,第二個元素是map unit的類型(比如video、web等)

2)server cluster,akamai的服務器集群最小單位是cluster,一個cluster中包含若幹服務器。通過對map unit和server cluster進行穩定分配,可以實現全局負載均衡。

Akamai對Gale-Shapley算法進行研究拓展以用於解決全局負載均衡問題。標準的Gale-Shapley算法是被提出用來解決“穩定婚姻問題”的:為n個男性和n個女性互相找到最合適的配偶。算法的基本思路為,先對所有男士進行落選標記,稱其為自由男。且每個男士和每個女士均有一份排序,在排序中標記心儀的異性排名。當存在自由男時,進行以下操作:

(1)每一位自由男在所有尚未拒絕她的女士中選擇一位被他排名最優先的女士;

(2)每一位女士將正在追求她的自由男與其當前男友進行比較,選擇其中排名優先的男士作為其男友,即若自由男優於當前男友,則拋棄前男友;否則保留其男友,拒絕自由男。

(3)若某男士被其女友拋棄,重新變成自由男。

把這個算法基於以下的點進行拓展用於對map unit和server cluster進行匹配,也就是全局負載均衡。

(1)map unit和server cluster數目並不相等。在正常的cdn場景中,map unit的數目是要多於server cluster的數目。

(2)排序列表可以不完整。沒有必要建立一個map unit到所有的server cluster的性能分數排序,只需要選擇出該用戶組可能被調度到的服務器集群並進行打分排序即可。

(3)每個server cluster擁有不確定的任意的容量。估算server cluster的容量,並讓它為多個用戶組進行服務。

有了拓展的Gale-Shapley算法作為框架,再對機器的資源進行細化,一個server cluster中一臺機器的資源可以具體分為兩種:網絡資源和非網絡資源(如內存、cpu能力等)。網絡資源消耗用BPS來表示,非網絡資源消耗用FPS來表示。那麽可以用如下一個分層的資源樹來對一個機器的資源進行表示:

Node A代表機器的可用網絡資源為50BPS,node B代表機器可用的非網絡資源為30FPS,葉子節點代表不同的請求類型可以使用的FPS上限。

如果這時收到20單位video請求,每單位請求占用0.25FPS和1BPS,那麽資源樹剩余資源如上圖中藍字所示,node A剩余30BPS,node B剩余25 FPS,node C剩余25 FPS。

假設接下來收到26單位的web請求,每個請求消耗1FPS和0.2BPS,總共需要消耗26FPS和6.2BPS,這時發現當前機器的資源不足以承受全部的web請求,這時會根據Scoring(akamai用來評估客戶端和服務器的服務性能的組件)的輸出判斷該cluster和哪種map unit之間有更好的性能,如果結果是更適合於服務新來的web請求,則按照Gale-Shapley算法會驅逐4單位的舊video請求,並接納新來的web請求。反復進行這種驅逐操作可以讓全局實現最優分配。

感覺這個算法在具體的實現細節上還存在著很多挑戰。

一致性hash

一致性hash的研究被用來實現akamai的cdn局部負載均衡。感覺一致性hash應該和akamai有著千絲萬縷的聯系,比如兩者都是來源於MIT,一致性hash的提出人曾經在akamai工作等等。

當用戶被分配到一個server cluster之後,需要盡可能通過一致性hash將同樣的文件請求盡可能的hash到某臺已經在cache中緩存了該文件的機器上。所以可以通過一致性hash提升cache命中率,來達到提升性能和增加資源有效利用率的目的。

關於最基本的一致性hash算法網上有很多講解,一致性hash解決了當分布式系統中某臺cache down掉了或者新加入一臺cache可能會導致所有cache內容要重新洗牌的問題。並引入虛擬節點來優化算法結果。這些內容網上有很多,就不在重復了。下面說一些論文提到的akamai對於一致性hash的特性化改造:

1)對於熱點文件,為了防止請求壓在服務器組內同一臺機器上,需要將一個熱點文件映射到k臺服務器上進行分流,比較方便的方式為將文件映射在原本的hash出來的機器上以及之後的(k-1)臺機器上。不同的熱點文件集合在做一致性hash的時候,需要變換hash桶的排列,以防止由於hash值接近導致不同文件所映射的k臺機器大部分重合,從而導致機器高負載的問題。

2)用戶所使用業務也是做一致性hash需要考慮的輸入之一。對於一個在akamai上註冊的業務,會得到一個或多個統一分配的序列號,akamai可以按照序列號對對象存儲,並將對於同樣序列號的不同文件請求hash到cluster同一個機器(或集合),以盡可能滿足某些客戶端復用連接下載多個對象的需求(比如盡可能的把同一個web界面上的小對象存儲到一臺機器上)。

Leader election與數據一致性

即使兩個機器上的運行程序完全相同,由於運行時的分別獨立收集輸入數據可能導致輸出結果不相同的情況,這種情況需要leader election來在服務器組裏選擇一個leader來向其他的服務器分發運算結果,以統一輸出。Leader的選擇過程中會遇到數據一致性的問題,這種一致性的問題可以通過paxos或者raft算法來解決。我找到以下的兩個地址,感覺對兩個算法講的比較容易理解:

Paxos:paxos和分布式系統

Raft:Understandable Distributed Consensus

leader election有兩種:

1)At-Least-One Leader Election:至少要選擇一個leader。

2)At-Most-One Leader Election:最多只有一個leader被選擇出來。

比如當網絡出現問題導致一個集群出現兩個子網,如果使用At-Most-One Leader Election類的算法不會允許選擇出兩個leader,而是選擇寧可放棄leader選舉的過程,使用比較舊的決策數據。比如akamai用戶組劃分的過程,如果網絡中出現兩份用戶組劃分的結果,會引發全局負載均衡運算出現問題,所以在這種情況下不能選舉出兩個leader,寧可使用舊一點的用戶組劃分結果。

Akamai在內容分發網絡中的算法研究(翻譯總結)