簡體   English   中英

MongoDB 在插入時的安全模式有多安全?

[英]How safe is MongoDB's safe mode on inserts?

我正在做一個包含一些重要數據的項目。 這意味着如果燈或服務器出現故障,我們不能丟失任何東西。 我們使用 MongoDB 作為數據庫。 我想確保插入后我的數據在數據庫中,如果沒有插入一個元素,則回滾整個批次。 我知道 Mongo 背后的理念是我們不需要事務,但我如何確保我的數據在插入后真正安全地存儲,而不是發送到某個“黑洞”。

  • 我應該進行搜索嗎?

  • 我應該使用一些特定的 mongoDB 命令嗎?

  • 即使一台服務器足以滿足我是否應該使用分片
    速度,順便說一句,如果光線充足,它不能保證任何事情
    下跌降落?

什么是最好的解決方案?

您最好的選擇是使用 Write Concerns - 這些允許您告訴 MongoDB 一條數據的重要性。 最快的 Write Concern 也是最不安全的 - 在下一次計划的刷新之前,數據不會刷新到磁盤。 最安全的方法是在返回之前確認數據已寫入多台機器上的磁盤。

您正在尋找的寫入問題是 FSYNC_SAFE (至少從Java 驅動程序的角度來看它是這樣稱呼的)或 REPLICAS_SAFE 確認您的數據已被復制。

請記住,MongoDB 沒有傳統意義上的事務 - 您的回滾必須手動滾動,因為您無法告訴 Mongo 數據庫為您執行此操作。

您需要做的另一件事是使用相對較新的--journal選項(使用預寫日志),或者使用副本集在多台機器之間共享您的數據,以便在發生崩潰時最大限度地提高數據完整性/電力流失。

在處理特別大的數據集時,分片與其說是一種防止硬件故障的保護,不如說是一種分擔負載的方法——分片不應與副本集相混淆,副本集是一種將數據寫入多台機器上的多個磁盤的方法.

因此,如果您的數據足夠有價值,您絕對應該使用副本集,甚至可能在其他數據中心/可用區/機架/等中設置從站,以提供您需要的彈性。

有/將(不記得副手是否已實現)來指定副本集中單個節點的優先級如果有這樣的機器可用(即阻止該國另一端的奴隸成為主人,除非它確實是唯一的其他選擇)。

我從谷歌群組上一個叫做GVP的人那里得到了一個非常好的答案。 我會引用它(基本上它加起來就是 Rich 的回答):

我想確保插入后我的數據在數據庫中,如果沒有插入一個元素,則回滾整個批次。

這是一個復雜的主題,您必須在此處考慮幾個權衡。

我應該使用分片嗎?

分片用於擴展寫入。 為了數據安全,您希望查看副本集。

我應該使用一些特定的 mongoDB 命令嗎?

首先要考慮的是 Andreas 指出的“安全”模式或“getLastError()”。 如果您發出“安全”寫入,您就知道數據庫已收到插入並應用了寫入。 但是,MongoDB 僅每 60 秒刷新一次磁盤,因此如果沒有磁盤上的數據,服務器可能會失敗。

要考慮的第二件事是“日志”(v1.8+)。 打開日記功能后,每 100 毫秒將數據刷新到日志中。 所以你有一個更小的 window 在失敗前的時間。 驅動程序有一個比“安全”更進一步的“fsync”選項(檢查該名稱),它等待確認數據已刷新到磁盤(即日志文件)。 但是,這僅涵蓋一台服務器。 如果服務器上的硬盤死了會發生什么? 那么你需要第二個副本。

第三要考慮的是復制。 驅動程序支持“W”參數,表示“將此數據復制到 N 個節點”,然后再返回。 如果在某個超時之前寫入沒有到達“N”個節點,則寫入失敗(拋出異常)。 但是,您必須根據副本集中的節點數正確配置“W”。 同樣,由於硬盤驅動器可能會發生故障,即使使用日記功能,您也需要查看復制。 然后是跨數據中心的復制,這太長了,無法進入這里。 最后要考慮的是您對“回滾”的要求。 據我了解,MongoDB 沒有這種“回滾”能力。 如果您正在執行批量插入,您將得到的最好結果是指示哪些元素失敗。

這是 PHP 驅動程序的鏈接: http://it.php.net/manual/en/mongocollection.batchinsert.ZE1BFD762321E409CEE4AC0B6E841963上的復制和CEE4AC0B6E841963 參數的詳細信息。 我相信同樣的限制也適用於此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM