MongoDB 4.0搶先看 - 副本集支持多文檔事務
MongoDB 4.0搶先看 - 副本集支持多文檔事務
簡介 |
NoSQL資料庫大多不提供事務機制,原因在於它們是分散式系統架構,其一系列寫操作存取的資料,可能位於不同的分區伺服器。因此,分散式的多文檔事務,其原子性需要很高的協調性。內文將重點介紹 MonogDB 的事務之路 (Path to Transactions)。 |
作者 |
莊興旺 |
MongoDB 4.0搶先看 - 副本集支持多文檔事務
前言
MongoDB 為聚集導向的NoSQL
MongoDB 讓用戶透過靈活的資料結構,設計 "聚集" 後的資料,提供AP想要處理資料的最小單位(Document),適合分散式資料庫儲存。

圖. Relation to Document
NoSQL設計,很難滿足事務特性。
資料庫系統在做 "事務 transaction" 操作時,需具備ACID的4個特性:
1. 原子性(Atomicity):要麼全部被執行,要麼都不執行
2. 一致性(Consistency):資料應滿足完整性約束
3. 隔離性(Isolation):事務併發時不互相影響
4. 持久性(Durability):提交後的事務將被永久保存
我們常聽到,NoSQL犧牲強一致性,使其能在分散式架構,水平擴展換取高可用性。但是,資料分散在多節點,很難保證多聚集事務的原子性,故通常NoSQL初始設計就不支持多聚集的事務功能。
通常來說,聚集導向的資料庫在跨多重聚集時並沒有 ACID事務。但是,每一次在單一聚集上的操作則是支援原子性質。這代表,若我們想要在單一動作中操作多重的聚集,必須要自行在應用程式碼中管理。 (參考 "搞懂NoSQL的15堂課")
但是,MongoDB身為NoSQL的領頭羊,其設計理念為 Nexus 架構 (集結RDB和NoSQL優點),自身又定位為通用型資料庫,仍不放棄實現NoSQL事務功能。因此,MongoDB開發團隊正逐步實現多文檔事務所需的基礎建設,等到功能完善,將讓開發者得以處理更多應用場景。(例. 金流系統、進銷存系統、帳單系統)
註. 文檔是聚集的一種表現方式
多文檔事務
釋出時間
MongoDB, Inc.預計在2018年夏天釋出4.0,將支持多文檔事務,4.0事務的系統架構只限於副本集 (Replica Sets),而分片叢集 (Sharded Cluster) 的事務,預計要等到4.2。

圖. Java - Transaction Semantics (pseudo)
開發歷程/事務之路
MongoDB為了事務的資料完整性,於2014/12/16宣布併購WiredTiger Inc.,引進其儲存引擎技術,作為事務的基礎建設。

圖. Roadmap to Transactions
l MongoDB 3.0 具備文件級(Document Level)的並行控制以及壓縮功能,還提供MVCC(Multiversion Concurrency Control)這種像是PostgreSQL關聯式資料庫,確保事務功能的儲存層基礎功能。
l MongoDB 3.2 新增
1. Replication protocolVersion: 1 增強型共識協定,能讓主要副本集(Primary Replica Set)成員的網路分區(Network Partition)快速的從故障中恢復,並更嚴謹的確保寫入的持久性(Durability)。
2. readConcern選項 (讀取多少副本後回應),允許應用程序在每個操作的基礎上,指定讀取隔離級別,從而提供強大的粒度一致性控制。
l MongoDB 3.6 引入
1. 全局邏輯時鐘 (Global logical clock/ Cluster Wide Logical Time) 協助建立分散式叢集的全局資料快照,以實現多文檔事務快照隔離。通過快照隔離(Snapshot isolation),事務將提供全局一致性資料視圖,並執行 all-or-nothing來維持資料完整性(Data integrity)。此功能在分佈式集群中的每項操作中使用一致的時間,讓多文檔事務能夠提供快照隔離保證。
2. 儲存層時間戳 (WiredTiger timestamps) 強化分散式儲存層的操作順序之正確性。
上述兩者,支撐起3.6大量新功能的實現:
Ø Consistent secondary reads in sharded cluster(Safe Secondary Read)即使系統正在叢集間搬遷資料做平衡,也會對 Secondary 成員提供一致的讀取。
Ø Logical sessions 是Causal consistency和 Retryable writes的基礎,從多文檔事務的角度來看,它們的價值在於協調分散式叢集客戶端和伺服器操作,管理事務中每個語句執行的上下文。
Ø Retryable writes 允許 MongoDB drivers在網路異常或選舉Primary期間,自動重新執行一次事務(原子性操作)。簡化應用程序的開發工作。
Ø Causal consistency 允許開發人員在“讀取自己的寫入”保有強一致性,是根據Logical sessions和全局邏輯時鐘的啟用。確保寫入節點的資料,傳播到讀取節點上。
Ø Change streams 允許開發人員構建響應式應用程序,當資料庫資料變動時,實時查看、過濾和觸發。Global logical clock和WiredTiger timestamps為Change streams提供了可恢復性(resumability) -從短暫故障節點中自動恢復。因此消費類應用程序可以從發生節點故障的時間點,繼續完成更改。
l MongoDB 4.0已經完成的功能,是支援副本集時間點讀取(Replica Set Point-in-time Reads),不只對於維持事務一致性十分關鍵,在日常讀取運作上也很有用。離完整的事務功能,只剩幾步之遙。
小結
NoSQL 聚集導向的資料結構,大多無法支持多文檔的事務,限制了 NoSQL 的應用場景。
即使應用程式不需要事務,或改由 Two-phase Commit方式完成,用戶仍不敢將 RDB 換成 NoSQL。
用戶往往會想說,如果系統突然需要用到事務怎麼辦 ?
2018年 2月,MonogoDB Inc. 宣布今年夏天將釋出新功能 - 副本集支持多文檔事務,讓用戶放心使用 NoSQL。
看到MDB的股價從2月份開始持續上漲,我們能明白,整個市場看好MongoDB的未來發展。

圖. NASDAQ - MDB