分散式系統之中心化複製集管理

来源:https://www.cnblogs.com/liangsonghua/archive/2019/08/25/www_liangsonghua_me_13.html
-Advertisement-
Play Games

文章首發於公眾號 松花皮蛋的黑板報 作者就職於京東,在穩定性保障、敏捷開發、高級JAVA、微服務架構有深入的理解 為了避免分散式系統單點異常引發的系統可靠性和高可用問題,可行的辦法就是數據冗餘,也稱為複製集,那麼複製集是怎麼管理的呢? 實際上管理方式可以有去中心化副本集和中心化副本集兩種。 去中心化 ...


文章首發於公眾號 松花皮蛋的黑板報

作者就職於京東,在穩定性保障、敏捷開發、高級JAVA、微服務架構有深入的理解

為了避免分散式系統單點異常引發的系統可靠性和高可用問題,可行的辦法就是數據冗餘,也稱為複製集,那麼複製集是怎麼管理的呢?

實際上管理方式可以有去中心化副本集和中心化副本集兩種。

去中心化副本集的特點是,無中心節點,所有節點地位平等,都可以接受讀寫請求,通過協商達到數據的一致。這種方式可用性比較強,只要大多數節點存活就可以對外提供服務,缺點也很明顯,它的協議流程複雜。

中心化副本集的特點是,節點之間有主從邏輯關係,主節點負責所有請求的寫操作,從節點複製主節點的數據,從節點集的作用是當主節點異常時從中選舉出一個新的主節點。這種方式將複雜問題轉換成一個有成熟解決方案的問題,將分散式的併發操作轉換成單點併發,雖然邏輯變得簡單了,但是主節點異常後,即使有主節點切換機制,也會出現短暫的不可用。

目前來看,數據的分散式存儲普遍採用中心化副本集管理方式,那麼接下來我將介紹這種方式的三個關鍵點,如下:

(1)、主節點和從節點之間的數據同步如何實現?方式是同步還是非同步?
(2)、從節點能否提供數據讀取數據,如果允許,如何保證客戶端不會讀取到重覆或者過時的數據?
(3)、主節點的選舉機制是怎麼樣的?

首先來說說主從節點數據更新流程。

如果採用同步的方式進行同步數據的話,意味著對於客戶端請求,主節點一直阻塞該請求,直到將數據成功複製到所有的從節點,才能向客戶端返回。顯然,同步模式下,可靠性非常好,但是更新可用性非常差,只要有一個節點異常,就無法完成更新。而且,響應延遲比較大,取決於副本集中網路延遲最大、處理速度最慢的節點。

如果採用非同步的方式進行同步數據的話,它只需要保證客戶端寫請求在一個節點上完成就立即響應返回,這裡說的節點,通常是主節點,不過當寫請求完成而複製操作還沒開始時主節點異常,這將導致更新失效,關鍵在於客戶端以為已經成功了,它永遠不會重試剛剛的寫操作。另外,需要註意的是,非同步模式下的同步是弱一致性的,客戶端有可能讀取不到最新的數據。

在數據同步的時候不管選擇同步模式和非同步模式都有各自的優劣,那麼在技術方案評估時,選擇哪種方案,取決於系統對一致性、可用性、響應延遲的要求。

在主從節點數據同步的流程中,還有一個關鍵點需要交待清楚,數據同步路徑問題,這樣描述可能讓人摸不著頭腦,你可以理解為數據具體是怎麼流動的。通常有兩種方式,分別為鏈式和主從模式。

鏈式的意思是數據從一個節點推送到相鄰最近的節點,最近節點可以用節點間心跳TTL來衡量,TTL表示IP數據包在電腦網路中可以轉發的最大跳數。這種方式的數據能夠充分利用網路資源,各個節點的壓力都非常均衡,但是需要經過多個節點,寫入延遲大,所以一般不採用這種方式,更多選用下麵要說的主從模式。

主從模式是指數據從主節點同步到從節點,但是這個數據一般是操作事件數據,這樣通知到從節點後,從節點會從主節點根據事件描述拉取相應的數據,優點是寫入延遲小,缺點是主節點的壓力比較大。

前面有說到,在主從節點數據同步流程中,有可能部分節點會寫入失敗,那這種情況應該怎麼處理呢?

分散式存儲中的數據複製服務大多數是一種儘力而為的服務模型,不保證一定成功,針對同步失敗,依賴於具體系統的處理方案。比如可以約束向客戶端返回寫入成功的前提條件,包括數據是否寫入主節點、數據是否寫入一定數量的節點等等,然後採取相應的補償事務,最終保證數據的一致性。

前面花了很大的篇幅來闡述數據同步問題,接下來談談第二個關鍵點,也就是從節點是否也可以提供讀取數據的服務。個人覺得,從節點如果能提供對外服務的話可以很好發揮出數據的局部性,位置相近的請求來源的延遲可以更低,當然可能會出現同步不及時的數據不一致情形,如果系統不太關心及時性的話那就無傷大雅。

最後再來說說主節點選舉機制,新的主節點可以是上級指定也可以是民主選舉方式選出來的。

鍵值對存儲資料庫Redis採取的就是上級指定方式,Redis集群中有一個哨兵節點,它與主從節點保持固定心跳,在超時時間內聯繫不到主節點,則判定主節點為異常狀態,然後將主節點中的一個從節點提升為新的主節點。另外一種民主選舉的方式使用的是共識演算法,就是多個節點對某個節點是否成為新節點這個事情達到一致的看法,不管是主節點是真的異常,還是網路問題導致誤以為主節點異常了。顯然,民主選舉需要保證在一個選舉周期內不會出現多個主節點,比如消息引擎Kafka約定序列號最大的那個才是真正的主節點。

好,今天分享瞭如何理解分散式系統中的數據複製問題,希望能幫助到你,歡迎分享給你的朋友們。

文章來源:www.liangsonghua.me

作者介紹:京東資深工程師-梁松華,在穩定性保障、敏捷開發、JAVA高級、微服務架構方面有深入的理解

 


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

-Advertisement-
Play Games
更多相關文章
  • html 基礎標簽 單標簽 1.註釋標簽: <! 註釋信息 看不到 ctrl+/ <! 網頁頭部導航盒子 換行標簽: 橫線標簽: 標題標簽: 段落標簽: 表示強調標簽: 文字 屬性:文字加顏色 color:改變文字顏色 size:改文字大小屬性 例如:文字 文本加粗顯示:或者 文字斜體顯示: 或 下 ...
  • django搭建BBS 登入&驗證碼的生成 文件結構 app 介面 migrations _\_inint\_\_.py admin.py apps.py bbsform.py models.py tests.py views.py avatar BBS \_\_inint\_\_.py setti ...
  • //這裡使用的是本地的資源文件,如果需要使用,請將代碼內的資源文件用CDN引入 ...
  • 生命不息,探索不止。通過回顧360搜索彩蛋開發方式的發展歷程,我們可以看到相關人員通過不斷努力地探索更加自動和智能的開發方式來解決工作中遇到的種種繁複的工作,從而有效降低成本,提高需求的落地效率。彩蛋開發方式的發展歷程只是你我在工作道路上的一個小小的縮影,我自認為這種探索精神應該滲透到一切項目的迭代... ...
  • 在這裡講一講這個案例的實現思路吧(個人見解)。。核心思想:為防止頁面刷新時倒計時失效的解決方案是:當每次刷新一次頁面時都執行一個函數 即下麵講到的 setStyle() 函數。這個函數會根據當前的 cookie 值判斷 是否處於倒計時階段 ,因為 cookie 值不會隨著 網頁的刷新而改變。 最後面 ...
  • 原生JS模擬滾動條 求滾動條的高度   可視內容區的高度 / 內容區的實際高度 = 滾動條的高度 / 滑道的高度 求內容區top的值   內容區距離頂部的距離 / (內容區的實際高度 可視內容區域的高度 ) = 滾動條距離頂部的距離 / ( 滑道的高度 滾動條的高度) 使用onm ...
  • 下載地址:http://kafka.apache.org/downloads http://mirror.bit.edu.cn/apache/kafka/2.3.0/kafka_2.12-2.3.0.tgz zookeeper.properties修改dataDir server.propertie ...
  • 跨域安全訪問API oauth2是一種用戶授權標準,jwt是傳遞token的一種消息標準,shiro是一個授權框架 1、JWT JSON Web Token (JWT)是一個開放標準(RFC 7519),它定義了一種緊湊的、自包含的方式,用於作為JSON對象在各方之間安全地傳輸信息。該信息可以被驗證 ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...