国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

MongoDB3.2 之 Rollback講解及避免

go4it / 3581人閱讀

摘要:解釋首先,到底是什么意思呢在關系型數據庫中因為有事務的概念,操作數據后在沒有之前是可以執行命令進行數據回退的。

前言

前段時間突然發現數據庫文件路徑下多了個rollback名字的文件夾,很是納悶,里面居然還有.bson后綴格式的文件,隨一探究竟。
原來是在這段時間內發生過failover(主從切換),導致了某些不一致數據的丟失,這可是一個大問題啊,弄不好就是要丟數據的,
故進行了些調查研究,詳述于此;供大蝦們大繩們指點。

解釋

首先,rollback到底是什么意思呢?在關系型數據庫中因為有事務的概念,操作數據后在沒有commit之前是可以執行rollback命令進行數據回退的。
而在單實例mongodb中,寫入就寫入了,刪除就刪除了,沒有事務的概念,也沒有rollback的操作,所以這里要討論的是replicaset(復制集)的rollback

事故演示

如下圖架構,在primary上執行寫操作


步驟1: 客戶端向Primary寫入3筆數據 1、2、3, 經過oplog日志后同步到secondary節點上,此時各個節點數據一致
步驟2: 但當Primary節點再次被寫入一筆數據4的時候,發生宕機,此時 數據4 還沒來得及同步到從節點上
步驟3: 此時集群短時間關閉寫操作開始競選,經過一系列選舉后有了新的primary節點,此時新Primary節點上是沒有數據4的
步驟4: 新的primary承接了客戶端的write請求,寫入新數據 5,此時新primary的數據狀態為1,2,3,5
步驟5: 原primary節點重新啟動后申請加入replica member作為secondary節點,因為此時它與新primary數據不一致,所以就會發生rollback(回滾)動作,將數據狀態恢復為1,2,3
步驟6:回滾完之后,將繼續同步新primary節點的數據,之后數據狀態變為1,2,3,5

rollback發生的具體過程:

請看下圖:

流程說明

客戶端驅動在連接mongo之后進行寫操作的大致流程就是這樣的,寫操作會按照編號順序進行, 當Client收到5號的response反饋后即認為寫入成功,
而如何數據已寫入journal files,但是尚未oplog同步到Secondary節點重放,如果此時發生Primary宕機,則就會造成主從之間數據不一致,即原Primary中有
剛才新寫入的數據,但新選舉出來的Primary卻沒有那部分數據,從來造成數據丟失

結論

綜上所述,rollback的發生,主要是Primary寫入數據后還未來得及同步到secondary節點時,發生宕機事故,導致數據缺失,
經重新選舉后產生新primary節點,但當原Primary重新加入集群時,由于要追隨新Primary節點進行強一致性處理,所以會回滾宕機前未同步的數據。

存放位置

那么回滾的數據跑到哪里去了呢?當rollback發生時,MongoDB將把rollback的數據以BSON格式存放到dbpath路徑下rollback文件夾中,BSON文件的命名格式如下:

...bson

還原數據

那么這個rollback數據如何寫回到mongodb呢?我們可以利用mongorestore命令進行基于文件的恢復操作,具體操作可以看我另外一篇關于mongodump/mongorestore的文章

mongorestore --host  --db db1 --collection c2 -u admin_user -p"123456" --authenticationDatabase admin rollback/c2_rollback.BSON
避免策略

要講避免策略那就應先講講Write Concern(寫關注),也就是關心寫操作。是在驅動的connection level進行配置,支持一下值:

* w:0 | 1 | n | majority | tag
* j:1
* wtimeout: millis

w:0 unacknowledged
驅動只是一味的進行寫入操作,不會關心是否寫入成功,也就是mongo不會返回操作結果

w:1 Acknowledged
看圖我們很容易理解,Driver在做寫入操作后會收到mongod的反饋OK還是NG,而這個反饋行為只是在確認數據被成功寫入Data Buffer,Journal Buffer
后的狀態,不保證數據能夠被寫入datafile(落盤)

J:1 Journaled
驅動寫操作不僅要寫入Journal Buffer,Data Buffer中,還要確認數據持久化到Journal file中后才反饋結果。
即使數據庫宕機,重啟后,操作已經持久化到journal中,可以完全恢復,但前提是mongod一定要開啟journal參數

w:2/n/majority Replica Acknowledged
看到下圖,你應該就明白一半了,好的,下一半讓小弟再給你解釋一下。
rollback的發生就是因為數據成功寫入Primary,但是尚未同步到Secondary節點,此時Primary宕機,
當原Primary重新加入集群后則會發生灰色數據自行rollback的現象,那么怎么避免呢?當然就是在發送反饋信息給驅動前
確保數據已經更新到至少一個Secondary節點,不就完美解決此問題了。是的,使用w:2/n/majority的配置參數
就能實現,當然,為了防止網絡問題出現阻塞等待,我們可以設置wtimeout

Rollback 的限制

應用官方的一段話:

我的理解是rollback的數據超過300M后就需要手動干預從原Primary去除灰色數據了,但是有網友測試3G多的數據也能自行rollback,
So,I"m not clear the real meaning of the Limitations

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19122.html

相關文章

  • 【云數據庫 MySQL UDB】什么是UDB?產品功能,規格版本和使用限制

    摘要:版本目前支持和,用戶可以根據需求選擇相應的云數據庫版本。硬盤云數據庫的硬盤大小。云數據庫提供自動備份和手動備份兩種方式,防止數據丟失,避免誤操作帶來的風險。日志日志是用于記錄云數據庫操作事件的記錄文件。什么是云數據庫MongoDB?云數據庫簡介: 云數據庫MongoDB是基于成熟云計算技術的高可用、高性能的數據庫服務,完全兼容MongoDB 協議,支持靈活部署,除副本集實例架構外,云數據庫...

    Tecode 評論0 收藏0
  • php微服務【分布式事務】

    摘要:分布式事務一直是微服務的一個難點。相關的解決方案和框架大部分是的,那么該如何解決呢下面一步一步講解如何用解決分布式事務。框架極簡高性能松耦合分布式可運行于多種環境框架完美支持上面的要求。 分布式事務一直是微服務的一個難點。相關的解決方案和框架大部分是java的,那么php該如何解決呢?下面一步一步講解如何用php解決分布式事務。 單機單數據源事務 首先從單機事務開始。 大概邏輯如下 :...

    Tamic 評論0 收藏0
  • Centos7 安裝mongodb記錄

    摘要:下載解壓啟動查看進程關閉服務檢查端口是否已被啟動另一種配置文件啟動方式這個要指定文件日志追加遠程連接要指定不然無法連接。 下載解壓 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.2.tgz tar -zxvf mongodb-linux-x86_64-3.6.2.tgz mv mongodb-linux-x...

    Julylovin 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<