讀構建可擴展分散式系統:方法與實踐11強一致性

来源:https://www.cnblogs.com/lying7/p/18422333
-Advertisement-
Play Games

1. 強一致性 1.1. 最終一致資料庫通過跨多台機器分區和複製數據集來獲得可擴展性,其代價是要跨副本維持強數據一致性以及允許衝突寫入 1.1.1. 在更新數據對象後,不同的客戶端可能會看到該對象的舊值或新值,直到所有副本都收斂到最新值 1.2. 另一類分散式資料庫提供一種可替代的模型,即強一致性數 ...


1. 強一致性

1.1. 最終一致資料庫通過跨多台機器分區和複製數據集來獲得可擴展性,其代價是要跨副本維持強數據一致性以及允許衝突寫入

  • 1.1.1. 在更新數據對象後,不同的客戶端可能會看到該對象的舊值或新值,直到所有副本都收斂到最新值

1.2. 另一類分散式資料庫提供一種可替代的模型,即強一致性數據系統,也稱為NewSQL或分散式SQL

  • 1.2.1. 強一致性系統試圖確保所有客戶端在數據對象更新後看到相同、一致的值

  • 1.2.2. 提供眾所周知的ACID(原子性、一致性、隔離性、持久性)資料庫事務來處理衝突更新的優勢

1.3. 事務和數據一致性,是現有單節點關係資料庫中每個人都熟悉的特征,消除了最終一致系統中固有的許多複雜性

1.4. 對於互聯網規模的系統,最佳結果當然是提供強一致資料庫的好處,同時具備最終一致系統的性能和可用性

1.5. 強一致資料庫則旨在提供與單節點系統相同的一致性保證

  • 1.5.1. 有了強一致性,你在編寫應用程式時便可以確保一旦資料庫確認更新,所有客戶端的後續讀取就會看到新值

1.6. 事務和副本一致性的解決方案由不同的技術社區在不同的時間開發

  • 1.6.1. 事務一致性

    • 1.6.1.1. 對於事務一致性,二階段提交演算法起源於Jim Gray(資料庫系統先驅之一)1978年的工作

    • 1.6.1.2. 在支持ACID事務的分散式資料庫中,你需要一種演算法,使得在單個事務中更新來自不同物理數據分區和節點的數據對象時能夠保持一致性

  • 1.6.2. 副本一致性

    • 1.6.2.1. 強副本一致性意味著在數據對象更新後,無論客戶端訪問哪個副本,都會看到相同的值

    • 1.6.2.2. 用於實現事務和副本一致性的演算法稱為共識演算法(consensus algorithm),它們使分散式系統中的節點能夠就某些共用狀態的值達成共識或協議

1.7. ACID事務

  • 1.7.1. 原子性(Atomicity)

    • 1.7.1.1. 對資料庫的所有更改都必須像單個操作一樣執行,所有更新必須都成功(提交)​,或者必須都失敗(回滾)​
  • 1.7.2. 一致性(Consistency)

    • 1.7.2.1. 事務將使資料庫處於一致狀態
  • 1.7.3. 隔離性(Isolation)

    • 1.7.3.1. 當事務正在進行時,事務修改的任何數據對其他併發事務是不可見的
  • 1.7.4. 持久性(Durability)

    • 1.7.4.1. 如果事務提交,則所做的更改是永久性的,並且在系統出現故障時可以恢復

1.8. 具有一致性保證和支持簡易單機編程的可擴展和高可用的分散式資料庫是數據管理系統的“必殺技”​

2. 一致性模型

2.1. 最強的一致性模型,也稱為嚴格一致性、嚴格可串列化或外部一致性的模型,是資料庫和分散式系統社區定義的兩個最具限制性的一致性模型的組合

2.2. 可串列化

  • 2.2.1. 可串列化通常稱為事務一致性,即ACID中的“C

  • 2.2.2. 事務對多個數據對象執行一次或多次讀取和寫入

  • 2.2.3. 可串列化保證在多個項目上執行一組併發事務時等同於事務按某種順序執行

2.3. 可線性化

  • 2.3.1. 可線性化可線性化與讀取和寫入單個數據對象有關

  • 2.3.2. 可線性化定義了使用掛鐘時間(wall clock time)的操作順序,掛鐘時間較近的操作會發生在掛鐘時間較遠的操作之後

3. 分散式事務

3.1. 從應用程式開發人員的角度來看,將事務視為一種簡化分散式系統故障場景的工具是最容易理解的

  • 3.1.1. 應用程式只需簡單地定義使用ACID屬性執行哪些操作,剩下的由資料庫完成

  • 3.1.2. 事務語義確保兩個操作要麼都成功要麼都失敗

  • 3.1.3. 鎖是確保事務隔離性所必需的

3.2. 二階段提交

  • 3.2.1. 經典的副本一致性演算法Paxos於1998年由Leslie Lamport首次提出

  • 3.2.2. 二階段提交(two-Phase Commit,2PC)是經典的分散式事務共識演算法

    • 3.2.2.1. 在SQL Server和Oracle等關係資料庫以及VoltDB和Cloud Spanner等現代分散式SQL平臺中廣泛應用
  • 3.2.3. 二階段提交也得到外部中間件平臺的支持

    • 3.2.3.1. Java Enterprise Edition中的Java Transaction API(JTA)和Java Transaction Service(JTS)

    • 3.2.3.2. 外部協調器可以使用XA協議驅動跨異構資料庫的分散式事務

  • 3.2.4. 當資料庫客戶端啟動事務時,選擇一個協調器

    • 3.2.4.1. 協調器分配一個全局唯一的tid(事務標識符)並將其返回給客戶端

    • 3.2.4.2. tid標識的是由協調器維護的數據結構,稱為事務上下文

    • 3.2.4.3. 事務上下文記錄了參與事務的資料庫分區或參與者,以及它們的通信狀態

    • 3.2.4.4. 上下文由協調器保存,持久地維護事務的狀態

  • 3.2.5. 準備階段(投票階段)

    • 3.2.5.1. 協調器向所有參與者發送一條消息,告訴它們準備提交事務
  • 3.2.6. 執行階段

    • 3.2.6.1. 當所有參與者都對準備階段做出答覆時,協調器將檢查結果

    • 3.2.6.2. 如果所有參與者都可以提交,則整個事務可以提交,協調器向每個參與者發送提交消息

    • 3.2.6.3. 如果任意參與者決定中止事務,或者在指定的時間段內沒有回覆協調器,協調器則發送一個中止消息給每個參與者

  • 3.2.7. 故障分析

    • 3.2.7.1. 故障可能是由系統崩潰或與應用程式的其他部分分區引起的

    • 3.2.7.2. 參與者故障

      3.2.7.2.1. 若參與者在準備階段完成之前崩潰,事務將被協調器中止,這是一個簡單的故障場景

      3.2.7.2.2. 也可能參與者先回覆準備消息,然後出現故障

      3.2.7.2.3. 從本質上講,參與者故障不會威脅一致性,因為它會達到正確的事務結果

    • 3.2.7.3. 協調器故障

      3.2.7.3.1. 如果協調器在發送準備消息後發生故障,參與者就會進退兩難

      3.2.7.3.1.1. 決定投票提交的參與者必須阻塞,直到協調器通知他們事務結果

      3.2.7.3.1.2. 如果協調器在發送提交消息之前或期間崩潰,參與者將無法繼續,因為協調器已經失敗並且在恢復之前不會發送事務結果

      3.2.7.3.2. 協調器故障沒有簡單的解決方法

      3.2.7.3.3. 唯一可行的解決方案是讓參與者等到協調器恢復後,檢查事務日誌

      3.2.7.3.4. 事務協調器恢復和事務日誌可以完成未完成的事務並確保系統一致性

      3.2.7.3.4.1. 缺點是參與者必須在協調器恢復前阻塞

  • 3.2.8. 二階段提交的弱點就是不能容忍協調器故障

    • 3.2.8.1. 與所有單點故障問題一樣,解決此問題的一種可能方法是在參與者之間複製協調器和事務狀態

    • 3.2.8.2. 如果協調器失敗,參與者可以被提升為協調器並完成事務

4. 分散式共識演算法

4.1. 實現副本一致性,使所有客戶端都能讀取不同數據對象副本的一致數據值,需要副本之間就數據值達成共識或協議

  • 4.1.1. 容錯共識演算法的基礎是原子廣播、全序廣播或複製狀態機等一類演算法

    • 4.1.1.1. 它們保證一組值或狀態以相同的順序嚴格一次(exactly once)傳遞到多個節點
  • 4.1.2. 二階段提交也是一種共識演算法

4.2. Leslie Lamport的Paxos(可能是最著名的共識演算法)是無領導的

  • 4.2.1. 無領導和其他複雜性使其實施起來非常棘手

  • 4.2.2. 變體Multi-Paxos

    • 4.2.2.1. Multi-Paxos與Raft等基於領導者的方法有很多共同之處,它們是分散式關係資料庫(如Google Cloud Spanner)實現的基礎

4.3. 為了容錯,共識演算法必須在領導者和追隨者都出現故障的情況下使應用程式仍能取得進展

  • 4.3.1. 當一個領導者失敗時,必須選出一個新的領導者,並且所有追隨者必須就同一領導者達成一致

4.4. 新的領導者選舉方法因演算法而異,但它們的核心要求

  • 4.4.1. 檢測有故障的領導者

  • 4.4.2. 一名或多名追隨者提名自己為領導者

  • 4.4.3. 投票選舉新的領導者,可能要進行多輪投票

  • 4.4.4. 一個恢復協議,用於確保在選舉出新領導者後所有副本都達到一致的狀態

4.5. 容錯共識演算法旨在僅與法定數或大多數參與者一起運行

  • 4.5.1. 法定數用於確認原子廣播和領導人選舉

4.6. Raft

  • 4.6.1. Raft是一種基於領導者的原子廣播演算法

    • 4.6.1.1. 單個領導者接收客戶請求,建立訂單,並向追隨者執行原子廣播以確保一致的更新順序
  • 4.6.2. Raft的設計是為了直接應對Paxos演算法的複雜性

  • 4.6.3. 被稱為“一種可理解的共識演算法”​,於2013年首次發佈

  • 4.6.4. 任期編號是一個邏輯時鐘,每個有效的任期編號都與一個領導者相關聯。

  • 4.6.5. 只有大多數追隨者需要在日誌中提交條目

    • 4.6.5.1. 意味著在不同時間提交的日誌條目可能在不同追隨者上並不相同
  • 4.6.6. 在多個需要共識的生產系統中實現,包括Neo4j和YugabyteDB資料庫、etcd鍵值存儲和分散式記憶體對象存儲Hazelcast等

5. 強一致性實踐

5.1. VoltDB

  • 5.1.1. VoltDB是最初的NewSQL資料庫之一

  • 5.1.2. 建立在無共用架構之上,關係表使用分區鍵進行分片並跨節點複製

  • 5.1.3. 每個VoltDB表分區都與一個CPU內核關聯

  • 5.1.4. 存儲過程被視為事務單元

  • 5.1.5. VoltDB是一個記憶體資料庫,它必須採取額外的措施來提供數據安全性和持久性

    • 5.1.5.1. 每個SPI都將命令日誌中的條目寫入持久存儲

    • 5.1.5.2. 每個分區還定義了一個快照間隔

  • 5.1.6. 從版本6.4開始,VoltDB支持可線性化,因此在同一個資料庫集群中具有最強的一致性級別

    • 5.1.6.1. VoltDB實現可線性化的原因是,它對所有分區的寫入順序達成了共識,而且事務是按順序執行的,不會交錯

5.2. Google Cloud Spanner

  • 5.2.1. 2013年,Google公司發表了Spanner資料庫論文

    • 5.2.1.1. Spanner被設計為一個強一致的全球分散式SQL資料庫

      5.2.1.1.1. Google將這種強一致性稱為外部一致性

    • 5.2.1.2. Cloud Spanner是一個基於雲的資料庫即服務(DBaaS)平臺

  • 5.2.2. Cloud Spanner使用Paxos共識演算法使副本保持一致

    • 5.2.2.1. 與Raft一樣,Paxos使一組副本就一系列更新的順序達成一致

    • 5.2.2.2. 二階段提交的實現表現為一個Paxos組

  • 5.2.3. Cloud Spanner對開發者隱藏了表分區的細節

    • 5.2.3.1. 隨著數據量的增長或收縮,它將跨機器動態地重新分區數據,將數據遷移到新位置來平衡負載
  • 5.2.4. Cloud Spanner支持ACID事務

    • 5.2.4.1. 如果事務僅更新單個分片中的數據,則分片的Paxos領導者處理請求

    • 5.2.4.2. 領導者首先獲取被修改行上的鎖,並將變更傳遞給每個副本

  • 5.2.5. TrueTime服務

    • 5.2.5.1. TrueTime為Google數據中心配備衛星連接的GPS和原子鐘,並提供具有已知上限時鐘偏差的緊密同步時鐘,據報道約為7 ms
  • 5.2.6. Cloud Spanner是GCP(谷歌雲平臺)不可或缺的組件

    • 5.2.6.1. GCP客戶群涵蓋金融服務、零售和游戲等行業,這些行業都被它強大的一致性保證以及高可用性和全球分散式部署能力所吸引
  • 5.2.7. Cloud Spanner啟發了基於Spanner架構的開源實現

    • 5.2.7.1. 這些實現不需要定製TrueTime式硬體,當然,代價是較低的一致性保證

    • 5.2.7.2. CockroachDB

    • 5.2.7.3. YugabyteDB


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Pintree 是一個開源項目,旨在將瀏覽器書簽導出成導航網站。通過簡單的幾步操作,就可以將書簽轉換成一個美觀且易用的導航頁面。 ...
  • 隨著JavaScript在前後端開發中的廣泛應用,測試已成為保證代碼質量的關鍵環節。 為什麼需要單元測試 在我們的開發過程中,經常需要定義一些演算法函數,例如將介面返回的數據轉換成UI組件所需的格式。為了校驗這些演算法函數的健壯性,部分開發同學可能會手動定義幾個輸入樣本進行初步校驗,一旦校驗通過便不再深 ...
  • title: Nuxt Kit 中的頁面和路由管理 date: 2024/9/17 updated: 2024/9/17 author: cmdragon excerpt: 摘要:本文介紹了Nuxt Kit中頁面和路由管理的高級功能,包括extendPages自定義頁面路由、extendRouteR ...
  • title: Nuxt Kit 中的上下文處理 date: 2024/9/16 updated: 2024/9/16 author: cmdragon excerpt: Nuxt Kit 提供的上下文處理工具,尤其是 useNuxt 和 tryUseNuxt,為模塊化開發提供了極大的便利。通過這些函 ...
  • duxapp是基於Taro二次開發的模塊化框架 使用這個框架,結合框架提供的UI庫和工具庫,能幫助你快速且高質量的完成項目,且能實現同時開發小程式、H5、APP(React Native),並且保證各個端的一致性 ...
  • 雲設計模式介紹以及它們如何幫助應對分散式計算的謬誤 作為構建分散式系統的軟體工程師,我們經常遇到諸如不可靠的網路、延遲問題和安全問題等挑戰。"分散式計算的謬誤"描述瞭如果未解決,可能導致系統故障的常見誤解。但認識到這些陷阱只是開始。真正的問題是:我們如何有效地剋服它們?這就是雲設計模式發揮作用的地方 ...
  • 1. Redis 1.1. 2009年首次發佈 1.1.1. 更註重原始性能和簡單性,而不是數據安全性和一致性 1.2. 主要吸引力在於它能夠同時充當分散式緩存和數據存儲 1.3. 維護一個記憶體中的數據存儲,也稱為數據結構存儲(data structure store) 1.4. 配置Redis將每 ...
  • 大家好,我是湯師爺~ 今天聊聊SaaS業務架構的業務能力分析。 業務能力概述 簡單來說,業務能力是企業“做某事的能力”。 業務能力描述了企業當前和未來應對挑戰的能力,即企業能做什麼或需要做什麼。業務能力建模的關鍵在於定義了企業做什麼,而不是如何做(由業務流程描述)。 以人才招聘為例,大多數公司都需要 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...