開頭還是介紹一下群,如果感興趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有問題,有需求都可以加群群內有各大數(shù)據庫行業(yè)大咖,CTO,可以解決你的問題。加群請聯(lián)系 liuaustin3 ,(共2000人左右 1 + 2 + 3 + 4 +5) 新人獎直接分配到5群,另歡迎 OpenGauss 的技術人員加入。
這里翻譯一篇關于 mongodb 數(shù)據一致性的白皮書,這是一份有10頁的文檔?;跀?shù)據一致性的部分內容,在其他的傳統(tǒng)數(shù)據庫,緩存數(shù)據庫都不存在,也是一個讓傳統(tǒng)DBA 想不明白的部分,所以進行翻譯。
繼續(xù)第一篇:
在上一篇中我們討論了寫入和讀取的concern的級別,下面我們將討論細節(jié),在本文中,我們將在存儲引擎層引用一個事務為wiredTiger事務,為提供高可用性,Mongodb 提供了作為復制集運行數(shù)據庫的功能,復制集合采用基于 leader的一致性協(xié)議,類似raft協(xié)議,在一個復制集中存在一個primary和眾多的secondary,主節(jié)點接受客戶的數(shù)據寫入并將其 插入到oplog的日志,oplog是一個邏輯日志,齊總每個條目包含關于如何應對單個數(shù)據庫操作的信息,每個條目都有自己的時間戳這些時間戳是有序的,這些時間戳在節(jié)點日志中是唯一且完全有序的,oplog條目不包含足夠的信息來撤銷操作,可以看做一個普通的文檔的集合,當不在需要的時候,最老的文檔將被刪除,文檔會被重復利用,循環(huán)利用,從節(jié)點復制OPLOG并應用,通過這個方式來同步數(shù)據,基于這樣的方式,其他的從及節(jié)點也可以從,secondary 上拉去自己還未得到的oplog,一旦受到就應用,不必以事務的方式來應用。
客戶端寫入必須發(fā)送到主節(jié)點,而讀取可以發(fā)送到主節(jié)點或從節(jié)點,客戶通過驅動程序與復制集進行交互,驅動程序是一個客戶端的庫,實現(xiàn)了與復制集正確通信兵監(jiān)控其健康狀態(tài)的標準規(guī)范,在內部,驅動程序通過類似RPC的協(xié)議與復制集的節(jié)點通信,以BSON格式發(fā)送數(shù)據,為實現(xiàn)水平擴展MongoDB 還提供了分片功能,允許用戶將數(shù)據分布在多個復制集中,但本文不會討論分片的詳細信息。
MongoDB中的一致性級別,在MongoDB復制集中,一致性級別通過ReadConcern和writeConcern級別想客戶暴露,這兩個級別是任何讀取或寫入操作的參數(shù),要理解和讀取和寫入關注的語義,需要對MongoDB 復制系統(tǒng)中的操作的生命周期有了解,MongoDB復制系統(tǒng)將進入系統(tǒng)的而每個寫入操作串行到oplog中,當操作由副本集的主節(jié)點處理時,該操作的效果必須被寫入數(shù)據庫,并且該操作的描述也必須寫入oplog,MongoDB中的所有操作都發(fā)生在wiredTiger 事務中,當操作的事務提交是,我們稱為本地提交,一旦他被寫入數(shù)據庫和oplog中,他可以被復制到從節(jié)點,當oplog數(shù)據傳播到足夠多的節(jié)點的情況下,我們稱之為大多數(shù)提交,這意味著它在復制集中是永久持久性。
writeConcern可以被指定為數(shù)值,或majority,在任何寫入語句中,w:1寫操作的客戶端將在該寫入在服務器的主節(jié)點后,立即受到確認,當你將語句中帶入 w:N 完成的時候,寫操作至少會寫入N個服務器后才在本地將事務提交,當你寫入 w:majority的時候,寫操作客戶端在寫入操作被大多數(shù)提交之前不會受到事務的確認信息。
這意味著,寫入將對復制級中任意一組節(jié)點的臨時或永久性來說是具有彈性的,這也是Mongodb 在事務的一致性上,能做到其他數(shù)據庫無法達到的彈性。假設你希望你寫入的數(shù)據在操作系統(tǒng)層面或硬件層面不存在丟失的可能性,則 w:大多數(shù),可以向你的寫入的客戶端保證數(shù)據不丟失。
寫關注還可以接受一個布爾值,"j"參數(shù),該參數(shù)確定數(shù)據在想客戶端確認之前是否在復制節(jié)點上被日志記錄,甚至你可以指定數(shù)據必須寫到你指定的那個節(jié)點上,本文不再詳細討論j 或 tag set選項,指定寫入關注客戶端操作可能會收到服務器不同類型的相應,這些寫入關注相應可分為兩類,滿足和不滿足,滿足的寫入關注意味著必須以滿足必要條件,如在w:2的情況下,客戶端會保證已經有兩個數(shù)據庫服務器節(jié)點寫入了數(shù)據后才能反饋寫入任務完成,對于不滿足的寫入關注,這并不一定意味著寫入失敗,寫入只是為達到預期的寫入節(jié)點數(shù)量的需求,稍等寫入達到節(jié)點的數(shù)量要求就會進行反饋。
readConcern 確定從服務器返回的數(shù)據的持久性和在某些情況下的一致性,在readConcern級別"local"執(zhí)行讀取操作的時候,返回的數(shù)據將反應查詢執(zhí)行在副本集合中的部分節(jié)點的局部情況,(這里不是翻譯,是我個人的理解,傳統(tǒng)DBA可以理解為臟讀,但僅僅是類似并不是概念的完全對齊,只是方便快速理解),這里并沒有保證返回的數(shù)據是大多數(shù)提交的,他只反應特定節(jié)點所知道的最新的數(shù)據情況,存在讀取的數(shù)據。在他讀取任何本地提交的數(shù)據,使用readConcern級別"majority"進行讀取操作,保證只返回大多數(shù)提交的數(shù)據,對于大多數(shù)讀取,返回的數(shù)據的是否是最新的并不重要,而是已經確認一定會commit的數(shù)據。
同時MongoDB還提供了可線性化的readConcern,當w:majority寫操作結合時提供最強的一致性保證,使用readConcern 級別“線性化”進行讀取的操作保證返回在讀取操作開始前返回的結果如上提出的在大多數(shù)Mongodb 已經落盤。在操作中這是自動判斷的,在讀取的某個瞬間來判斷返回的數(shù)據是否在大多數(shù)節(jié)點應用。
MongoDB提供可用和快照讀取的級別,支持因果一致性讀取的能力,同時MongoDB 本身雖然是文檔數(shù)據庫,但具有MVCC的能力,提供快照隔離,由可用“讀取”關注提供的一些特定的細節(jié)在本文中,不做討論。
文章來源:http://www.zghlxwxcb.cn/news/detail-841259.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-841259.html
到了這里,關于MongoDB 可調節(jié)的一致性,其他數(shù)據庫都不行系列 (白皮書 翻譯)--2的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!