前言
分布式數據庫的數據一致性管理是其最重要的內核技術之一,也是保證分布式數據庫滿足數據庫最基本的ACID特性中的 “一致性”(Consistency)的保障。在分布式技術發(fā)展下,數據一致性的解決方法和技術也在不斷的演進,本文就以作者實際研發(fā)的分布式數據庫作為案例,介紹分布式數據庫數據一致性的原理以及實際實現。
1.數據一致性
1.1數據一致性是什么
大部份使用傳統關系型數據庫的DBA在看到“數據一致性”時,第一反應可能都是數據在跨表事務中的數據一致性場景。但是本文介紹的“數據一致性”,指的是“數據在多份副本中存儲時,如何保障數據的一致性”場景。
由于在大數據領域,數據的安全不再由硬件來保證,而是通過軟件手段,通過同時將數據寫入到多個副本中,來確保數據的安全。數據庫在同時向多個副本寫入記錄時,如何確保每個副本數據一致,稱為“數據一致性”。
1.2關系型數據庫如何保障數據一致性
傳統的關系型數據庫對于運行環(huán)境–硬件要求都比較高,例如Oracle會建議用戶使用小型機+共享存儲作為數據庫的運行環(huán)境,DB2 DPF也同樣建議用戶采用更好的服務器+高端存儲來搭建數據庫的運行環(huán)境。所以在數據存儲安全的技術要求下,傳統關系型數據庫更多是依賴硬件的技術來保障數據的安全性。
因為關系型數據庫的數據安全是基于硬件來保障,并且數據也不會通過同時存儲多份來保障數據的安全,所以關系型數據庫的用戶默認認為數據存儲是一致的。
1.3分布式存儲如何保障數據一致性
本文在討論分布式存儲時,主要指的是大數據產品中的分布式文件系統和分布式數據庫,例如:SequoiaDB和HDFS。
用戶在搞明白分布式存儲的數據一致性原理時,必須要先明白為什么他們就需要數據一致性,和分布式存儲的數據存儲與關系型數據庫的數據存儲又有什么區(qū)別。
大數據技術的誕生,確確實實讓系統的性能有新的突破,并且支持硬件以水平擴展的方式來獲得線性增長的性能和存儲。這些都是過去傳統關系型數據庫所無法提供的。另外,大數據技術也拋棄了運行環(huán)境必須足夠好的硬性要求,而是允許用戶通過批量廉價X86服務器+本地磁盤的方式搭建規(guī)模集群,從而獲得比過去依賴硬件垂直擴展所提供的更強的計算能力和更多的存儲空間。
大數據技術的核心思想就是分布式,將一個大的工作任務分解成多個小任務,然后通過分布式并發(fā)操作的方式將其完成,從而提高整個系統的計算效率或者是存儲能力。而在分布式環(huán)境下,由于硬件的要求降低,必然需要大數據產品提供另外一個重要的功能–數據安全。
大數據產品在解決數據安全的方式上,都比較接近,簡單來說,就是讓一份數據通過異步或者同步的方式保存在多臺機器上,從而保障數據的安全。
分布式存儲在解決數據安全的技術難點后,又引入了一個新的技術問題,就是如何保障多個副本中的數據一致性。目前SequoiaDB是使用Raft算法來保證數據在多個副本中一致性。
2.Raft算法
2.1Raft算法背景
在分布式環(huán)境下,最著名的一致性算法應該是Paxos算法,但是由于它實在過于晦澀難懂,并且實現起來極度困難,所以在2013年,Diego Ongaro、John Ousterhout兩個人以易懂(Understandability)為目標設計了一套一致性算法Raft。Raft算法最大的特點在于簡單易懂,并且實現起來簡單
2.2Raft算法概述
與Paxos不同,Raft強調的是易懂,Raft和Paxos一樣只要保證n/2+1節(jié)點正常就能夠提供服務。
眾所周知當問題較為復雜時可以把問題分解為幾個小問題來處理,Raft也使用了分而治之的思想。Raft算法重點解決三個子問題:選舉(Leader election)、日志復制(Log replication)、安全性(Safety)。
Raft算法強化了Leader節(jié)點的功能,Follower節(jié)點的數據只能夠從Leader中獲取,所以Follower節(jié)點的實現就變得簡單,只要負責和Leader保持通信,并且接受Leader推送的數據即可。
2.3Raft算法原理
2.3.1??節(jié)點角色
Raft算法中,對節(jié)點的狀態(tài)分為3種角色,分別是Leader(領導者)、Follower(追隨者)和Candidate(候選者)。
Leader,負責處理來自客戶端的請求,負責將日志同步到Follower中,并且保證與Follower之間的heartBeat聯系;
Follower,當集群剛剛啟動時,所有節(jié)點均為Follower狀態(tài),它的工作主要為響應Leader的日志同步請求,響應Candidate的請求,以及把請求到Follower的事務請求轉發(fā)給Leader;
Candidate,選舉Leader時負責投票,選舉出來Leader后,節(jié)點將從Candidate狀態(tài)變?yōu)長eader狀態(tài)。
2.3.2 ?Terms
在分布式環(huán)境下,“時間同步”一直都是老大難的技術難題。Raft為了解決這個問題,將時間劃分為一個一個的Term(可以理解為“邏輯時間”)來處理在不同時間段里的數據一致性。
Terms有以下原則
每個Term中,至多存在一個Leader?某些Term中,有可能存在由于選舉失敗,沒有Leader的情況每個節(jié)點自己維護本地的currentTerm每個Term都是一個連續(xù)遞增的編號如果Follower的Term編號比別的Follower Term編號小時,該Follower Term編號將更新Term編號,以保持與其他Follower Term編號一致2.3.3 ?選舉
Raft的選舉由定時器觸發(fā),每個節(jié)點的觸發(fā)時間都不相同。
所有的節(jié)點在開始時狀態(tài)都為Follower,當定時器觸發(fā)選舉后Term編號遞增,該節(jié)點的狀態(tài)由Follower轉為Candidate,并且向其他節(jié)點發(fā)起RequestVote RPC請求,這時選舉有3種情況可能發(fā)生:
發(fā)起RequestVote的節(jié)點收到n/2+1(過半數)個節(jié)點的投票,該節(jié)點將從Candidate狀態(tài)變?yōu)長eader狀態(tài),開始向其他節(jié)點發(fā)送HeartBeat以保持Leader的正常狀態(tài)如果收到投票請求后,該節(jié)點發(fā)現發(fā)起投票的節(jié)點Term大于自己,則該節(jié)點狀態(tài)從Candidate轉為Follower,否則保持Candidate狀態(tài),并且拒絕該投票請求選舉期間發(fā)生了超時,則Term編號遞增,重新發(fā)起選舉2.3.4 ?日志復制
日志復制主要的作用就是用來保證節(jié)點的數據一致性與高可用性。
當Leader被選舉出來后,所有的事務操作都必須要經過Leader處理。這些事務操作成功后,將會被按順序寫入到LOG中,每個LOG都包含一個index編號。
Leader在LOG發(fā)生變化后,通過HeartBeat將新的LOG同步到Follower上,Follower在接收到LOG后,再向Leader發(fā)送ACK信息,當Leader接到大多數(2/n+1)Follower的ACK信息后,將該LOG設置為已提交,并且Leader將LOG追加到本地磁盤中。
同時Leader將在下一個HeartBeat中,通知所有的Follower將該LOG存儲在各自的本地磁盤中。
2.3.5 ?安全性
安全性是用于確保每個節(jié)點都是按照相同的日志序列進行執(zhí)行的安全機制。
如果當某個Follower在同步Leader的日志時失敗,但是未來該Follower又可能被選舉為Leader時,就有可能導致前一個Leader已經commit的日志發(fā)生覆蓋,這樣就導致了節(jié)點執(zhí)行不同序列的日志。
Raft的安全性就是用于保證選舉出來的Leader一定包含先前已經commit LOG 的機制,主要遵循的原則如下:
每個Term 只能選舉一個Leader;Leader的日志完整性,則當Candidate重新選舉Leader時,新的Leader必須要包含先前已經commit的LOG;Candidate在選舉新的Leader時,使用Term來保證LOG的完整性;3.分布式數據庫數據一致性技術實現
以國產原廠的分布式數據庫SequoiaDB為例,SequoiaDB在多副本的部署中,采用Raft算法保證數據在多副本環(huán)境中保持一致。
SequoiaDB集群中,總共包含3中角色節(jié)點,分別是協調節(jié)點、編目節(jié)點和數據節(jié)點。由于協調節(jié)點本身不存任何數據,所以只有編目節(jié)點和數據節(jié)點存在事務操作,換言之,編目分區(qū)組和數據分區(qū)組的副本同步采用Raft算法保證數據一致性。
3.1編目節(jié)點和數據節(jié)點的事務日志介紹
編目節(jié)點和數據節(jié)點由于都是需要存儲數據的,并且在集群部署中該,為了確保數據的安全,都是建議采用分布式的方式進行部署,所以在數據同步中,需要采用Raft算法的基本原理進行數據同步。
編目節(jié)點和數據節(jié)點在存儲數據時,共包含兩大部分,一個真實的數據文件,另一個是事務日志文件。
SequoiaDB的節(jié)點事務日志,默認情況下由20個64MB(總大小為1.25GB)的文件構成。節(jié)點的事務日志主要包含一個index編號和數據操作內容,index編號保持永遠遞增狀態(tài)。
另外,SequoiaDB節(jié)點的事務日志不會永久保存,而是當所有的事務日志寫滿后,再重新從第一個文件開始進行覆蓋寫入。
3.2編目分區(qū)組的數據一致性
由于編目分區(qū)組是保存SequoiaDB集群的元信息,數據同步要求高,所以編目分區(qū)組的數據一致性要求為強一致性,即每次向編目分區(qū)組執(zhí)行事務操作時,必須要確保所有的編目節(jié)點操作成功,才計算該操作執(zhí)行成功,否則該事務操作將在整個編目分區(qū)組中回退事務日志,以保證分區(qū)組內的數據一致性。
另外,編目分區(qū)組還有一個比較重要的特性,即編目分區(qū)組必須要存在主節(jié)點才能夠正常工作,如果老的主節(jié)點宕機了,編目分區(qū)組暫時沒有主節(jié)點,則該編目分區(qū)組不能夠對外提供任何事務操作和數據查詢操作。
3.3數據分區(qū)組的數據一致性
數據分區(qū)組的數據一致性默認情況下為最終一致性性,即只要求主節(jié)點執(zhí)行事務操作成功即視為操作成功,主節(jié)點將在未來異步同步ReplicaLOG到從節(jié)點上。
3.4主從節(jié)點的事務日志同步
SequoiaDB的主從節(jié)點是通過事務日志同步來保證數據一致性的,并且主從節(jié)點的事務日志同步是單線程完成。
如果當主節(jié)點和從節(jié)點的LSN差距為一條記錄,則主節(jié)點會主動將最新的事務日志推送給從節(jié)點。
如果主節(jié)點和從節(jié)點的LSN差距超過一條記錄,則從節(jié)點會主動向主節(jié)點請求同步事務日志,主節(jié)點收到同步請求后,會將從節(jié)點的LSN號到主節(jié)點最新的LSN號對應的事務日志打包一次性發(fā)送給從節(jié)點。
3.5從節(jié)點日志重放
當從節(jié)點獲取到主節(jié)點推送過來的事務日志后,就會自動解析事務日志和重放。從節(jié)點在重放事務日志時,默認情況下會以10并發(fā)來重放事務日志。
從節(jié)點在執(zhí)行并發(fā)重放日志時有條件限制,即在集合的唯一索引個數<=1的情況下,INSERT、DELETE、UPDATE、LOB WRITE、LOBUPDATE、LOB REMOVE操作可以支持并發(fā)重放事務日志。從節(jié)點在做并發(fā)重放時,是通過記錄的OID進行打散并發(fā)執(zhí)行,這樣就可以保證對相同記錄的操作不會由于并發(fā)重放導致數據不一致。
但是用戶需要注意,從節(jié)點在重放事務日志時, DROP CL操作不能夠支持并發(fā)重放。
4.SequoiaDB數據一致性應用
目前SequoiaDB數據分區(qū)組的數據一致性是基于集合級別進行配置的。用戶在使用SequoiaDB過程中,可以隨時調整數據一致性的強度。
4.1 創(chuàng)建集合時指定
在一個多副本的SequoiaDB集群中,集合默認的數據一致性行級別為“最終一致性”。用戶可以在創(chuàng)建集合時顯式指定該集合的“數據一致性強度”,例如可以在SequoiaDB Shell中執(zhí)行以下命令
db.CSNAME.createCL(“CLNAME”,{ReplSize:3})
ReplSize參數填寫范圍
4.2 修改已經存在的集合
如果集合在創(chuàng)建時沒有設置“數據一致性”ReplSize參數,用戶也可以對已經存在的集合進行修改,在SequoiaDB Shell修改命令如下
db.CSNAME.CLNAME.alter({ReplSize:3})
ReplSize的取值范圍和創(chuàng)建集合時一致。
4.3 如何查看集合的ReplSize參數
如果用戶希望檢查當前集合的RepliSize參數值,可以通過數據庫快照進行查看,在SequoiaDB Shell查看命令如下
db.snapshot(SDB_SNAP_CATALOG,{}, {"Name":null, "IsMainCL":null,"MainCLName":null, "ReplSize":null})打印信息如下{"MainCLName":"test.main2","Name": "foo.bar2","IsMainCL": null,"ReplSize": null}{"IsMainCL": true,"Name": "test.main2","MainCLName": null,"ReplSize": null}{"Name": "foo.tt","ReplSize": 3,"IsMainCL": null,"MainCLName": null}
5. 總結
分布式的數據庫,通過Raft算法來確保在分布式情況上數據的一致性,并且編目分區(qū)組和數據分區(qū)組對數據一致性要求又有所不同,編目分區(qū)組始終要求的是數據在多副本請情況下數據強一致性,而數據分區(qū)組則可以由用戶在創(chuàng)建集合時來執(zhí)行數據一致性的強度,強度越高,數據安全性越好,但是執(zhí)行的效率就會相對較差,反之依然。
目前SequoiaDB在數據一致性場景上,用戶的調整空間較大,可以根據不同的業(yè)務要求來調整數據一致性的強度,以滿足業(yè)務或追求性能最優(yōu),或者數據最安全的技術要求。
- 消息稱去年全球IT支出超過5萬億美元 數據中心系統支出大幅增加
- 2025年全球數據中心:數字基礎設施的演變
- 谷歌押注多模態(tài)AI,BigQuery湖倉一體是核心支柱
- 數字化轉型支出將飆升:到2027年將達到4萬億美元
- 量子與人工智能:數字化轉型的力量倍增器
- 華為OceanStor Dorado全閃存存儲榮獲CC認證存儲設備最高認證級別證書
- 2024年終盤點 | 華為攜手伙伴共筑鯤鵬生態(tài),openEuler與openGauss雙星閃耀
- 特朗普宣布200億美元投資計劃,在美國多地建設數據中心
- 工信部:“點、鏈、網、面”體系化推進算力網絡工作 持續(xù)提升算網綜合供給能力
- 2025年超融合基礎設施的4大趨勢
免責聲明:本網站內容主要來自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網站出現的信息,均僅供參考。本網站將盡力確保所提供信息的準確性及可靠性,但不保證有關資料的準確性及可靠性,讀者在使用前請進一步核實,并對任何自主決定的行為負責。本網站對有關資料所引致的錯誤、不確或遺漏,概不負任何法律責任。任何單位或個人認為本網站中的網頁或鏈接內容可能涉嫌侵犯其知識產權或存在不實內容時,應及時向本網站提出書面權利通知或不實情況說明,并提供身份證明、權屬證明及詳細侵權或不實情況證明。本網站在收到上述法律文件后,將會依法盡快聯系相關文章源頭核實,溝通刪除相關內容或斷開相關鏈接。