HackMD
  • Prime
    Prime  Full-text search on all paid plans
    Search anywhere and reach everything in a Workspace with Prime plan.
    Got it
      • Create new note
      • Create a note from template
    • Prime  Full-text search on all paid plans
      Prime  Full-text search on all paid plans
      Search anywhere and reach everything in a Workspace with Prime plan.
      Got it
      • Options
      • Versions and GitHub Sync
      • Transfer ownership
      • Delete this note
      • Template
      • Save as template
      • Insert from template
      • Export
      • Dropbox
      • Google Drive
      • Gist
      • Import
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
      • Download
      • Markdown
      • HTML
      • Raw HTML
      • Sharing Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Note Permission
      • Read
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Write
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • More (Comment, Invitee)
      • Publishing
        Everyone on the web can find and read all notes of this public team.
        After the note is published, everyone on the web can find and read this note.
        See all published notes on profile page.
      • Commenting Enable
        Disabled Forbidden Owners Signed-in users Everyone
      • Permission
        • Forbidden
        • Owners
        • Signed-in users
        • Everyone
      • Invitee
      • No invitee
    Menu Sharing Create Help
    Create Create new note Create a note from template
    Menu
    Options
    Versions and GitHub Sync Transfer ownership Delete this note
    Export
    Dropbox Google Drive Gist
    Import
    Dropbox Google Drive Gist Clipboard
    Download
    Markdown HTML Raw HTML
    Back
    Sharing
    Sharing Link copied
    /edit
    View mode
    • Edit mode
    • View mode
    • Book mode
    • Slide mode
    Edit mode View mode Book mode Slide mode
    Note Permission
    Read
    Owners
    • Owners
    • Signed-in users
    • Everyone
    Owners Signed-in users Everyone
    Write
    Owners
    • Owners
    • Signed-in users
    • Everyone
    Owners Signed-in users Everyone
    More (Comment, Invitee)
    Publishing
    Everyone on the web can find and read all notes of this public team.
    After the note is published, everyone on the web can find and read this note.
    See all published notes on profile page.
    More (Comment, Invitee)
    Commenting Enable
    Disabled Forbidden Owners Signed-in users Everyone
    Permission
    Owners
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Invitee
    No invitee
       owned this note    owned this note      
    Published Linked with GitHub
    Like BookmarkBookmarked
    Subscribed
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    Subscribe
    # 3/22 SRE 讀書會共筆 --- 場地提供:PIXNET - 誠徵 [SRE 服務可靠度工程師](https://gist.github.com/jnlin/8329bea1c1ed92a1924da7e032304261),有興趣的朋友可聯繫 applyjob@pixnet.tw # 第23章管理關鍵狀態:利用分佈式共識來提高可靠性 by Jui-Nan Lin (PIXNET) ## 為何需要分散式系統? - 服務可能會當機,或是需要維護而重開 - 資料中心可能遇到災害而離線 - 一個不夠就蓋兩個 ## CAP 理論 - 三種特性不可能在分散式系統同時共存,只能滿足兩個 - 一致性 Constistency - 可用性 Availability - 分區容錯性 Partition tolerance - Partition 發生時,資料會不一致 - Eventually consistency 通常在分散式系統的作法,在某一段時間之後資料就會一致 - 例如 FB 貼文的讚,每個人看到的讚數不會剛好相同 - CP 或 AP ## 分散式系統中需要釐清的問題 - 系統中,哪個行程是 Leader ? - 系統中目前有哪些行程? - 有哪些資訊已經被插入待處理的佇列中 => 一致性問題 - .. ## 分散式系統案例圖 - 每個 Process 只跟附近兩個鄰居節點連結 - 沒有相連的要傳遞資料只能透過鄰居轉送 - 當兩條路線掛掉時就會出問題,造成資料不一致 ## ACID & BASE - 傳統的 RDBMS 提供 ACID - Atomicity 不可分割性 - Consistency 一致性 - Isolation 獨立性 - Durability 持久性 - 分散式資料庫提供 BASE - BA (basically availibility) 基本可用 = 不保證你一定拿到最新的東西 - S, Soft state 軟狀態 - E, Eeventual consistency 最終一致性 - 受到 clock drift 或 network partition 影響,導致資料不正確 - 使用只支援 BASE 的資料庫寫程式是很困難的 - 資料一性的問題應該在資料庫層解決 ## 常見的分散式系統協調失敗:叢集分裂 (腦裂) - 常見的 Active-Standby 架構 - heartbeat 網路緩慢時會發生什麼事情? - 發生兩個 Node 自認自己是 Active 的狀態 - PIXNET case study: DRBD 把兩邊資料串起來,就發生 split brain - - 不能使用簡單逾時的機制來實行領頭者選舉 ## 常見的分散式系統協調失敗:需要人為介入 - 如果有問題就把 Standby 提升為 active - 如果 standby 資料無法一致,就需要人工介入 - 若網路緩慢,會發生什麼事情? ## 常見的分散式系統協調失敗:有問題的演算法 - 每個節點啟動時,透過 discovery 方式,找到附近的 cluster 並加入 - 每個 cluster 選舉出一個 leader node - 出現 partition 時,每個各自選出新的 leader node - 造成 split brain 的資料損壞 - 需要一個演算法,實作「在訊息傳遞可能無線延遲的環境下實現非同步分散式一致化」 - 當機無法恢復與當機可以復原 - 拜占庭式問題 vs 非拜占庭式問題 - 電腦系統裡分散式問題 - 以前拜占庭的城邦,訊息需要傳令兵溝通,但可能中途會被殺掉或俘虜、收買,帶的訊息會遺失或被竄改,將軍們需要演算法確認大家對事情的看法 - 例如幾月幾號出兵攻打某地點,如果訊息被竄改或部分到達,演算法要能找出來真正的大家共識是什麼 - 比較難 - 非拜占庭式問題:保證中間訊息不被竄改,但可能會被延遲 - 比較簡單 - Paxos 協定 - Latex 作者發明的 - Paxos 協定 - 以「提案」為基礎 - 可能被接受或拒絕 - 提案有順序性(序號) - 被大多數的行程接受的提案就成功, 即 2n+1 的 node 同意就成功 - 有些節點的權重可能比較高 - Proposer 發送提案給 acceptor - 序號必須是唯一的,可以用 hostname 或 IP, MAC addr, etc. - 如果 acceptor 已經接受更高序號的提案,就不能接受較低序號的提案 - 假設 R > J,C 接受了 R 的提案,就不能接受 J 的提案 - 解決的問題 - 順序性:解決系統中訊息排序問題 - 大多數同意:解決一個 Proposal 不能有兩個值 - e.g. 兩個行程同時提案 - e.g. 一個行程提了兩個一樣的案子,值不同 - 缺點:沒有一個節點可以完整檢視已經被接收的所有值 - 基於 Paxos 實作的分散式系統 - Google Chubby - Zookeeper (使用衍生型,而非直接用 Paxos) ## Replicated State Machine 複製狀態機 RSM - 架構在一致化演算法 (e.g. Paxos) 上 - 有限狀態機:在現行的電腦系統,所有的狀態都是有限的,每個狀態都是工程師定義出來,什麼樣的值會滿足此狀態而進入下一個狀態 - 電腦的所有控制邏輯都是用有限狀態機在執行的 ## 領頭者選舉 - 寫一個程式,幫你選出 leader - server 需要選 leader 的時候,就呼叫該程式,得到 leader ID - server A 告訴程式自己是 leader,分散式系統就會紀錄 server A 是 ID ## Locking (以 Map-Reduce 為例) - Map 做完才往 Reduce 丟 - 可以寫一個有限狀態機檢查所有的 Job 都完成才會進入下一個 Reduce 狀態,可以應用在撰寫 Locking 機制 ## Message Queeue - Worker 可以去使用有限狀態機達成 MQ 功能 ## 分散式一致化系統的效能問題 - 實作比較慢,但還是有方法可以提高效能 - 系統負載的評估基準 - 單位時間提出 Proposal 的數量 - 請求類型 - 讀取資料的一致性要求 - 請求資料大小 - 提升效能的策略 - 局部佈署或是廣域佈署,例如靠近 client 端比較多 - 仲裁(同意)的過程,以及大部分行程分布的地理區域? - 是否使用 sharing, pipeline 或 batching 方式處理? ## 複合式 Paxos (Multi-Paxos) - 使用 strong leader 概念 - 系統只有一個提案者 - 避免多個提案者,造成提案成功率下降的問題 - 交替提案者時,很可能所有的提案都無法達到「大多數」 - 先選出 leader 提案者,接下來交給他 - 更換 leader 提案者的成本很高 - 可能出現 dueling proposers 狀況 - 衍生:raft ## 改善讀取的效能 - 如果不需要強一致性,資料就可以從「任意」的副本讀取 - 例如 Google Photon 系統,過期資料只會造成「額外工作」,而非錯誤結果 - 如果要保障讀取的資料是最新的 - 進行一致的唯讀操作 - 不給寫入,那當然是最新的! - 從一個保證有最新資料的副本讀取,例如 leader node - 使用法定租約 (quorem lease) 協定,用寫入效能換取效能 - 在有效期間內,對資料的修改操作,必須得到租約內所有行程的成功回應 - 租約通常很短,一秒, 兩秒, 十秒等等 - 租約的時間內,寫入效率會降低 - 如果資料大量集中在某些地理區域,法定租約很有用 - 使用者都在台灣,資料放在台灣,可是備份放到日本,可以把租約限制在台灣 node,寫入就會很快,就可以保證在台灣讀取的資料都是新的 ## 分散式系統網路延遲問題 - RTT, Round-Trip Time ; 理想上越低越好 - TCP/IP 的三項握手問題 - 使用 Proxy 來降低連線成本 - 只需要一兩個連線 ## Fast Paxos - 希望最佳化 Paxos 在 WAN 的效能 - 不要有提案者架構,直接讓 client 發訊息給 acceptor - 少了提案者這個中間人 - 少一個節點自然整個效率提升 - 反例:原本是 proxy,現在變成直接連,連線變多有可能導致效能變差 ## Stable Leaders - Raft 演算法 - 優點:leader 有最新的資料,可以優化讀取效率 - 缺點:Leader 是效能瓶頸 - 距離比較遠的使用者會有網路延遲問題 - 對外頻寬也會影響處理能力 ## 批次處理 - 一個提案者處理好幾個請求 - 中間沒有相依性的提案者可以多個同時進行 ## 磁碟存取 - 延遲的操作行為 - Proposer 寫入硬碟的操作 - Proposer 傳輸到 acceptors 的延遲 - acceptors 寫入硬碟 - 回復訊息的操作 - 可以算出每秒鐘的吞吐量 - 若一次 Random Write 10ms,則每秒鐘最多就 100 次操作 - RSM 的日誌可以和分散式演算法的日誌一起寫入 ## 佈署:副本數量 - 通常採取 2N + 1 佈署 當 N 個副本 lose,需要介入處理 ## 佈署:副本數量的選擇策略 - 愈多不一定越可靠 - 對可考性的要求 - 計畫內維護操作的頻率 ... ## 佈署:地理位置 - 系統需要處理的故障區域數量 - 故障的時候還要保證系統可以正常存取 - 系統的延遲性要求 ## 地理位置:故障域 - 案例:颱風橫掃美東,讓 AWS 機房掛掉 - 可能故障的範圍 - 實體機器 一個機櫃內實體機器共用的設施,例如電力 - 不一定要增加更多的故障域 ## 地理位置: 延遲性要求&災難回復 - 光速是固定的,沒有任何傳輸方法更快 - 使用者的地理位置很重要,決定故障域放哪 - 不是所有服務都需要低延遲或高流量,例如 IoT log - 真的需要加一個節點在靠近使用者的地方嗎?不一定 - 選擇地理位置時,也要考慮災難回復的處理 - 災難可能是因為軟體 bug 或人為疏失 ## 容量規劃 - 增加副本可以增加系統可承載數量 - 反例:五個副本一定要有三個可以用,最多可達到 40% rate,六個副本降低到 33% fail rate - 採用法定仲裁的系統在 - 副本所在的資料中心,也會影響可用性 - 例如六個副本,五個資料中心 ## 負載平衡 - 如果用戶集中在某個區域,把副本放在離用戶近的地方 - 但不能總是找最近的,因為過載時可能發生連鎖反應 - 解法可能需要切區域,一部分使用者導到稍微遠的區域 - leader 放在同一個地區可能造成頻寬瓶頸 - leader 故障時,可能造成資料中心頻寬不足 - 地理位置分布,對效能會有影響,主要是 RTT 造成 - 故障時 RTT 大幅增加 - 層級副本可以減少對中央的依賴 ## 監控分散式一致化系統 - 每個群組裡面的節點數量與健康狀態 - 持續落後的副本 - leader note 是否存在以及他改變的次數 - 交易的次數,可以算出吞吐量 - 提案者的數量,如果提出多接受少表示有效能問題 - 流量與延遲 ## 小結 - 標準的分而治之解決方案 - 大問題切小塊,解掉後再架一層上去 # 第24章分佈式週期性任務系統 by Luke Liu ## introduction - 定期週期被執行的指令 - 指令被存在 crontab 檔案 - crond daemon 分鐘檢查是否有預定的作業需要執行 ## 可靠度 - anacron - 檢測相關的排程有沒有被執行,如果超過期限的工作在,就執行該排程任務 ## Cron jobs and idempotency - 是否可以多次執行? - 跳過一次是否可以? - Google 傾向最差狀況跳過一次,而不執行多次任務 - 對資料敏感度高不高,例如漏掉一天的資料對伺服器有無影響,如果沒有可能可以接受,如果不能接受怎麼處理? - 例如手動回補資料 - 會跳過一次一定是有些問題,去看 log 找問題,而盡量不要執行多次 - 擁有者需監控任務的執行結果 ## Cron at large scale at Google - 擴充基礎建設 - job 從機器中隔離出來 - 執行任務,只需要指定需要的系統資源即可 - 分發系統會決定任務在哪些機器跑,例如不會分配到忙碌的機器 - 擴充需求 - 系統資源隔離,每個任務執行不會影響到其他任務 - 建立副本,避免單台機器故障,導致任務無法執行 ## Building Cron at Google - Tracking the state of cron jobs - cron 任務訊息,存在外部裝置,比較舊的存在別的地方像是 Hadoop - 本地端只存小量的任務訊息,Google 選擇的作法 ## the leader - 負責管理任務 - 紀錄任務的時間戳記 - 同步任務訊息 (副本) 給 follower - leader 掛了 follower 就可以馬上接手 ## the follower - 與 header 同步任務與系統狀態 - header 故障,follow 必須在一分鐘內選出新的 leader - 當新的 header 被選出來,所有還沒完成的任務都不需結束 - 同步的時間點:任務執行之前與之後 ## Resolving partial failures - 任務的執行多次結果都必須一樣,以便新的 header 選出後,可以重新執行 - 外部查詢,任務是否外部查詢,任務是否成功 ## Storing the state - Google 藉由寫 log 來同步任務狀態,衍生出兩個問題 1. log 必須定期壓縮,避免無限成長 只存最後一筆的狀態 2. log 必須存在某個地方 ## Running large cron - 避免同一時間大家同時跑,會搶資源,導致系統資源不足 - 在 cron 中使用問號「?」來增加系統彈性,今天跑無論是幾點跑都沒差,增加系統彈性

    Import from clipboard

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lost their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template is not available.


    Upgrade

    All
    • All
    • Team
    No template found.

    Create custom template


    Upgrade

    Delete template

    Do you really want to delete this template?

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in via Google

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Tutorials

    Book Mode Tutorial

    Slide Mode Tutorial

    YAML Metadata

    Contacts

    Facebook

    Twitter

    Feedback

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions

    Versions and GitHub Sync

    Sign in to link this note to GitHub Learn more
    This note is not linked with GitHub Learn more
     
    Add badge Pull Push GitHub Link Settings
    Upgrade now

    Version named by    

    More Less
    • Edit
    • Delete

    Note content is identical to the latest version.
    Compare with
      Choose a version
      No search result
      Version not found

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub

        Please sign in to GitHub and install the HackMD app on your GitHub repo. Learn more

         Sign in to GitHub

        HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Available push count

        Upgrade

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Upgrade

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully