分布式數據庫數據一致性的原理、與技術實現方案

http://youzhixueyuan.com/the-principle-and-technology-realization-of-distributed-data-consistency.html

?

背景

可用性(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理論帶來的價值是指引我們在設計分布式系統時需要區分各種數據的特點,并仔細考慮在小概率的網絡分區發生時究竟為該數據選擇可用性還是一致性。

BASE理論

BASE是Basically Available(基本可用)、Soft state(軟狀態)和Eventually consistent(最終一致性)三個短語的縮寫。BASE理論是對CAP中一致性和可用性權衡的結果,其來源于對大規模互聯網系統分布式實踐的總結, 是基于CAP定理逐步演化而來的。BASE理論的核心思想是:即使無法做到強一致性,但每個應用都可以根據自身業務特點,采用適當的方式來使系統達到最終一致性。接下來看一下BASE中的三要素:

1、基本可用

基本可用是指分布式系統在出現不可預知故障的時候,允許損失部分可用性----注意,這絕不等價于系統不可用。比如:

(1)響應時間上的損失。正常情況下,一個在線搜索引擎需要在0.5秒之內返回給用戶相應的查詢結果,但由于出現故障,查詢結果的響應時間增加了1~2秒

(2)系統功能上的損失:正常情況下,在一個電子商務網站上進行購物的時候,消費者幾乎能夠順利完成每一筆訂單,但是在一些節日大促購物高峰的時候,由于消費者的購物行為激增,為了保護購物系統的穩定性,部分消費者可能會被引導到一個降級頁面

2、軟狀態

軟狀態指允許系統中的數據存在中間狀態,并認為該中間狀態的存在不會影響系統的整體可用性,即允許系統在不同節點的數據副本之間進行數據同步的過程存在延時

3、最終一致性

最終一致性強調的是所有的數據副本,在經過一段時間的同步之后,最終都能夠達到一個一致的狀態。因此,最終一致性的本質是需要系統保證最終數據能夠達到一致,而不需要實時保證系統數據的強一致性。

總的來說,BASE理論面向的是大型高可用可擴展的分布式系統,和傳統的事物ACID特性是相反的,它完全不同于ACID的強一致性模型,而是通過犧牲強一致性來獲得可用性,并允許數據在一段時間內是不一致的,但最終達到一致狀態。但同時,在實際的分布式場景中,不同業務單元和組件對數據一致性的要求是不同的,因此在具體的分布式系統架構設計過程中,ACID特性和BASE理論往往又會結合在一起。

分布式數據一致性

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算法來確保在分布式情況上數據的一致性,并且編目分區組和數據分區組對數據一致性要求又有所不同,編目分區組始終要求的是數據在多副本請情況下數據強一致性,而數據分區組則可以由用戶在創建集合時來執行數據一致性的強度,強度越高,數據安全性越好,但是執行的效率就會相對較差,反之依然。

轉載于:https://www.cnblogs.com/Joy-Hu/p/10763767.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387786.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387786.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387786.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

模塊之re模塊 —— 正則

#‘match’只匹配從左向右第一個值是否在中括號的范圍內&#xff0c;如果沒有就返回None 如果有就直接打印一個對象&#xff0c;加上.group()就可以返回你要找的區間里面的值&#xff0c;如果沒有找到對應的值&#xff0c;加上‘.group()’會報錯 #‘search’ 默認是從整個st…

centos7 docker

Docker 是一個開源工具&#xff0c;它可以讓創建和管理 Linux 容器變得簡單。容器就像是輕量級的虛擬機&#xff0c;并且可以以毫秒級的速度來啟動或停止。Docker 幫助系統管理員和程序員在容器中開發應用程序&#xff0c;并且可以擴展到成千上萬的節點。 容器和 VM&#xff08…

批處理ping指定ip列表

for /f in (filename) do (command) for /f %i in (C:\ip.txt) do (ping %i -n 1 && echo %i 通 >>IP.txt || echo %i 不通 >>IP1.txt) 有返回寫入ip.txt 沒有寫入ip1.txt轉載于:https://blog.51cto.com/2216859/2384188

Intellij Idea 2017創建web項目及tomcat部署實戰

相關軟件&#xff1a;Intellij Idea2017、jdk16、tomcat7 Intellij Idea直接安裝&#xff08;可根據需要選擇自己設置的安裝目錄&#xff09;&#xff0c;jdk使用1.6/1.7/1.8都可以&#xff0c;主要是配置好系統環境變量&#xff0c;tomcat7上tomcat的官網下載壓縮包解壓即可。…

docker ssh

1&#xff0c;首先&#xff0c;需要從Docker官網獲得centos或Ubuntu鏡像 2&#xff0c;當本地已有Ubuntu鏡像后&#xff08;大概200M左右大小&#xff09;&#xff0c;使用如下命令 [cpp]view plaincopy docker run -t -i ubuntu /bin/bash 即可啟動一個容器&#xff0c;并放…

[BFS]JZOJ 4672 Graph Coloring

Description 現在你有一張無向圖包含n個節點m條邊。最初&#xff0c;每一條邊都是藍色或者紅色。每一次你可以將一個節點連接的所有邊變色&#xff08;從紅變藍&#xff0c;藍變紅&#xff09;。找到一種步數最小的方案&#xff0c;使得所有邊的顏色相同。Input 第一行包含兩個…

實現繼承的方式

/*** 借助構造函數實現繼承*/function Parent1(){this.name "parent1";}Parent1.prototype.say function(){};function Child1(){//將父構造函數的this指向子構造函數的實例上Parent1.call(this);//applythis.type "child1";}console.log(new Child1);/…

Vue源碼: 關于vm.$watch()內部原理

vm.$watch()用法 關于vm.$watch()詳細用法可以見官網。 大致用法如下: <script>const app new Vue({el: "#app",data: {a: {b: {c: c}}},mounted () {this.$watch(function () {return this.a.b.c}, this.handle, {deep: true,immediate: true // 默認會初始化…

docker啟動順序

VMDocker: 用戶名:root 密碼:XXXXXXXXXXXXX docker run -i -t -d -p 8081:8080 -p 23:22 67591570dd29 /bin/bash 常用命令 啟動停止: service docker start service docker stop 所有鏡像:docker images 當前執行:docker ps 提交保存docker容器: docker commit 進入到對應服…

js時鐘倒計時

JS倒計時Date 代碼如下&#xff1a; 1 <style type"text/css">2 * {3 margin: 0;4 padding: 0;5 }6 7 #box {8 border: 1px solid cyan;9 background-color: #000; 10 height: 50px; 11 width: 500px; 12 margin: 100px auto 0; 13 border-radius: 20px; 14 te…

JAVA的值傳遞問題

為什么 Java 中只有值傳遞&#xff1f; 首先回顧一下在程序設計語言中有關將參數傳遞給方法&#xff08;或函數&#xff09;的一些專業術語。按值調用(call by value)表示方法接收的是調用者提供的值&#xff0c;而按引用調用&#xff08;call by reference)表示方法接收的是調…

小程序如何封裝自定義組件(Toast)

1、創建和pages 同級的component目錄新建一個myToast目錄 例如: 2、myToast.wxml文件內容: <!-- 自定義toast組件 --> <!-- name 模塊名稱 --><template name"toast" ><!-- catchtouchmove‘xxx’ 遮罩層的滾動穿透 --><!-- isHide 顯示…

2017 百度杯丶二月場第一周WP

1.禍起北荒 題目&#xff1a; 億萬年前 天子之子華夜&#xff0c;被父神之神末淵上神告知六荒十海之北荒西二旗即將發生一場“百度杯”的諸神之戰 他作為天族的太子必須參與到此次諸神之戰定六荒十海 華夜臨危受命&#xff0c;馬上帶著火鳳凰飛行到北荒“西二旗” 卻沒想到這六…

docker保存對容器的修改

Docker 子命令: attach commit diff export history import insert kill login port pull restart rmi save start tag version build cp events help images info inspect load logs ps …

中國涉5.9億份簡歷信息泄露

據美國科技媒體ZDNet報道&#xff0c;有研究人員發現&#xff0c;中國企業今年前3個月出現數起簡歷信息泄漏事故&#xff0c;涉及5.9億份簡歷。大多數簡歷之所以泄露&#xff0c;主要是因為MongoDB和ElasticSearch服務器安全措施不到位&#xff0c;不需要密碼就能在網上看到信息…

阿里云亮相2019聯通合作伙伴大會,邊緣計算等3款云產品助力5G時代產業數字化轉型...

4月23日&#xff0c;2019中國聯通合作伙伴大會在上海正式開幕&#xff0c;本次大會以“合作不設限&#xff0c;共筑新生態”為主題&#xff0c;涉及5G、邊緣計算、云計算、物聯網、新媒體、人工智能、互聯網化等各領域超過600家合作伙伴與3萬名各行業觀眾參會。據了解&#xff…

hadoop2.7 偽分布

hadoop 2.7.3偽分布式環境運行官方wordcounthadoop 2.7.3偽分布式模式運行wordcount 基本環境&#xff1a; 系統&#xff1a;win7 虛機環境&#xff1a;virtualBox 虛機&#xff1a;centos 7 hadoop版本&#xff1a;2.7.3 本次以偽分布式模式來運行wordcount。 參考&#xff1a…

iPhone手機屏幕尺寸(分辨率)

第一代iPhone2G屏幕為3.5英吋&#xff0c;分辨率為320*480像素&#xff0c;比例為3:2。 第二代iPhone3G屏幕為3.5英吋&#xff0c;分辨率為320*480像素&#xff0c;比例為3:2。 第三代iPhone3GS屏幕為3.5英吋&#xff0c;分辨率為320*480像素&#xff0c;比例為3:2。 第四代iPh…

[Java in NetBeans] Lesson 06. Custom classes

這個課程的參考視頻和圖片來自youtube。 主要學到的知識點有&#xff1a; Constructors: A special method called when an object of the class is createdproperty pattern and encapsulation(封裝): hide the implementation details from the user, so when the class is b…