1. 程式人生 > >阿里P8架構師談:分散式資料庫資料一致性的原理、與技術實現方案!

阿里P8架構師談:分散式資料庫資料一致性的原理、與技術實現方案!

阿里P8架構師談:分散式資料庫資料一致性的原理、與技術實現方案

 

背景

可用性(Availability)和一致性(Consistency)是分散式系統的基本問題,先有著名的CAP理論定義過分散式環境下二者不可兼得的關係,又有神祕的Paxos協議號稱是史上最簡單的分散式系統一致性演算法並獲得圖靈獎,再有開源產品ZooKeeper實現的ZAB協議號稱超越Paxos。

在大資料場景下,分散式資料庫的資料一致性管理是其最重要的核心技術之一,也是保證分散式資料庫滿足資料庫最基本的ACID特性中的 “一致性”(Consistency)的保障,在分散式技術發展下,資料一致性的解決方法和技術也在不斷的演進。

分散式系統的挑戰

一致性可理解為所有節點都能訪問到最新版本的資料,這在單機場景下非常容易實現,使用共享記憶體和鎖即可解決,但資料儲存在單機會有兩個限制:

1)單機不可 用系統整體將不可用;

2)系統吞吐量受限於單機的計算能力。

消除這兩個限制的方法是用多機來儲存資料的多個副本,負責更新的客戶端會同時更新資料的多個副 本,於是問題就來了,多機之間的網路可能無法連線,當負責更新的客戶端無法同時到連線多個機器時,如何能保證所有客戶端都能讀到最新版本的資料?

CAP理論

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

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

2.可用性:資料具備高可用性

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

在大規模的分散式環境下,網路分割槽是必須容忍的現實,於是只能在可用性和一致性兩者間做出選擇,CAP理論似乎給分散式系統定義了一個悲觀的結局,一時間 大家都按照CAP理論在對熱門的分散式系統進行判定,譬如認為HBase是一個CP系統,Cassandra是AP系統,我個人認為這是不嚴謹的,理由是 CAP理論是對分散式系統中一個數據無法同時達到可用性和一致性的斷言,而一個系統中往往存在很多型別的資料,部分資料(譬如銀行賬戶中的餘額)是需要強 一致性的,而另外一部分資料(譬如銀行的總客戶數)並不要求強一致性,所以拿CAP理論來劃分整個系統是不嚴謹的, CAP理論帶來的價值是指引我們在設計分散式系統時需要區分各種資料的特點,並仔細考慮在小概率的網路分割槽發生時究竟為該資料選擇可用性還是一致性。

分散式資料一致性

1.資料一致性是什麼

大部份使用傳統關係型資料庫的DBA在看到“資料一致性”時,第一反應可能都是資料在跨表事務中的資料一致性場景。但是本文介紹的“資料一致性”,指的是“資料在多份副本中儲存時,如何保障資料的一致性”場景。

由於在大資料領域,資料的安全不再由硬體來保證,而是通過軟體手段,通過同時將資料寫入到多個副本中,來確保資料的安全。資料庫在同時向多個副本寫入記錄時,如何確保每個副本資料一致,稱為“資料一致性”。

2.關係型資料庫如何保障資料一致性

傳統的關係型資料庫在大資料的場景,對於執行環境–硬體要求都比較高,例如Oracle會建議使用者使用小型機+共享儲存作為資料庫的執行環境,DB2 DPF也同樣建議使用者採用更好的伺服器+高階儲存來搭建資料庫的執行環境。所以在資料儲存安全的技術要求下,傳統關係型資料庫在大資料場景更多是依賴硬體的技術來保障資料的安全性。

阿里P8架構師談:分散式資料庫資料一致性的原理、與技術實現方案

 

因為關係型資料庫的資料安全是基於硬體來保障,並且資料也不會通過同時儲存多份來保障資料的安全,所以關係型資料庫的使用者預設認為資料儲存是一致的。

3.分散式儲存如何保障資料一致性

本文在討論分散式儲存時,主要指的是大資料產品中的分散式檔案系統和分散式資料庫,例如:HDFS。

使用者在搞明白分散式儲存的資料一致性原理時,必須要先明白為什麼他們就需要資料一致性,和分散式儲存的資料儲存與關係型資料庫的資料儲存又有什麼區別。

大資料技術的誕生,確確實實讓系統的效能有新的突破,並且支援硬體以水平擴充套件的方式來獲得線性增長的效能和儲存。

這些都是過去傳統關係型資料庫所無法提供的。另外,大資料技術也拋棄了執行環境必須足夠好的硬性要求,而是允許使用者通過批量廉價X86伺服器+本地磁碟的方式搭建規模叢集,從而獲得比過去依賴硬體垂直擴充套件所提供的更強的計算能力和更多的儲存空間。

大資料技術的核心思想就是分散式,將一個大的工作任務分解成多個小任務,然後通過分散式併發操作的方式將其完成,從而提高整個系統的計算效率或者是儲存能力。而在分散式環境下,由於硬體的要求降低,必然需要大資料產品提供另外一個重要的功能–資料安全。

阿里P8架構師談:分散式資料庫資料一致性的原理、與技術實現方案

 

大資料產品在解決資料安全的方式上,都比較接近,簡單來說,就是讓一份資料通過非同步或者同步的方式儲存在多臺機器上,從而保障資料的安全。

分散式儲存在解決資料安全的技術難點後,又引入了一個新的技術問題,就是如何保障多個副本中的資料一致性。目前SequoiaDB是使用Raft演算法來保證資料在多個副本中一致性

Raft演算法

1.Raft演算法背景

在分散式環境下,最著名的一致性演算法應該是Paxos演算法,但是由於它實在過於晦澀難懂,並且實現起來極度困難,所以在2013年,Diego Ongaro、John Ousterhout兩個人以易懂(Understandability)為目標設計了一套一致性演算法Raft。Raft演算法最大的特點在於簡單易懂,並且實現起來簡單

2.Raft演算法概述

與Paxos不同,Raft強調的是易懂,Raft和Paxos一樣只要保證n/2+1節點正常就能夠提供服務。

眾所周知當問題較為複雜時可以把問題分解為幾個小問題來處理,Raft也使用了分而治之的思想。Raft演算法重點解決三個子問題:

1)選舉(Leader election)

2)日誌複製(Log replication)

3)安全性(Safety)。

Raft演算法強化了Leader節點的功能,Follower節點的資料只能夠從Leader中獲取,所以Follower節點的實現就變得簡單,只要負責和Leader保持通訊,並且接受Leader推送的資料即可。

3.Raft演算法原理

節點角色

Raft演算法中,對節點的狀態分為3種角色:

1)分別是Leader(領導者)

2)Follower(追隨者)

3)Candidate(候選者)

Leader,負責處理來自客戶端的請求,負責將日誌同步到Follower中,並且保證與Follower之間的heartBeat聯絡;

Follower,當叢集剛剛啟動時,所有節點均為Follower狀態,它的工作主要為響應Leader的日誌同步請求,響應Candidate的請求,以及把請求到Follower的事務請求轉發給Leader;

Candidate,選舉Leader時負責投票,選舉出來Leader後,節點將從Candidate狀態變為Leader狀態。

阿里P8架構師談:分散式資料庫資料一致性的原理、與技術實現方案

 

Terms

在分散式環境下,“時間同步”一直都是老大難的技術難題。Raft為了解決這個問題,將時間劃分為一個一個的Term(可以理解為“邏輯時間”)來處理在不同時間段裡的資料一致性。

4.日誌複製

日誌複製主要的作用就是用來保證節點的資料一致性與高可用性

當Leader被選舉出來後,所有的事務操作都必須要經過Leader處理。這些事務操作成功後,將會被按順序寫入到LOG中,每個LOG都包含一個index編號。

5. 安全性

安全性是用於確保每個節點都是按照相同的日誌序列進行執行的安全機制。

分散式資料庫資料一致性技術實現

以國產原廠的分散式資料庫SequoiaDB為例,SequoiaDB在多副本的部署中,採用Raft演算法保證資料在多副本環境中保持一致。

SequoiaDB叢集中,總共包含3中角色節點,分別是

1)協調節點

2)編目節點

3)資料節點

由於協調節點本身不存任何資料,所以只有編目節點和資料節點存在事務操作,換言之,編目分割槽組和資料分割槽組的副本同步採用Raft演算法保證資料一致性。

阿里P8架構師談:分散式資料庫資料一致性的原理、與技術實現方案

 

1.編目節點和資料節點的事務日誌介紹

編目節點和資料節點由於都是需要儲存資料的,並且在叢集部署中該,為了確保資料的安全,都是建議採用分散式的方式進行部署,所以在資料同步中,需要採用Raft演算法的基本原理進行資料同步。

編目節點和資料節點在儲存資料時,共包含兩大部分:

1)一個真實的資料檔案

2)另一個是事務日誌檔案

阿里P8架構師談:分散式資料庫資料一致性的原理、與技術實現方案

 

SequoiaDB的節點事務日誌,預設情況下由20個64MB(總大小為1.25GB)的檔案構成。節點的事務日誌主要包含一個index編號和資料操作內容,index編號保持永遠遞增狀態。

另外,SequoiaDB節點的事務日誌不會永久儲存,而是當所有的事務日誌寫滿後,再重新從第一個檔案開始進行覆蓋寫入。

2.編目分割槽組的資料一致性

由於編目分割槽組是儲存SequoiaDB叢集的元資訊,資料同步要求高,所以編目分割槽組的資料一致性要求為強一致性,即每次向編目分割槽組執行事務操作時,必須要確保所有的編目節點操作成功,才計算該操作執行成功,否則該事務操作將在整個編目分割槽組中回退事務日誌,以保證分割槽組內的資料一致性。

3.資料分割槽組的資料一致性

資料分割槽組的資料一致性預設情況下為最終一致性性,即只要求主節點執行事務操作成功即視為操作成功,主節點將在未來非同步同步ReplicaLOG到從節點上。

4.主從節點的事務日誌同步

SequoiaDB的主從節點是通過事務日誌同步來保證資料一致性的,並且主從節點的事務日誌同步是單執行緒完成。

如果當主節點和從節點的LSN差距為一條記錄,則主節點會主動將最新的事務日誌推送給從節點。

如果主節點和從節點的LSN差距超過一條記錄,則從節點會主動向主節點請求同步事務日誌,主節點收到同步請求後,會將從節點的LSN號到主節點最新的LSN號對應的事務日誌打包一次性發送給從節點。

5.從節點日誌重放

當從節點獲取到主節點推送過來的事務日誌後,就會自動解析事務日誌和重放。從節點在重放事務日誌時,預設情況下會以10併發來重放事務日誌。

從節點在執行併發重放日誌時有條件限制,即在集合的唯一索引個數<=1的情況下,INSERT、DELETE、UPDATE、LOB WRITE、LOBUPDATE、LOB REMOVE操作可以支援併發重放事務日誌。

從節點在做併發重放時,是通過記錄的OID進行打散併發執行,這樣就可以保證對相同記錄的操作不會由於併發重放導致資料不一致。

5. 總結

分散式的資料庫,通過Raft演算法來確保在分散式情況上資料的一致性,並且編目分割槽組和資料分割槽組對資料一致性要求又有所不同,編目分割槽組始終要求的是資料在多副本請情況下資料強一致性,而資料分割槽組則可以由使用者在建立集合時來執行資料一致性的強度,強度越高,資料安全性越好,但是執行的效率就會相對較差,反之依然。

以上就是分散式場景下資料同步的一致性技術方案,以下是最新阿里P8架構師談架構設計系列

阿里P8架構師談:分散式資料庫資料一致性的原理、與技術實現方案

在這裡我相信有很多想要學習java的朋友們!

那如何學習java才能快速入門並精通呢?

當真正開始學習的時候難免不知道從哪入手,導致效率低下影響繼續學習的信心。

但最重要的是不知道哪些技術需要重點掌握,學習時頻繁踩坑,最終浪費大量時間,所以有一套實用的視訊課程用來跟著學習是非常有必要的。

為了讓學習變得輕鬆、高效,今天給大家免費分享一套阿里架構師傳授的一套教學資源。幫助大家在成為架構師的道路上披荊斬棘。

這套視訊課程詳細講解了(Spring,MyBatis,Netty原始碼分析,高併發、高效能、分散式、微服務架構的原理,JVM效能優化、分散式架構)等成為架構師必備的內容!

加QQ群:331789133,免費領取!