- Master內存佔用:
- 前兩種數據持久化存儲,最後一種不持久化,前面說過了
- 不會成爲系統的瓶頸
- 負載均衡:
- chunk的全部副本不會放在同一個機架
- 影響chunk副本建立位置的因素:①新副本所在CS的磁盤利用率低於平均水平;②限制每一個CS「最近」建立的數量;③每一個chunk的全部副本不能在同一個機架。
- 以上第二點保證一臺剛上線的CS不會由於磁盤利用率低致使大量chunk遷移上來而將它壓垮的狀況
- 副本數小於必定數量以後會複製,有一個優先級
- Master按期掃描副本分佈狀況,發現磁盤使用量或機器負載不均衡,將執行從新負載均衡操做
- 限制從新複製和從新負載均衡任務的拷貝速度,以避免影響正常讀寫
- 垃圾回收
- 延遲刪除
- Master按期檢查,若是刪除文件超過一段時間,就把文件從內存元數據中刪除,在心跳協議中Master通知CS哪些chunk被刪除
- 快照:
- 使用寫實複製機制生成快照
- 「快照」只增長chunk一個引用計數,修改的時候才複製成新chunk,再對其作修改
- 步驟:①經過租約機制回收對文件的每一個chunk寫權限,中止對文件的寫服務;②Master拷貝文件名等元數據生成一個新的快照文件;③對執行快照的文件的全部chunk增長引用計數
- 刪除chunk時只須要將chunk移動到每一個磁盤的回收站,新建chunk時能夠重用
- 磁盤和IO密集型應用,須要將磁盤和網絡操做異步化
4.2 Taobao File System(Blob存儲系統)
- 文檔、圖片、視頻通常成爲Blob數據,存儲Blob數據的系統成爲Blob系統,Blob文件系統的特色是寫入後基本都是隻讀,不多出現更新操做。
- 兩個問題:①Metadata信息量過大,沒法存儲在單臺機器上;②減小圖片讀取的IO次數
- 設計思路:多個邏輯圖片文件共享一個物理文件
系統架構:
- 借鑑GFS,可是有很大不一樣。
- 不維護文件目錄樹,每一個小文件用64位編號表示;因爲讀多寫少,能夠將寫流程作的更加簡單有效
- 一個集羣兩個NameServer(一主一備)、多個DataServer,NS經過心跳對DS監測。
- 每一個DS上有多個dsp進程,每一個dsp對應一個掛載點,一個掛載點對一個獨立磁盤
- 大量小文件合併成一個大文件(64M的Block),並有惟一ID,默認存儲三份
- 應用客戶端不緩存文件數據,只緩存NS元數據
- 追加流程:
- TFS讀多寫少,及時每次寫操做都通過NS也不會出現問題
- 不支持多客戶端寫,同一時刻每一個Block只能有一個寫操做,多個客戶端的寫操做會被串行化
- TFS寫流程不夠優化:①每一個寫請求都須要屢次訪問NS;②數據推送沒有采用流水線方式減小延遲
討論:
- 經過Tair進行對圖片去重。採用hash算法爲圖片文件計算指紋,圖片寫入以前在Tair中查找是否存在指紋,寫入之後須要將指紋以及在TFS中的位置信息保存到去重系統(Tair)中
- 圖片在TFS中的位置經過<Block id, File id>來標識
4.3 Fackbook Haystack
系統架構:
- 設計思路:多個邏輯文件共享一個物理文件(和TFS相似)
- 三部分:目錄(邏輯卷着和物理卷軸的對應關係、照片id到邏輯卷着之間的映射關係)、存儲(以一個很大的物理卷軸爲單位,多個存儲節點上的物理卷軸組成一個邏輯卷軸)、緩存(解決對CDN過於依賴的問題)
- Haystack緩存只緩存用戶瀏覽器發送的請求且要求請求的Haystack存儲節點是可寫的
- 寫流程:
- 請求Haystack目錄獲取邏輯卷軸 -> 生成照片惟一id將數據寫入每個對應的物理卷軸(每個物理卷軸都要成功)
- 只支持追加操做,更新照片時增長一張編號相同的照片到系統中,若邏輯卷軸和原來的不一樣,則在目錄中修改爲最新的邏輯卷着,若邏輯卷軸相同,以偏移大的照片文件爲準
- 容錯處理:
- 存儲節點出錯時,全部物理卷軸對應的邏輯卷軸標記爲只讀;未完成寫操做所有失敗;若故障不可恢復,須要進行拷貝(小時級別)
- 目錄有貯備數據庫作持久化儲存,由主備數據庫提供容錯機制
- Haystack目錄功能:
- ①提供邏輯卷軸到物理卷軸的映射,維護照片id到邏輯卷軸的映射;
- ②提供負載均衡;
- ③屏蔽CDN服務;
- ④標記某些邏輯卷軸爲只讀
5 分佈式鍵值系統
5.1 Amazon Dynamo
- 存儲原始數據,不解析數據的具體內容
- Dynamo設計時面臨的問題及最終的解決方案:
- 數據分佈 : 改進的一致性哈希(虛擬節點)
- 複製協議 : 複製寫協議
- 數據衝突處理 : 向量時鐘
- 臨時故障處理 : 數據回傳機制
- 永久故障後的恢復 : Merkle哈希樹
- 成員資格及錯誤檢測 : 基於Gossip的成員資格和錯誤檢測協議
數據分佈:
- 採用改進的一致性哈希算法將數據分佈到多個存儲節點中
- Dynamo中每一個節點維護整個集羣的信息,客戶端也緩存整個集羣的信息
- 爲保證每一個節點緩存最新的成員信息,全部節點週期性經過Gossip協議從其餘節點任意選擇一個與之通訊的節點,鏈接成功後交換集羣信息
- Gossip協議的執行過程請看書(P87)
- 種子節點
一致性與複製:
- 思路:假設數據存儲N份,DHT(一致性哈希表)定位到的數據所屬節點爲K,則數據存儲在節點K、K+一、....、K+N-1上。若是第K+i(0<=i<=N-1)臺機器宕機,則日後找一臺機器K+N臨時替代;若是第K+i臺機器重啓,則數據回傳;若永久失效,機器K+N須要進行數據同步操做(Merkle樹)
- NWR:N表示複製的備份數,R表示成功讀操做的最少節點數,W表示成功寫操做的最少節點數
- 當W+R>N時,就能保證當存在不超過一臺機器故障的時候,至少可以讀到一份有效數據
- 向量時鐘用[nodes,counter]對錶示,nodes表示節點,counter表示初始爲0的計數器,更新一次加1(P89)
- Dynamo只保證最終一致性,若是多個節點之間的更新順序不一致,客戶端可能讀取不到指望的結果
容錯:
- 數據回傳(臨時故障)
- Merkle樹同步(永久故障):Merkle樹非葉子節點對應多個文件(子節點值組合後的哈希值),葉子節點對應單個文件(文件內容的哈希值)
- 讀取修復(NWR)
負載均衡:
- 隨機分配。效果不錯,但可控性比較差
- 數據範圍等分+隨機分配
讀寫流程:
- 寫數據:
- 根據一致性哈希計算出存儲節點,選擇一個副本做爲本次寫的協調者
- 併發的往全部副本發送寫請求,每一個副本將接收到的數據寫入本地
- 副本寫入成功後回覆協調者
- 若寫入失敗,協調者會將它加入重試列表不斷重試
- 全部協調者寫入成功後,協調者回復客戶端寫入成功
- 讀數據:
- 根據一致性哈希選擇存儲節點,選擇一個副本做爲本次讀的協調者
- 協調者根據併發策略選擇R個副本,併發發送讀請求
- 當全部副本都讀取成功時,協調者回復客戶端
- 兩種狀況:數據一致和數據不一致