1. 程式人生 > >分散式環境下資料一致性的設計總結

分散式環境下資料一致性的設計總結

相關理論:

在聊分散式環境下資料一致性問題之前我們先看一個理論(事務的ACID一定要知道的)CAP理論:

CAP理論由加州大學伯克利分校的計算機教授Eric Brewer在2000年提出,其核心思想是任何基於網路的資料共享系統最多隻能滿足資料一致性(Consistency)、可用性(Availability)和網路分割槽容忍(Partition Tolerance)三個特性中的兩個,三個特性的定義如下:

C資料一致性:等同於所有節點擁有資料的最新版本

A可用性:資料具備高可用性

P分割槽容忍:容忍網路出現分割槽,分割槽之間網路不可達

        在大規模的分散式環境下,網路分割槽是必須容忍的現實,於是只能在可用性和一致性兩者間做出選擇。 CAP理論帶來的價值是指引我們在設計分散式系統時需要區分各種資料的特點,並仔細考慮在小概率的網路分割槽發生時究竟為該資料選擇可用性還是一致性。

       我們本次聊的是資料一致性,所以一切前提是CP。並且以資金賬戶解凍為例。

場景分類:

資料一致性場景大致可以分為弱一致性,強一致性。

所謂的弱一致性,就是有可能在某個時刻資料非一致,但是到達某個時間點以後總能保持一致,也即我們所說的最終一致性。 而強一致性就是需要保證資料的一致性是實時的,每一時刻都保持一致。

解決方案總結:

弱一致性的解決方案:

  1. 由外圍系統重試,自身實現冪等,保證最終一致性。

比如使用者解凍功能,後臺web介面提供重試按鈕,第一次操作可能解凍沒有成功。使用者可以不停的點選直到解凍成功,自身業務系統只要實現冪等即可。

該方案設計簡單,業務系統不用太關心一致性的問題,只要自身系統實現業務冪等即可,無耦合性。

2. 依賴於事務型訊息,通過訊息重試,保證最終一致性。

       上層業務無重試,無補償,只能依賴於系統自身保證一致性。可以在完成合約解凍結之後,傳送事務型訊息,只要訊息傳送和合約解凍成功即可返回外圍系統成功。後邊賬務的解凍依賴於訊息中心的訊息投遞,如果失敗,訊息中心會由重試機制直到成功。如果業務推進不下去的化,需要人工接入。

       該方案設計相對簡單,只需要在原有流程中加入傳送訊息的邏輯,賬務那邊資料的保證交給訊息中心去搞定。但是自身系統需接入訊息中心,被呼叫方需要實現業務冪等,增加訊息中心的耦合依賴。自身無法控制投遞規則。

  1. 依賴於排程任務,通過排程任務重試,保證最終一致性。

上層業務無重試,無補償,只能依賴於系統自身保證一致性。可以在完成合約解凍結之後,本地落地一張非同步任務表。由定時任務定時掃描去呼叫賬務進行解凍。

       該方案對比依賴於訊息中心的方案主要區別點在於失敗後的資料落地在本系統內,不是訊息中心,系統需增加一步任務表。自身能夠完全掌握待恢復的資料,是否重試,是否終止都由自身系統決定,靈活性增加了。減少了訊息中心的耦合,但是會增加排程中心的依賴。

強一致性的解決方案:

1. 引入協調者:

強一致性的解決依賴於中間協調者,中間協調者能夠從全域性把控該次業務涉及到的哪幾系統。是否都成功了,是否存在部分失敗,最終要提交還是要回滾。

       已有的理論就是2PC兩階段提交理論。我自己理解的兩階段是這樣的。

       (發起方:發起分散式事務的系統。 引數者:被呼叫的系統)

第一階段: 準備階段。

發起方問參與者們你們可以提交嗎? 參與者通常在本地事務試著提交一把,通常的做法就是設定中間表,將資料先寫入中間表,如果寫入成功,那麼意味著我是可以提交了。

第二階段:提交階段。

發起方告訴協調者,好了參與者們都可以提交了,我先提交本地事務,你再去提交(或者回滾)他們的事務吧。

通過第一階段的試提交,保證了整個分散式事務在第二階段的成功率,使得如果出現不可提交的情況的時候能夠及早發現及早回滾。可提交的情況下,能夠保證正確提交。

該方案能夠解決強一致性的需求,但是需要大量的接入成本。業務系統耦合兩階段框架,參與者系統需要保證冪等,增加中間表,並且實現二階段提交回滾的方法供協調者呼叫。

總結:

業務上應該視業務需求考慮是需要強一致性還是弱一致性,然後再根據自身情況考慮選取哪種方案更加適合自己。以上分析都是基於自己的理解進行的總結,只是從巨集觀上進行了表達,裡面還有很多細節需要探索。其中可能存在著某些錯誤,如果有請各位一定指出,互相學習。

相關推薦

分散式環境資料一致性設計總結

相關理論: 在聊分散式環境下資料一致性問題之前我們先看一個理論(事務的ACID一定要知道的)CAP理論: CAP理論由加州大學伯克利分校的計算機教授Eric Brewer在2000年提出,其核心思想是任何基於網路的資料共享系統最多隻能滿足資料一致性(Consistency)、可用性(Availabilit

分散式系統資料一致性解決之分散式事務

一、定義 參考百度百科定義: 分散式事務是指事務的參與者、支援事務的伺服器、資源伺服器以及事務管理器分別位於不同的分散式系統的不同節點之上。 二、分散式事務的理論 2.1 CAP理論 CAP 是指在一個分散式系統下, 包含三個要素:Consistency(一致性)、

Mybatis一級快取導致分散式環境的查詢髒資料

    Mybatis一級快取,也稱本地快取,預設是SqlSession級別的快取。在一次程式與資料庫的會話(Sqlsession)中,mybatis會維護一個以hashmap為儲存結構的一級快取,在這個會話中,只要在兩次相同條件的查詢中間,這個會話裡沒有出現增刪改的操作,那

Hadoop分散式環境資料抽樣

1. 問題由來 Google曾經有一道非常經典的面試題: 給你一個長度為N的連結串列。N很大,但你不知道N有多大。你的任務是從這N個元素中隨機取出k個元素。你只能遍歷這個連結串列一次。你的演算法必須保證取出的元素恰好有k個,且它們是完全隨機的(出現概率均等)? 這道題的解

分散式事務 解決資料一致性(一)事務原則與實現:事務、sql事務

事務: 定義:       是以一種可靠、一致的方式,訪問和操作資料庫中資料的程式單元。 原則:      *a、 原子性   * b、一致性  * c、隔離性 &nbs

分散式系統「資料一致性

  一、為什麼需要事務        如果說「共識」解決的是「水平」問題,那麼「事務」解決的是「垂直」問題。是如何讓一條繩上的螞蚱共同起舞?          事務只是一個計算機術語,

分散式環境 session 的跨域共享原理

一、什麼是 session 共享 ? 如上圖,是一個簡單的分散式環境,以登入來說,當用戶發出請求,通過負載均衡,可能會走tomcat1伺服器,也可能會走tomcat2伺服器,此時就有可能,我們在tomcat1上實現了登入,儲存了session,但是tomcat2並沒有儲存,當有請求

【資訊保安超級實踐系列】企業在雲環境資料基礎設施的安全

企業在雲環境下資料基礎設施的安全實踐當越來越多的企業開始採用雲服務,安全問題往往成為待考慮的問題。在傳統IT環境中,企業預設的邏輯架構是可信的,資料在自己手裡,系統部署在自己的資料中心,有自己很清晰的網路安全邊界,邊界之間會有一個相對比較清晰的防火牆做隔離,有可控的安全策略的管理。 然而一旦雲化之後,企業雲資

Spring Cloud (四): 分散式環境自動發現配置服務

前一章, 我們的Hello world應用服務,通過配置伺服器Config Server獲取到了我們配置的hello資訊“hello world”. 但自己的配置檔案中必須配置config server的URL(http://localhost:8888), 如果把config server搬到另外一個獨立I

Java叢集/分散式環境5種session處理策略

前言 在搭建完叢集環境後,不得不考慮的一個問題就是使用者訪問產生的session如何處理。如果不做任何處理的話,使用者將出現頻繁登入的現象,比如叢集中存在A、B兩臺伺服器,使用者在第一次訪問網站時,Nginx通過其負載均衡機制將使用者請求轉發到A伺服器,這時A伺服器就會給使

巧用分散式環境的優雅技術,只有頭髮少的人才研究過(轉載備忘)

轉載自,向原作者致謝https://www.toutiao.com/a6633272364639470084/?iid=53593196063&app=news_article&group_id=6633272364639470084&timestamp=1544437809 什麼是

【轉】【Linux運維-叢集技術進階】叢集/分散式環境5種session處理策略

前言 在搭建完叢集環境後,不得不考慮的一個問題就是使用者訪問產生的session如何處理。如果不做任何處理的話,使用者將出現頻繁登入的現象,比如叢集中存在A、B兩臺伺服器,使用者在第一次訪問網站時,Nginx通過其負載均衡機制將使用者請求轉發到A伺服器,這時A伺服器

單機環境分散式環境K-Means聚類演算法的執行例項

  單機環境下的K-Means聚類演算法執行例項 參考書籍《Mahout in Action》:要資源的可以找我~(中英文都有) 在eclipse平臺上實現K-Means例項 程式碼如下: package kmeans; import java.io.File; im

Java B2B2C多使用者商城 springboot架構 (四): 分散式環境自動發現配置服務

前一章, 我們的Hello world應用服務,通過配置伺服器Config Server獲取到了我們配置的hello資訊“hello world”. 但自己的配置檔案中必須配置config server的URL(http://localhost:8888), 如果把config server搬到另外一個獨立I

分散式環境用redis模擬session

首先為什麼使用redis? 因為分散式有不同伺服器的緣故,如果你安照一般方式儲存session,那麼你的session會儲存在某一臺伺服器上,如果你的下一個請求並不是訪問這臺伺服器,那麼會發生讀取不到session的情況 redis儲存的實現方案: 第一種

ubuntu 16.04 環境編譯S3C2440平臺總結

1. 使用openocd燒寫S3C2440的nandflash     a) 準備工作:sudo apt-get install openocd     b) openocd 需要配置自己的openocd.cfg,配置檔案可以放在當前執行openocd的目錄,也可以是用引數

分散式環境命令列正確執行hadoop示例wordcount

首先確保hadoop已經正確安裝、配置以及執行。 1.     首先將wordcount原始碼從hadoop目錄中拷貝出來。 [[email protected] logs]# cp /usr/local/hadoop-1.1.2/src/examples/or

Java多執行緒:解決高併發環境資料插入重複問題

1.背景描述 應用框架:Spring + SpringMVC + Hibernate  資料庫:Oracle11g 一家文學網站向我係統推多執行緒低併發推送資料,我這邊觀察日誌和資料庫,發現有

分散式系統的資料一致性和事務處理

當我們在生產線上用一臺伺服器來提供資料服務的時候,我會遇到如下的兩個問題: 1)一臺伺服器的效能不足以提供足夠的能力服務於所有的網路請求。 2)我們總是害怕我們的這臺伺服器停機,造成服務不可用或是資料丟失。 於是我們不得不對我們的伺服器進行擴充套件,加入更多的機器來分擔效能上的問

hadoop版本3.1.0分散式環境執行mapreduce作業

一、環境配置 1、hdfs-site.xml <configuration> <property> <name>dfs.replication</name> <value>1</