NewSQL資料庫簡介

lhrbest發表於2017-07-28

NewSQL資料庫簡介



NewSQL的未來

原創 2016-10-20 黃編者按:黃東旭,PingCAP 聯合創始人、CTO,是很多人仰望的國內分散式儲存領域(NewSQL) 技術大神級別的人物。我們請黃東旭來聊聊他眼中的NewSQL,有需要交流的內容,歡迎留言。


最近資料庫圈的一個比較大的事件是 NoSQL 先驅之一的 RethinkDB 的關張大吉,RethinkDB這個事情本身我就不多做評論了,現在這個時機去分析不免有馬後炮的嫌疑,今天我想借著這個引子談談新型資料庫的未來。

 

縱觀過去十年資料庫的發展,其實是相當迅速,隨著網際網路的發展以及業務資料量的不斷膨脹,大家漸漸發現傳統的單機 RDBMS 開始出現一些瓶頸,很多業務的模型也和當初資料庫設計的場景不太一樣,一個最典型的思潮就是反正規化設計,通過適當的資料冗餘來減小 JOIN 帶來的開銷,當初 *-NF 的設計目的是儘可能的減小資料冗餘,但現在的硬體和儲存容量遠非當年可比,而且儲存介質也在慢慢發生變化,從磁帶到磁碟到快閃記憶體,甚至最近慢慢開始變成另一個異構的分散式儲存系統 (如 Google F1, TiDB),RDBMS 本身也需要進化。在 NoSQL 蓬勃發展的這幾年也是 Web 和移動端崛起的幾年,但是在 NoSQL 中反正規化的設計是需要以付出一致性為代價,不過這個世界的業務多種多樣,大家漸漸發現將一致性交給業務去管理會極大的增加業務的複雜度,但是在資料庫層做又沒有太好的可以 Scale 的方案,SPOF 問題和單機效能及頻寬瓶頸會成為懸在業務頭上的達摩克利斯之劍。

 

NewSQL 的出現就是為了解決擴充套件性和一致性之間的矛盾,我所理解的 NewSQL 主要還是面向 OLTP 業務和輕量級的OLAP業務,大型複雜的OLAP 資料庫暫時不在本文討論的範圍。對於 NewSQL 來說,我覺得應該需要明確一下必備的性質,什麼樣的資料庫才能稱之為NewSQL,在我看來,應該有以下幾點必備的特性:


1.    SQL

2.    ACID Transaction, 支援跨行事務

3.    Auto-scale

4.    Auto-failover


SQL

 

一切為了相容性!相容性!相容性! SQL 的支援是和之前 NoSQL 從介面上最大的不同點,但是在一個分散式系統上支援 SQL 和在單機 RDBMS 上也是完全不一樣的,更關鍵的是如何更好的利用多個節點的計算能力,生成更好的執行計劃,將計算邏輯儘可能的均攤到多個儲存節點上,設計這樣一個 SQL engine 的更像是在做一個分散式計算框架,考慮的側重點和單機上的查詢引擎是不一樣的,畢竟網路的開銷和延遲是單機資料庫之前完全不需要考慮的。不過從最近幾年社群的實現來看,尤其是一些 OLAP 的系統,已經有不少優秀的分散式 SQL 實現,比如: Hive, Impala,Presto, SparkSQL 等優秀的開源專案。雖然 OLTP 的 SQL engine 和OLAP 的側重點有所不同,但是很多技術是相通的,但是一些單機 RDBMS 的 SQL 是很難直接應用在分散式環境下的,比如儲存過程和檢視等。正如剛才提到的,越來越多的業務開始接受反正規化的設計,甚至很多新的業務都禁止使用儲存過程和外來鍵等,這是一個好的現象。

 

ACIDTransaction

 

對於 OLTP 型別的 NewSQL 來說,最重要的特點我認為是需要支援 ACID 的跨行事務,其實隔離級別和跨行事務是個好東西,能用更少的程式碼寫出正確的程式,這個交給業務程式設計師寫基本費時費力還很難寫對,但在分散式場景下支援分散式事務需要犧牲點什麼。本身分散式 MVCC 並不是太難做,在 Google BigTable / Spanner 這樣的系統中顯式的多版本已經是標配,那麼其實犧牲掉的是一定的延遲,因為在分散式場景中實現分散式事務在生產環境中基本就只有兩階段提交的一種辦法,不過呢,考慮到 Multi-Paxos 或者 Raft 這樣的複製協議總是要有延遲的,兩階段提交所帶來的 contention cost 相比複製其實也不算太多,對於一個分散式資料庫來說我們優化的目標永遠是吞吐。延遲問題也可以通過快取和靈活降低隔離級別等方法搞定。

 

很多使用者在進行架構設計的時候,通常會避免分散式事務,但是這其實將很多複雜度轉移給了業務層,而且實現正確的事務語義是非常複雜的事情,對於開發者的要求還蠻高的,之前其實沒有太多的辦法,因為幾乎沒有一個方案能在資料庫層面上支援事務,但是有些對一致性的要求很高的業務對此仍然是繞不開的。就如同 Google 的 Senior Fellow Engineer,Jeff Dean 在去年的一個會議上提到,作為工程師最後悔的事情就是沒有在BigTable 上支援跨行事務,以至於在隨後的 10 多年,Google內部的團隊前赴後繼的在 BigTable 上造了多套事務的輪子以支撐業務,不過這個遺憾在 Spanner 中已經彌補了,也算是 happy ending。 其實 Spanner 的例子是非常好的,而且我認為 Google Spanner 及 F1 是第一個線上上大規模使用的 NewSQL 系統,很多經驗和設計我們這些後來者是可以借鑑的。我認為,從使用者的角度來說,濫用事務帶來的效能問題不能作為在資料庫層面上不支援的理由,很多場景如果使用得當,能極大的降低業務開發的複雜度。

 

Scale

 

作為一個現代的資料庫,可擴充套件性我覺得是排在第一位的,而且這裡的可擴充套件性值得好好說一下,目前關係型資料庫的擴充套件方案上,基本只有分庫分表和 PROXY 中介軟體兩種方案,但是這兩種方案並沒有辦法做到透明的彈性擴充套件,而且到達一定規模後的運維成本幾乎是指數級別上升,這也是大多數公司在微服務實踐的過程中遇到的最大障礙,服務可以很好的做到無狀態和解耦合,但是資料天然是有狀態的,比較理想的情況是有一個統一的,通用的儲存層,讓服務層能夠放開手腳。彈性擴充套件的技術在很多 NoSQL 裡已經有過很好的實踐,目前比較成熟的方案還是類 BigTable 式的 Region based 的方案,在 Key-Value 層面上實現水平擴充套件。另外值得一提的是,對於 NewSQL 這類需要支援 SQL 的資料庫而言,region based 的資料切分是目前唯一的方案, 因為 SQL 的查詢需要支援順序 Scan 的資料訪問方式,基於一致性雜湊的方案很難支援高效的順序訪問。這裡隱含了一個假設就是真正能夠支援 Scale 的 NewSQL 架構很難是基於中介軟體的方案,SQL above NoSQL 是目前來說唯一的可行方案,從 Google 的選型也能看出來。基於中介軟體的方案的問題是中介軟體很難生成足夠高效的執行計劃,而且底層的多個資料庫例項之間並沒有辦法提供一個統一的事務語義,在執行跨節點的 JOIN 或者事務的時候沒有辦法保證一致性,另外底層的資料庫例項(一般來說是 PostgreSQL 或者 MySQL) 本身並沒有原生的擴充套件方案,需要中介軟體層面上額外做大量的工作,這也是為什麼中介軟體的方案很多,但是做完美非常困難。

 

Failover

 

目前大多數的資料庫的複製模型還是基於主從的方案,但是主從的方案本質上來說是沒有辦法脫離人工運維的,所以這個模型是很難 Scale 的 。如果需要做 Auto failover,從庫何時提升成主庫,主庫是否完全下線,提升起來的從庫是否擁有最新的資料?尤其如果出現叢集腦裂的狀況,一旦 Auto failover 設計得不周全,甚至可能出現雙主的嚴重故障。所以資料的一致性是需要 DBA 的人工介入保證,但是在資料量比較龐大的情況下,人工可運維的規模是有上限的,比如 Google 在 F1 之前,維護了一個 100 節點左右的 MySQL 中介軟體叢集支援同樣的業務,在這個規模之下維護的成本就已經非常高了,使得 Google 不惜以從零開始重新開發一個資料庫為代價。從 Google 在 Spanner 和 F1 以及現在流行的開源 NewSQL 方案,比如 TiDB 和CockroachDB 等可以看到,在複製模型上都沒有選擇主從的模型,而是選用了 Multi-Paxos 或者 Raft 這樣基於分散式選舉的複製協議。

 

Multi-Paxos(以下出於省略暫用 Paxos 來指代,但是實際上兩者有些不一樣,在本文特指Multi-Paxos)  和Raft 的原理由於篇幅原因就不贅述了,簡單來說,它們是高度自動化,強一致的複製演算法,在某節點故障的時候,支援完全自動和強一致的故障轉移和自我恢復,這樣才能做到使用者層的透明,但是這裡有一個技術的難點,即Scale 策略與這樣的複製協議的融合,多個 Paxos / Raft Group 的分裂、合併以及排程,以及相關的測試。這個技術的門檻比較高,實現起來的複雜度也比較高,但是作為一個 Scale 的資料庫來說,是一定要實現的,在目前的開源實現中,只有 PingCAP 的TiDB 的成熟度和穩定度是比較高的,有興趣的朋友可以參考 TiDB(github.com/pingcap/tidb) 的實現。

 

Failover相關的另外一個話題是跨資料中心多活,這個基本上是所有分散式系統開發者心中的聖盃。目前也是基本沒有方案,大多數的多活的方案還是同步熱備,而且很難在保證延遲的情況下同時保持一致性,但是 Paxos 和 Raft based 的方案給多活提供了一種新的可能性,這類選舉演算法,只要一個 paxos / raft group 內的大多數節點複製成功,即可給客戶端返回成功,舉一個簡單的例子,如果這個 group 內有三個節點,分別在北京,廊坊,廣州的三個資料中心,對於傳統的強一致方案,一個在北京發起的寫入需要等待廣州的資料中心複製完畢,才能給客戶端返回成功,但是對於 paxos 或者 raft 這樣的演算法,其實延遲僅僅是北京和廊坊之間資料中心的延遲,比傳統方案大大的降低了延遲,雖然對於頻寬的要求仍然很高,但是我覺得這是在資料庫層面上未來實現跨資料中心多活的一個趨勢和可行的方向。按照 Google 在 Spanner 論文中的描述,Google 的資料中心分別位於美國西海岸,東海岸,以及中部,所以總體的寫入延遲控制在半個美國的範圍內,還是可以接受的。

 

未來在哪裡

 

不妨把眼光稍微放遠一些,其實仔細想想 NewSQL 一直在嘗試解決問題是:擺脫人工運維束縛,儲存層實現真正的自生長,自維護,同時使用者可以以最自然的程式設計介面訪問和儲存資料。當實現這點以後,業務才可以擺脫儲存的介質,容量的限制,而專注於邏輯實現。大規模的分散式和多租戶是必然的選擇,其實這個目標和雲的目標是很接近的,實際上資料庫是雲不可或缺的一部分,不過現在的資料庫都太不 Cloud-Native 了,所以如何和雲更緊密結合,更好的利用雲的資源排程,如何對業務透明的同時無縫的在雲上自我進化是我最近思考得比較多的問題。在這個領域 Google 是走在時代前沿的,從幾個 NewSQL 的開源實現者都不約而同的選擇了 Spanner 和 F1 的模型上可以看得出來。



NewSQL究竟新在哪裡?

2016-12-12 

本文來自技術部落格:http://oserror.com/


微信訂閱號有置頂功能,歡迎讀者置頂架構文摘:ArchDigest


近幾年來,資料庫領域出現了一種新的關聯式資料庫型別,稱為NewSQL,例如,Google的Spanner,Amazon的Aurora等等,這些資料庫相對於傳統資料庫來講,區別在哪裡?What’s Really New with NewSQL?給了很好的總結,本篇文章主要是總結該論文的觀點,最後會有一個簡單的討論部分,全文的組織結構如下:


  • 為什麼需要NewSQL?

  • NewSQL的分類

  • NewSQL的技術挑戰有哪些?

  • 討論


本文收錄在我的github中papers專案,papers專案旨在學習和總結分散式系統相關的論文。


為什麼需要NewSQL?


資料庫的發展通常是隨著業務需求的變化,在2000年左右,隨著網際網路的興起,有許多同時線上的使用者,這對資料庫領域帶來了非常大的挑戰,資料庫通常會成為瓶頸,所以,此時業務針對資料庫的需求,主要體現在可擴充套件上面。


這時期資料庫的擴充套件性,往往採用如下兩種方案:


  1. 垂直擴充套件:使用更好的硬體,來做資料庫的伺服器

  2. 水平擴充套件:採用中介軟體,做sharding的方式,即分庫分表的方式


垂直擴充套件中使用更好的硬體意味者成本高,並且更換硬體後,需要把資料從老的機器遷移到新的機器,中間可能需要停服務,因此往往採用水平擴充套件,例如,Google’s MySQL-based cluster。


採用中介軟體方式也有缺點,中介軟體一般要求輕量級,簡單資料庫操作可以搞定,但是,如果需要做分散式事務或者聯表操作,會非常複雜,通常這些邏輯會放到應用層來做。


後續,NOSQL興起,主要有幾個原因:


  1. 傳統關聯式資料庫更傾向於一致性,而在效能和可用性比較差

  2. 全功能的關係型資料庫太重

  3. 關係模型對於簡單的查詢太重,不必要


NOSQL以Google’s BigTable 和 Amazon’s Dynamo為代表,開源版對應為HBase和Cassandra。


NOSQL往往是不保證強一致性的,而對於一些應用來講(例如金融服務),是需要強一致性和事務的,因此,如果它們基於NOSQL系統來開發的話,應用層需要些大量的邏輯來處理一致性和事務相關的問題。此時,業務需求是擁有可擴充套件性的基礎上,能夠支援強一致性。


因此,這裡有幾條路:


  1. 效能更好的單個伺服器來做資料庫伺服器

  2. 中介軟體層支援分散式事務


使用更好的單個伺服器的話,不滿足業務需求的可擴充套件性。


使用中介軟體的話,會有如下問題,例如:


  1. 中介軟體層往往是比較輕量級的,要實現一致性,必須在中介軟體層實現分散式事務,這點是非常困難的

  2. 中介軟體層本身的高可用很難保證


上面兩條路都不能很好的滿足應用的需求,因此,NewSQL出現了。


首先來看NEWSQL的定義:針對OLTP的讀寫,提供與NOSQL相同的可擴充套件性和效能,同時能支援滿足ACID特性的事務。即保持NOSQL的高可擴充套件和高效能,並且保持關係模型。

NEWSQL的優點:


  1. 輕鬆的獲得可擴充套件性

  2. 能夠使用關係模型和事務,應用邏輯會簡化很多


注意,此篇論文中的NEWSQL偏向於OLTP型資料庫,和一些OLAP型別的資料庫不同,OLAP資料庫更偏向於複雜的只讀查詢,查詢時間往往很長。


而NEWSQL資料庫的特性如下,針對其讀寫事務:


  1. 執行時間短

  2. 一般只查詢一小部分資料,通過使用索引來達到高效查詢的目的

  3. 一般執行相同的命令,使用不同的輸入引數


NewSQL的分類


分三大類:


  1. 從頭開始,使用新架構的系統

  2. 中介軟體

  3. DAAS,資料庫即服務


New Architectures


採用新架構的NewSQL有如下特點:

  1. 無共享儲存

  2. 多節點的併發控制

  3. 基於多副本做高可用和容災

  4. 流量控制

  5. 分散式查詢處理


優勢:


  1. 所有的部分都可以為分散式環境做優化,例如查詢優化,通訊協議優化。例如,所有的NEWSQL DBMS可以直接在節點間傳送查詢,而不是通過中心節點,例如中介軟體系統

  2. 本身負責資料分割槽,因此,可以把查詢傳送給有資料的分割槽,而不是把資料傳送給查詢。

  3. 擁有自身的儲存,可以指定更復雜的多副本的方式


缺點:


  1. 懂該資料庫的人少,缺少專業的運維


代表產品:Spanner,CockroachDB


Transparent Sharding Middleware


中介軟體負責的事情如下:


  1. 對查詢請求做路由

  2. 分散式事務的協調者

  3. 資料分佈,資料多副本控制,資料分割槽


往往在各個資料庫節點,需要裝代理與中介軟體溝通,負責如下事情:


  1. 在本地節點執行中間節點發來的情況,並且返回結果


優點:


  1. 應用通常不需要做變化


缺點:


  1. 各個節點還是執行傳統資料庫,即以磁碟為核心的資料庫,對現有的大記憶體,多核伺服器難以高效地利用

  2. 重複的查詢計劃和查詢優化,在中介軟體做一次,在各個DBMS做一次

備註:有研究表明,以磁碟為主要儲存的傳統DBMS,很難有效地利用非常多的核,以及更大的記憶體容量。


代表產品: MariaDB MaxScale, ScaleArc


Database-as-a-Service


特點:


  1. 使用者可以按需使用

  2. 資料庫本身可能使用雲產品,例如雲端儲存等,可以較容易的實現可擴充套件性


代表產品:


  1. Amazon Aurora

  2. ClearDB


NewSQL的技術挑戰有哪些?


Main Memory Storage


傳統資料庫都是以磁碟為儲存中心的架構,讀盤操作相對較慢,一般是記憶體中快取頁。

現在來講,記憶體較便宜,容量大,能儲存大量的資料。這些純記憶體操作帶來的好處是,讀取和寫入資料速度較快。


現有的大記憶體伺服器,對資料庫對記憶體的管理提出了新的要求,不再是像傳統資料庫那樣,只是用來做頁快取,可以採用更高效地記憶體管理方式。


Partitioning/Sharding


資料分割槽一般以某幾列做hash或者range分割槽。


特點:


  • 資料庫需要能在多個分割槽執行SQL,並且合併資料結果的功能。

  • 把同一個使用者的資料可以放在一起,即使是不同資料表的資料,可以減少通訊開銷。

  • 可以線上的新增或者刪除機器。

  • 可以線上的遷移或複製分割槽。


Concurrency Control


資料庫通過Concurrency Control來提供ACID中的Atomicity和Isolation。


Atomicity


分散式場景下,一般採用類2PC的協議,根據事務是否需要中心節點,分為以下兩類:


  1. 中心節點:單點,容量限制

  2. 非中心節點:需要時鐘的同步


關於時鐘同步,不同資料庫也有不同的做法,Spanner和CroachDB在時鐘同步上的不同選擇:


1 
But what makes Spanner differ- ent is that it uses hardware devices (e.g., GPS, atomic clocks) for high-precision clock synchronization. The DBMS uses these clocks to assign timestamps to transactions to enforce consistent views of its multi-version database over wide-area networks. CockroachDB also purports to provide the same kind of consistency for transactions across data centers as Span- ner but without the use of atomic clocks. They instead rely on a hybrid clock protocol that combines loosely synchronized hardware clocks and logical counters [41]. 


Isolation


現有實現Isolation的技術主要包括:


  • 2PL:two phase locking

  • MVCC: Multiversion Concurrency Control

  • OCC: Optimistic Concurrency Control


大部分的資料庫還是在選擇使用MVCC,例如CockroachDB;有些資料庫使用2PL+MVCC,修改資料的時候,還是採用2PL,例如,InnoDB,Spanner 


Secondary Indexes


一般有兩種實現方式:區域性索引VS全域性索引


區域性索引:


  1. 每個partition有一部分索引資料,每次修改索引,只需要修改一個節點,但查詢資料需要可能涉及多個節點


全域性索引:


  1. 每個partition都有完整的索引資料,每次修改索引,都需要使用分散式事務,修改所有包含此索引副本的節點,查詢資料只需要在一個節點


Replication


兩個需要考慮的點:


  1. 如何保證一致性:Paxos和2PC(跨Partition)

  2. 同步的方式:採用同步執行命令的方式,還是同步狀態的方式


Crash Recovery


如何最小化當機時間?


採用主備切換


如何優化新加機器恢復到同步的時間?


一般手段為做checkpoint


討論


可擴充套件性是NewSQL的一個非常重要的特點,對於中介軟體的方式,其上需要存路由資訊,其本身的可擴充套件性比較難以解決,個人認為,其不應該算入NewSQL。


NewSQL的技術挑戰除了上述提到的之外,還有如何實現多租戶架構及租戶之間的隔離,負載均衡等等問題。


從整篇論文中描述的內容可以看出,NewSQL中並沒有開拓性的理論技術的創新,更多的是架構的創新,以及把現有的技術如何更好地適用於當今的伺服器,適用於當前的分散式架構,使得這些技術有機的結合起來,形成高效率的整體,實現NewSQL高可用,可擴充套件,強一致性等需求。


版權申明:內容來源網路,版權歸原創者所有。除非無法確認,我們都會標明作者及出處,如有侵權煩請告知,我們會立即刪除並表示歉意。謝謝。



深入理解Raft及在NewSQL中的使用

2016-09-18 

本文整理自APMCon 2016中國應用效能管理大會 資料庫效能優化專場 京東資深架構師 張成遠 題為《深入理解Raft及在NewSQL中的使用》的演講,現場解讀Raft核心內容,剖析etcd Raft庫的設計實現,針對此類複雜分散式系統演算法的測試方法,並介紹業界主流NewSQL的詳細設計,Raft在其中發揮的重要作用,以及如何使用等。


張成遠:我是京東資深架構師張成遠,目前主要是做分散式資料庫相關的一些架構研發等工作。今天主要講一下Raft在NewSQL的使用,因為內容涉及到Raft和NewSQL,我會先講一下什麼是NewSQL,什麼是事務以及一致性等,還有NewSQL大概是怎麼做的,然後再講一下Raft是什麼以及Raft是怎麼樣工作的。


一、What is NewSQL

NewSQL資料庫簡介

從SQL到NoSQL再到NewSQL,一路走來大概經歷過這樣一個發展過程,一開始最早的時候是SQL類產品,後來慢慢有了NoSQL的東西,最近這一兩年開始有NewSQL這個概念。SQL理論,也就是關係型資料庫理論大概是上世紀70年代左右就是已經提出來了,這個理論下產生了很多的產品,像MySQL、Oracle、PostgreSQL、SQL Server等很多很多。


後來隨著分散式系統的發展衍生了NoSQL這個概念,出現了很多的分散式儲存系統像Redis、mongoDB、cassandra等,這些NoSQL類的產品特點是不支援SQL,主要以KV形式儲存,在擴容方面非常容易,可以較為輕鬆的進行一些叢集的伸縮等操作。NoSQL出來以後一直喊著要把SQL顛覆,後來在實際生產環境中我們發現這兩者是一種長期並存的趨勢,每類產品都有一定的適用場景。


等到後來,大家可能希望出現一種東西可以結合SQL跟NoSQL的優點,既支援SQL支援事務又可以比較容易的進行叢集的伸縮擴容等操作,讓海量資料方面的處理可以更加的容易,所以就出現了NewSQL的概念。NewSQL這個概念之下,國內外都有一些優秀的開源的專案在做像TiDB、CockroachDB等,但目前開源領域可能還沒有在生產環境當中真正大規模使用的。如果要說真正落地使用的話可能當屬google的F1/spanner了,但他們家沒有開源只有論文流出。


二、What is transaction

NewSQL資料庫簡介

然後,接下來講一下NewSQL最大的特點,就是支援SQL同時支援事務,支援SQL比較好理解,相當於可以用SQL的方式來增刪改查這個系統,至於支援事務那我們就要回到非常老的一個問題,到底什麼是事務?支援事務,那事務到底是什麼定義?事務有ACID屬性,也就是原子性、一致性、隔離性還有永續性


原子性是指整個事務要麼成功,要麼失敗(跟沒有發生過一樣),不要有任何的中間狀態。


一致性其實在一定程度上來說主要是資料庫層面的完整性,打個比方A的帳戶裡面100塊錢,B的帳戶裡面50塊錢,然後,A給B 25塊錢,首先是從A上減去25塊錢,然後將這25塊錢加到B上,最終都是75塊錢。不能出現A減25塊錢然後B的25塊錢沒有加上去,這樣全域性資料庫完整性就不一致了,這個屬性需要應用程式自己做更多的考慮,另外資料庫層面保證了原子性、隔離性以及永續性的時候,外加應用程式自身的邏輯是正常的,那這個一致性就是可以保證的。


什麼是隔離性呢,一般是指併發事務操作彼此之間不可見,簡單的說就是A做操作的時候不要讓B事務看到。


永續性,簡單的理解就是事務commit了以後要保證這個事務是一直不會丟失的。比如你把A減了100塊錢或者A加了100塊錢,這個事情如果告訴使用者已經成功了就是成功了,不能出現因為機器掛掉之類導致這種修改丟失。


還有一個概念也要提一下,這個也是一個比較老的概念,就是CAP。

NewSQL資料庫簡介

很多時候會把CAP一致性和ACID的一致性混在一起,CAP一致性跟ACID的一致性其實是兩回事情。CAP的一致性是針對很多個節點,要求各個節點之間的資料是完全一致的,也就是要求實際儲存的資料是完全一致的一致性,也就是純粹的多副本方式。


CAP裡的A其實就是高可用,簡單的理解就是隨時去訪問都可以訪問到,CAP裡的P是說在發生一些網路異常狀況的時候是否可以容忍。在絕大多數的系統當中,理論上來說CAP是不能同時滿足的,但在實際生產環境中往往選擇弱化的P,也就是當發生網路異常時直接將一部分異常節點捨棄保證剩餘節點的服務都是正常的從而保證了整體的服務,所以從這個角度上來說CAP是可以全部滿足的,或者說滿足生產需求已經足夠。

NewSQL資料庫簡介

上圖是我們在做分散式資料庫的時候一般的一些做法,很多的時候直接基於一些現有的SQL類產品,比如MySQL,外加一層資料庫中介軟體的方式比如引入Proxy的方式來解決這個分散式資料庫問題,SQL發過來以後由Proxy接收然後解析拆解,再把相應的SQL發到相應的SQL產品上,支援簡單的事務。為什麼叫做簡單的事務呢,因為如果只涉及到一個分片是可以的,但是多個就是支援不了的,確切的說是因為不能保證嚴格的分散式事務的語義,後面會詳細講一下。


三、NewSQL 

NewSQL資料庫簡介

那麼NewSQL是怎麼樣的?NewSQL有很多種可能的實現方式,這裡列舉NewSQL其中的一種架構模式,如上圖,上層相容SQL協議的一個協調者,然後通過RPC之類的通訊方式和底層儲存通訊,儲存節點可能會選擇Rocksdb之類的K/V儲存系統。為什麼說上圖這個是一個協調者,但看到的效果看起來也像一個代理像一個Proxy?他的區別在於可以做很多的事情,可以對這個事務進行一些記錄,記錄到日誌裡面,還可以提供全域性的事務ID之類,保證同一個大事務裡的各個節點上的子事務ID可以和全域性事務ID是一樣,後面會詳細講一下。


一般來說,NewSQL要支援SQL同時有NoSQL的優點,這個從實現上面來說給使用者的感覺就是SQL產品,SQL過來以後協調者會把它拆成各種各樣的KV操作,丟到各個節點上去,相當於丟到多個分片上,但同一個分片上有很多個節點,這些節點之間要保證資料是一致的,這樣可以做到這個分片上萬一有節點掛了,還有另外的節點可以對外提供服務。


1、隔離性

那怎麼保證同一個分片內多個節點之間的資料是一致的呢?Raft就是用來保證各個節點是一致的。為什麼上圖Rocksdb這層要引入Range的概念呢?因為作為一個節點可能資料量會非常大,後期要支援擴容怎麼擴?如果這個節點不拆分是沒有辦法擴的,所以要引入Range這個邏輯概念。需要擴容的時候就可以把Range進行拆分成多個,每一個Rocksdb上面放很多的Range,然後把這些Range遷移到其他的Rocksdb上面去,相當於通過拆分加遷移方式同時達到擴容整個叢集容量的目的,每一個Range相當於一個分片裡的節點,多個Range通過Raft構成一個分片,同一個分片裡的Range的資料是一樣的。


現在我們再回過頭去講一下,為什麼基於現有的SQL類產品開發一個Proxy的方式其實是沒有辦法保證嚴格的分散式事務的,有一種場景很容易理解:假設以MySQL為例,如果一個事務裡有多條SQL,這些SQL如果涉及到不同的MySQL例項,可能會出現一個分片的MySQL上提交成功了,另一個分片的MySQL掛了,那就會出現事務只提交一半的情況,這種情況就保證不了原子性。


如果有一個分片的MySQL掛了,事務的原子性無法保證這種場景是比較好理解的,但是其實就算所有的分片上的MySQL都是正常的也是無法嚴格保證事務的,為什麼呢?因為前面講過ACID裡有一個隔離性屬性,併發事務之間要求是不可見的,而基於MySQL中介軟體的方式是保證不了隔離性的。

NewSQL資料庫簡介

如上圖,假設有4個事務是同時發生的,對於理解就是併發過去的到Proxy節點的時候實際上肯定是有一個順序的,這個順序我們假設是T1、T2、T3、T4個順序,如果4個事務涉及到4個分片,4個事務同時落到四個片的MySQL上但實際上在每個MySQL上這四個事務的執行順序可能是不一樣的,每個MySQL上會有自己的一個執行序列,也就是這些事務在每個MySQL上會組成一個可序列化排程的序列,所謂可序列化排程就是併發的事務操作會按照一定的順序執行,執行以後的效果等價於這些事務按照某個順序序列執行的效果,那麼這個排程式列就是可序列化排程的,而這些等價的序列順序可能是一樣的也可能是不一樣的。比如這四個事務T1、T2、T3、T4在分片一上的執行順序可能是T1、T3、T2、T4,分片二上的執行順序卻是T4、T2、T1、T3,分片三的執行順序是T1、T2、T3、T4,而分片四上的執行順序是T1、T4、T2、T3。


在這種情況下,分片2上就會出現事務T1會看到T4和T2的修改,而在分片1、3和4上,事務T1事務是先執行的,所以並不會看到T4和T2的修改,這就相當於在全域性範圍內,事務T4和T2的部分修改被T1讀到了,而另一部分卻沒有被T1讀取到,出現了T1和T2及T4之間的隔離是有問題的,所以在全域性範圍內是無法保證嚴格事務之間的隔離性的。

NewSQL資料庫簡介

再舉個例子如圖所示,假設變數a和b都是5,此時有事務T1和T2且全域性執行順序是T1和T2,假設每個分片上都是按照T1和T2的方式執行,結果最終結果a和b都是14,此時是符合事務的可序列化排程的。


但是可能出現一種情況,在分片1上的執行順序是T2、T1,分片2上的執行順序是T1、T2,此時分片1上a就變成了15,而分片2上就變成了14, 這就不符合可序列化的條件了,因為從全域性來說T1和T2是混在一起的,即不等價於T1T2的執行順序也不等價於T2T1的執行順序。怎麼解決這個問題呢,這時一般會採用引入一個全域性的事務ID,在實際執行的時候可能會採用時間戳的方式,具體細節這塊今天先不展開討論了。


2、原子性

NewSQL資料庫簡介

前面講了隔離性問題,現在我們再講一下原子性,在保證分散式事務的時候要支援分散式事務語義,那ACID 4個屬性都要滿足,前面介紹了隔離性,那原子性這個怎麼解決呢?在實際實現的時候往往採用類似兩階段提交的方式,我這裡畫的是兩階段提交的理論上的定義,全域性會有一個協調者,事務要提交的時候協調者會傳送請求到各個參與節點,參與節點確認可以提交了就會回覆給協調者表示通過,如果參與節點表示這個事務因為一些原因不能提交就會給協調者反饋說這個事務需要回滾,那麼協調者就會根據這些反饋資訊來綜合決定事務是否需要提交。只有所有的參與節點都表示可以提交,協調者才會在自己先寫日誌提交這個事務,然後傳送commit命令到所有的參與節點,如果出現任何一個參與節點表示需要回滾,那麼協調者就會在先寫日誌表示abort這個事務,然後把abort資訊傳送給每個節點。圖上的每一個圈都是一個系統的狀態,是一個典型的狀態機,其中兩層圓圈表示的終止狀態,整個狀態機最終會到達終止狀態上,狀態機的東西在後面我也會再提一下。


3、永續性

講完NewSQL裡怎麼支援原子性和隔離性,我們再講一下永續性。同時也要提一下CAP裡的一致性,剛才已經說了CAP的一致性和ACID裡的一致性不是一個概念,CAP裡的一致性是解決多個節點副本之間資料一致性的問題,好比MySQL的主從資料完全一樣,那就符合CAP裡的一致性,從這個層面上來說CAP裡的一致性其實對應事務裡的永續性。

NewSQL資料庫簡介

為什麼這麼說呢,大家想一個例子,還是以MySQL的主從為例來說明。主從主要可以解決高可用的問題也可以解決資料備份的問題,如果主從之間假設沒有資料的複製,那麼在主掛了或者出異常以後,從接替主開始對外服務相當於保證了CAP裡的A,但是之前所有已經提交的事務都丟失了,因為主從之間沒有進行資料複製,相當於丟失了ACID裡的永續性。


假設主從之間有資料複製但是有延後,那麼當發生主從切換的時候,依然會存在事務丟失的情況,因為可能會出現有幾個事務在主上已經提交了,但是還沒有複製到從上,此時主掛了從開始擔任主對外提供服務依然保證了CAP裡的A,但是依然會存在已經提交的事務丟失的情況。所以從這個角度來說CAP裡的多個節點之間的一致性本質上是對應ACID屬性裡的永續性,如果不追求事務的永續性,那也就不用關心各個節點之間的資料是否一致了。


既然已經明確了CAP裡的一致性本質上對應了永續性這個屬性,那接下來的問題就是這個一致性也就是ACID裡的永續性怎麼做呢,對MySQL來說可能有半同步的複製方式,但是半同步在實際使用當中,如果真的出現一些問題比如網路問題或者機器效能問題等最終可能會變成非同步複製,並不能保證嚴格的一致性。

NewSQL資料庫簡介

所以在NewSQL中一般會考慮採用Raft來保證一致性。如上所示各個Node裡有很多的Range,各個Range之間通過Raft來保證彼此之間的一致性,多個Range組成的Raft組合相當於是一個分片,Raft保證了這些Range之間的一致性從而保證了事務在同一個節點的多副本上的永續性。


四、What is raft

在真正開始介紹Raft之前,我想先引入一個狀態機的介紹,因為前面的部分以及後面的部分都會涉及到狀態機,那什麼是狀態機呢,需要簡單介紹一下。


1、State machine

NewSQL資料庫簡介

其實狀態機可以簡單的理解就是一個五元組,狀態機可以記錄為M={Q, ?,δ, q0, F},其中Q是狀態集合;?是輸入符號,在實際工程中也可以理解為具體的事件;δ是轉移函式,表示在某個狀態下接收了某個符號會進入到什麼狀態;q0是整個狀態機的可能的起始狀態;F是整個狀態機的終止狀態,在實際表示的時候一般會用上層的圓圈表示,終止狀態的理解更恰當的說是指相對穩定的狀態,所以並不是說到了終止狀態以後整個狀態機就不工作了,比如圖上這個狀態機的效果就是接收了1*0+(0|1)*的字串。之所以在這裡提一下狀態機到底是一個什麼東西是因為前面的兩階段提交就是一個狀態機,後面的Raft也是到處都是狀態機。

NewSQL資料庫簡介

現在接下去講一下什麼是Raft,Raft簡單的說就是相比傳統的Paxos演算法來說是一個更簡單且比較容易理解,在工程上也比較容易實現的一種一致性演算法,通過選舉leader以及日誌複製的方式完成工作,具體的實現會有一些措施來確保整個演算法是可以安全工作的,比如如何保證操作複製到多數節點才生效,再比如出現異常時少數節點上有的日誌在大多數節點上可能是沒有的這種情況,如何通過演算法將這些日誌清除掉。

NewSQL資料庫簡介

上圖是Raft工作的示意圖,Client傳送請求到Leader上,consensus部分可以理解為Raft的主要工作部分,請求先傳送到consensus模組,consensus部分會把操作先記錄到本地日誌中,然後同時將這個操作複製到大多數其他節點上去,等確認大多數節點已經接收到了這個操作,然後會把這個操作apply到上層的狀態機,在實際實現的時候可以理解為把這個操作真正的應用到K/V儲存上去,比如Rocksdb。


2、Server State

NewSQL資料庫簡介

一個Raft組合相當於有很多節點,裡面除了leader的角色還會有其他的角色,上圖是一個角色轉換圖,一個新加入的節點首先是一個follower的角色,如果follower加入的時候發現沒有leader就會變成Candidate的角色,發起選舉準備競選leader,如果這個candidate節點收到了大多數節點的投票,那麼它就可以順利的成為leader開始對外提供服務。但是如果此時沒有選舉成功且整組裡還是沒有leader,那麼這個candidate會繼續進行選舉。如果這個candidate發起選舉的時候發現已經有其他的節點成為了leader,那麼它就會回到follower角色,這是一個典型的一個狀態機,其中follower是起始狀態,而follower和leader可以理解為終止狀態,candidate是普通中間狀態,也就是每一個節點的穩定狀態最終一定會在停留在這兩個狀態中的一個,終止狀態不代表一旦進入就要永遠停留在這個狀態,確切的說應該理解為一種相對穩定的狀態。


3、Term & log index

NewSQL資料庫簡介

在介紹日誌複製之前,需要介紹兩個概念,Term和Log index,Term相當於一個抽象的邏輯時間單位,每個Term裡只有一個leader,如果在這個Term裡沒有發生網路抖動或者leader出異常的情況也就是沒有發生新的選舉的情況,那麼這個Term一直保持不變,leader也一直保持不變。Log index是指每條操作命令在記錄到日誌的時候所在日誌的位置,可以將log理解為一個很大的陣列,log index就像是這個大陣列的下標,往Log裡每新增一條操作,log index就加1。在新增操作的時候要同時記錄該操作對應的index以及Term,所以會出現不同操作命令對應的Term是一樣的情況,比如圖上x=1這個操作Term是1,log index是1,y=1這個操作Term是2,log index是2,假如在此時發生了一次選舉,後面的操作的記錄情況可能出現如圖上所示的情況,x=7這個操作Term=2,log index是3,y=5這個操作Term=2, log index是4,x=2這個操作Term=2,log index是5,假設此時又發生了選舉,每次選舉的時候Term都會往上增加,此時Term變成了3但是因為一些原因這個Term內選舉沒有成功,當這次選舉失敗以後發現還沒有leader就繼續將Term增大到4繼續進行選舉,所以後面的y=3的操作記錄的時候對應的Term就是4,log index=6,緊接著之後y=6的操作Term=4,log index=7,後續其他操作的記錄方式跟這個類似。


4、Log replication

NewSQL資料庫簡介

下面我們再以日誌複製的具體例子來分析一下日誌是怎麼在Raft的各個節點之間進行復制的。假設有3個節點,leader上有這些日誌,從圖上可以看到已經記錄了有12條操作,方框裡的數字是Term,從圖上可以看到這個系統已經發生過幾次選舉,但是這個leader後來重新選舉的時候又繼續成為了leader,方框上面的數字代表的是log index,可以看到log index是依次遞增的。這些所有的操作會被複制到所有的follower上,在leader這端相當於會維護一個資訊記錄每個follower都複製到哪裡了,比如這個圖上所示follower1已經複製到log index為6的位置了,而follow2已經複製到log index為9的位置了,因為leader自己已經到了log index為12的位置,那麼在全域性來說log index為9以及9之前的操作都已經複製到了大多數節點上,所以9這個位置及之前的操作都可以安全的apply到上層的狀態機,在實際實現的時候可以理解為可以把這個操作安全的應用到Rocksdb上,而9這個位置也就是commit index, commit index代表的是這個log index所在位置及以前的操作在全域性範圍內已經複製到了大多數節點上是不會丟失的,本質是滿足持久化條件的,所以可以安全的將這些操作真正的生效。


日誌複製裡還有兩條非常關鍵的特性,在同一個Raft組裡不同節點日誌上的操作如果log index和Term是一樣的,那麼對應的操作一定是一樣的;另一個是如果不同節點日誌上的某個位置擁有相同的log index和Term,那麼表示在這個位置之前的所有的操作都是一樣的。

NewSQL資料庫簡介

具體講一下這個是怎麼做到的,這裡簡單舉個例子,上圖示意的是一個leader和其中一個follower的情況,假設這個follower是follower1,從圖上可以看出來Term為1的時候leader是leader,Term為2和3的時候,follower1成為了leader,不過從Term=4之後原來的leader又重新成為了leader,並且後來可能因為網路抖動等原因又發生了一次選舉,leader節點依然被選為了leader,所以會看到Term=5的時候leader這個角色保持不變。


此時出現了一種什麼情況呢,在follower1上我們可以看到Term=2和Term=3的時候對應的log index依次為4、5、6,而這三條操作在leader的日誌裡沒有。這是一種什麼樣的情況呢,有可能的一種情況是在Term=2和Term3的時候,follower1成為了leader,把這三個操作記錄到了自己的日誌中,但是還沒來得及複製到其他節點上結果因為網路抖動或者自身異常等一些原因,原來的leader重新發起選舉又成為了leader。這個時候原來leader對外正常提供了服務,且日誌裡記錄了Term=4及以後的操作,那這個follower1在接收leader日誌的時候有一部分日誌和leader的日誌就是不一樣的,這部分日誌我們之前也已經提過需要剔除掉的。


那怎麼剔除掉這部分日誌呢?在這個follower重新連上leader的時候,leader會把當前自身的<serverid, currentITerm, preLogTerm, preLogIndex> 資訊傳給follower1,  preLogTerm和preLogIndex分別是leader當前日誌裡的最後一條日誌的資訊,在這個圖中假設暫時沒有新的發生選舉,那麼此時leader傳給follower1的currentITerm、preLogTerm、preLogIndex分別是5,5,12。Follower1收到訊息以後會檢查自己日誌的資訊,一看自己當前的preLogTerm和preLogIndex分別是3和6,明顯是不對應的,所以follower會告知leader自己當前的lastLogIndex,也就是自己當前日誌的index位置,圖中的情況follower1告訴leader自己的last log index是7,此時leader會直接到自己log index為7的位置準備把資訊發給follower1,同時會把7位置之前的6位置的Term和log index資訊傳送給follower1,在leader上6位置的Term=4,而在follower1上6位置的Term=3,說明此時還是沒有匹配上,於是leader會繼續把該複製給follower1的日誌的起始位置繼續往日誌起始的方向挪動,一直到log index=3的時候Term=3剛好對應上,那說明此時leader和follower1在log index=3之前的位置記錄都是一樣的,可以從log index=4的位置開始將操作記錄一條一條的複製給follower1,從而做到即使因為一些極端的情況某些日誌不一致了也可以將沒有被複制到的大多數節點上的日誌是安全清除。


最後小結一下,今天主要是講了一下NewSQL怎麼支援分散式事務,根據事務ACID的屬性分析了一下,原子性主要是採用兩階段提交的方式來保證,一致性的話其實和傳統的資料庫的一致性一樣,主要是資料庫整體的完整性,隔離性的話可以考慮採用全域性時間戳這類的方式實現,永續性的話採用的Raft的方式也就是對應CAP裡的一致性。最後還講了Raft師怎麼工作的,最主要的就是兩部分,一個是leader選舉,一個是日誌複製。

 

關於APMCon:

2016中國應用效能管理大會(簡稱APMCon 2016)於8月18日至19日在北京新雲南皇冠假日酒店隆重召開。APMCon由聽雲、極客邦和InfoQ聯合主辦的作為國內APM領域最具影響力的技術大會,首次舉辦的APMCon以“驅動應用架構優化與創新”為主題,聚焦當前最為熱門的移動端、Web端和Server端的效能監控和管理技術,整個會議設定包含了:效能視覺化、服務端監控實踐、運維自動化、資料庫效能優化、APM雲服務架構和HTML5調優最佳實踐等話題,致力於推動APM在國內的成長與發展。






About Me

.............................................................................................................................................

● 本文整理自網路

● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、部落格園(http://www.cnblogs.com/lhrbest)和個人微信公眾號(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/

● 本文部落格園地址:http://www.cnblogs.com/lhrbest

● 本文pdf版、個人簡介及小麥苗雲盤地址:http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答:http://blog.itpub.net/26736162/viewspace-2134706/

● DBA寶典今日頭條號地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

.............................................................................................................................................

● QQ群:230161599     微信群:私聊

● 聯絡我請加QQ好友(646634621),註明新增緣由

● 於 2017-07-01 09:00 ~ 2017-07-31 22:00 在魔都完成

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

.............................................................................................................................................

小麥苗的微店https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

小麥苗出版的資料庫類叢書http://blog.itpub.net/26736162/viewspace-2142121/

.............................................................................................................................................

使用微信客戶端掃描下面的二維碼來關注小麥苗的微信公眾號(xiaomaimiaolhr)及QQ群(DBA寶典),學習最實用的資料庫技術。

   小麥苗的微信公眾號          小麥苗的QQ群             小麥苗的微店

.............................................................................................................................................

NewSQL資料庫簡介
DBA筆試面試講解
歡迎與我聯絡



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2142748/,如需轉載,請註明出處,否則將追究法律責任。

相關文章