---
# System prepended metadata

title: 6-1 Cluster-Based Scalable Network Services

---

# 6.1 Cluster-Based Scalable Network Services
## Introduction
- 由於網路發展，許多服務都是透過網路來提供，然而在部屬上有幾點需要考慮
    - 擴展性: 用戶數量變大時
    - 可用性: 要24/7運作
    - 成本: 拓展的經濟成本要便宜
- 比起使用高規格的一台電腦，使用由多個消費級電腦組成的叢集可以帶來上述三點的優勢
    - 擴展性: 可以持續增加新的節點，而不用淘汰本來的設備
    - 可用性: 部分結點失效，還是有其他結點在
    - 成本: 使用的是一般消費級電腦，其零組件可以有多種選擇並快速更換
- 叢集運算相比單台高規電腦，還是有些劣勢
    - 管理: 單台電腦叫好管理，而叢集會需要一些額外工具
    - 部件層級複製 vs 系統層級複製: 使用叢集，可以把一個大服務拆成多個小服務給不同結點運作，單台電腦的話就可以直接從系統層級做複製，而使用叢集的方式需要則會複雜化複製的議題
    - 部分失效: 單台電腦就只會有完全死去跟運作中，而多個小服務散佈於叢集的方式，則有可能發生某個小服務失效
    - 分享狀態機的狀態: 單台電腦可以完全了解狀態機的運作狀況，然而使用叢集，多個結點會互相不知道對方的狀態。但在設計時，藉由避免或最小化對於狀態機的需求，可以降低這個問題帶來的影響
- 眾多的網路服務，作者拆分成兩種模式
    - ACID
        - 傳統事務資料庫的 ACID，為了保持 strong consistency，會有較高的 cost 跟複雜度，也沒保證其服務的可用性
        - 情境如 網路交易 維護使用者資訊
    - BASE (Basically Available, Soft State, Eventual Consistency)
        - 不強求 strong consistency，主旨是為了最大化可用性，並保證 eventual consistency
        - 可容忍 Stale data
        - 會有 Soft state，可以快速響應使用者請求，我個人理解像快取
        - 而為了可以快速響應使用者請求，會提供 Approximate answers
- 簡單區分的話，可以把所有服務分成 ACID 或 BASE 兩類，然而也有實際案例是兩者共有存在
    - Yahoo! 把 soft state 的 資料庫歸類為 BASE，而對於使用者的設定歸類為 ACID

## Architecture
![image](https://hackmd.io/_uploads/HyNeDWpMA.png)
- 提出一種通用的 SNS (scalable network service) 架構
    - FE (frontend): 將服務與外界互動的介面，在收到請求後，會透過 user profile db 拿取不同使用情境的客製化參數，傳遞給 worker 進行邏輯處理
    - WP (worker pool): 包含快取和服務邏輯本身(資料轉換、資料跌帶等等)
    - Customization Database (圖中的 user profile db): 儲存不同使用者配置的參數，連帶影響邏輯處理的過程
        - 簡單例子像是許多網頁會記錄你偏好的背景色是深色還是淺色，此參數傳遞給 server 後，最終會呈現不同的樣子
    - Manager: 處理 load balancing，創建新的 worker
    - Graphical Monitor: 給管理員的系統監控
    - System-Area Network: 整個 SNS 處在的環境，確保低延遲 高頻寬
- 透過職責分層，可以更好地重複利用相同部件，分成 3 層
    ![image](https://hackmd.io/_uploads/S1JI176f0.png)
- SNS
    - 由 front ends, manager, SAN, and monitor 組成，旨在提供 scalability, load balancing, fault tolerance,和 high availability
    - 由於各角色職責明確且各層互相獨立，因此可以以線性的方式增長某部件的可負載量
    - FE 只負責將正確的客製化參數傳給 worker，並接收 worker 回傳的結果，如果是 error，就針對不同 error 做不同回復。FE 還會有一個 manager stub，主要是指派請求該交由哪個 wroker 處理
    - Worker 本身會有一個 worker stub，會向系統提供 worker 狀態，使 manager 可以處理系統附載。因此真正的 worker code 只需專注於邏輯本身，體現出 worker 越簡單越好的本質
    - 有一部分的機器屬於 overflow pool，以應付突發的請求數量
    - 透過 process peer fault tolerance，假如一個部件的某個節點壞了，其餘同層集結點會去重啟他，但他重啟完後，會再去向其餘節點拿取資料回復
- TACC
    - Transformation: 做資料轉換，如編碼，加解密
    - Aggregation: 從多處收集資料並整理
        - 舉例: 從多個網站收集當周活動的資訊，並整理出一份本周會有甚麼活動以及呈現各活動資訊的頁面
    - Customization:　如前面提到 user profile db 的作用，這樣使 worker 可以根據不同參數，彈性地對不同請求有著不同回傳結果
        - 舉例: 有一個 worker 是做相片壓縮，可以根據請求來源是網頁或是手機，傳給 worker 的壓縮參數就會不同，但是他還是可以正確地做壓縮，並回傳結果
    - Caching: 可以儲存 transformation 的結果或是轉換過程的中介值
- 透過各部件的職責劃分，對於提供 Transformation 和 Aggregation 的 worker，他可以只需要專注其真正的邏輯本身就好，不用去管目前系統的資源使用情況或是請求指派邏輯等等，這給與了相當大的彈性以及擴展性

## Case Study
- 透過實際案例來了解 SNS 架構的優勢
- TranSend (做網站呈現，會需要壓縮圖像來做快速響應)
    - Front Ends
        - 就是前端網頁，有很多 node 去接請求，高度平行化
        - 請求收到後，透過 user profile db 拿取參數，傳遞給 distiller (TranSend 的 worker)進行處理，並回傳結果。如果是 cache hit，也可以直接從 cache 回傳
    - Load Balancing Manager
        - 採用集中式管理，也就是一個 manager，比起分散式較好管理，也較好實作
        - 檢查 distiller 還在不在，附載量高不高，需不需要開新的 distiller
        - manager 與各部件之間透過 IP multicast group 交流，如此雙方不用一定要知道對方的卻切位置也可以交流
        - manager stub 在收到新的請求後會交由 manager 決定給哪個 distiller，同時快取這個決定。也因為有快取，就算 manager 暫時失效，也還是可以持續交付請求
        - worker stub 對請求做排隊，並時刻回傳 worker 狀態給 manager
        - 假如所有 worker 節點都滿了，但還是有請求，manager 會啟用 overflow nodes 來暫時頂替
    - Fault Tolerance and Crash Recovery
        - 如前面提到，因為有了快取，manager 管理的資訊成了 soft state，不用特別額外紀錄失效的其間發生了甚麼事
        - 透過 IP multicast group，worker 和 manager 互相可以知道對方是否還在，如果 worker 在取消註冊前不見，代表 worker 失效，可以將工作交由其他 worker 處理。如果 worker 發現 manager 無法溝通，代表 manager 失效，要去重新跟新 manager 註冊
        - 各部件唯一要做的就是在得知對方失效時，要去重啟他
        ![image](https://hackmd.io/_uploads/S10FEDAfR.png)
    - User Profile Database
        - 紀錄 user 的客製化參數
        - 讀大於寫
    - Cache Nodes
        - 在 TranSend 叫做 Harvest
        - manager stub 會將多個 harvest 當作一個虛擬快取，透過 hash 快速得知想要的資料在哪個快取節點上
        - distiller 可以將其結果或是轉換的中介值塞進去，用以加快處理以及回復速度
    - Datatype-Specific Distillers
        - 我個人理解這邊就是介紹 worker
        - 在前面有介紹過，受益於 SNS 架構，worker 只需專注於功能實現，因此可以透過各種SOTA技術達到目的
    - Graphical Monitor
        - 作者之前的論文有實作類似的工具，可以讓管理者遠端的監控整體系統的狀態
    - 總結
        - manager 管理的 load balancing data 都是 soft state，代表有可能是 stale 的，但也就是因為有快取，反而增加了容錯率。就算因為舊的快取導致請求導向失效的 worker，可以透過 timeout 機制，再轉發給其他 worker
        - worker 本身也有快取一些資料，假如目前附載很高，worker 可以直接把快取的資料回傳，就算他是舊的也沒關係，因為她也是相近的結果 (Approximate answers)
- HotBot (搜尋引擎)
    - HotBot 與 TranSend 在大部分元件都是採用相同運作方式，但還是有些不同
    - Load Balancing
        - 所有的搜尋資料分散在所有 worker 上，因此每次請求都會平行地找過所有 worker
    - Failure management
        - 不是像 TranSend 那樣使用 peer 的方式重啟部件，而是對節點的硬碟做 RAID，如此當某個節點就算壞了，也還是可以從其他結點拿資料
![image](https://hackmd.io/_uploads/B1ujnwAfR.png)

## 測試
- 這邊是對 TranSend 的架構測試，因為 TranSend 更加接近本篇論文的 SNS 架構
- 請求資料類型
    ![image](https://hackmd.io/_uploads/SJjoj_AzA.png)
    - 透過監控，發現最常傳輸的是 GIF, HTML, JPEG。其中也可以看到大部分的資料都大於 1KB (視為大檔)，這也是正式 TranSend 的目的，要壓縮這些圖像來加快傳輸
    - 1KB 以下的，不壓縮直接傳
- 突發流量
    - 前面提到使用 overflow pool 來暫時頂替 hold 不住的流量，可以使用兩種規則來決定何時使用 overflow pool
        - 一超過一定的附載量
        - 可以承受高流量多少時間
    - 而根據不同時間的請求流量圖，我們也可以判定在大部分時間要配置多少 worker 才足夠
- 快取效率
    - hit rate 隨著快取變大而上升，但是在超過一定使用者基數而撞到瓶頸
        - 使用者剛開始成長時，會受益於 cache，然而使用者越多，請求的東西越多樣，反而容易 miss
    - front end node 跟 cache 之間是採用 TCP 連線，同時也要跟 client 保持 TCP 連線，其本身內部又有很多 thread 要同時處理請求，front end node 花了大部分的時間在 kernel，而如果又加上 cache miss，front end 的效能便會降低
- Self Tuning and Load Balancing
    - Worker 本身會用 queue 使任務排隊，而當負荷超過門檻值，manager 便在開啟另一個 worker 分擔
    - 在下圖的實驗證實了這點，不管是流量足部增長或是某個 worker node 突然死掉，附載平衡都有成功執行
    ![image](https://hackmd.io/_uploads/HyH6yFAfC.png)
- Scalability
    ![image](https://hackmd.io/_uploads/S1wO5917A.png)
    - 透過壓力測試，測試系統擴展性，於每秒 25 請求以上會開始增加 worker node，於每秒 88 請求以上會開始增加 front end node，最終因為每秒 159 請求時已經沒有結點可以給與，資源耗盡
    - 而隨著 node 變多，內部的共用元件也受其影響 (user profile db, manager, SAN)
    - 經過測試，manager 出乎意料的可以處理非常多的 node 狀態資訊，高達高峰期的 3 倍。而 user profile db 也是相同結果，足夠處理大於高峰期的流量
    - SAN 作為內部各元件的互相溝通的網路，隨著 node 變多，頻寬被占滿，開始有些資訊沒有正確傳遞給 manager。作者提供兩種解法: 可以考慮將狀態資訊跟請求資料使用兩種不同網路傳遞，或是用效能更好的網路替換

## Conclusion
- 提出 SNS 架構，講求部件高度重複使用，且職責分配明確
- Worker node 為 stateless，且可專注於邏輯本身，不需額外考慮系統層面的東西，如附載量，容錯率
- 第一個提出 BASE 概念的論文
- 透過 TranSend, HotBot 實際案例了解 SNS 架構的運作方式
