合理配置寫入參數來提升數據安全
更新時間 2023-08-29 15:14:27
最近更新時間: 2023-08-29 15:14:27
分享文章
本頁介紹了 WriteConcern 的概念以及如何使用 WriteConcern 提升數據安全。
文檔數據庫服務實例采用多副本存儲數據,其中一個副本的角色是 primary 接受數據寫入,其他節點通過 oplog 同步數據變更。
如果 primary 節點在成功寫入數據后就宕機了,但是數據還沒有被其他 secondary 節點同步。此時后臺會重新選舉一個正常的 secondary節點為新 primary 節點,但是這個新 primary 節點不包含最新寫入的數據。而原 primary 節點在修復完成并重新加入到副本集之后會成為 secondary 節點,之前最新寫入的數據會進行 rollback。
為了避免 primary 節點意外宕機導致部分數據被回滾的情況,用戶可以指定 write concern 設置寫入級別,指定數據成功復制到多少個節點之后再返回。
Write concern 指定的格式如下:
{ w: <value>, j: <boolean>, wtimeout: <number> }
其中 w 指定了數據成功復制到多少個 mongod 節點之后再返回結果給客戶端(包含 primary 節點自己),常用的配置包括:
- 數字。比如 0、1 等。
- "majority"。服務端會根據副本集當前有投票權的節點個數自動計算大多數節點的個數,比如 3 個 mongod 節點的副本集,每個 mongod 節點默認都有投票權限,則 "majority" 個數為 2。
參數 j 表示是否后臺寫完 journal 再返回成功,可以指定為 true 或者 false。如果 w 指定了 “majority”,則默認 j 為 true。
wtimeout 表示操作的執行超時,以毫秒為單位,在 w 大于 1 時生效。
對于 3 副本的節點,建議 w 指定為 "majority",并根據業務的實際需求指定 wtimeout。這樣可以避免主節點在意外宕機后出現的部分數據丟失,通過能兼顧較好的可用性。使用示例如下:
db.coll.insert({a:1}, {writeConcern: {w: "majority", wtimeout: 1000}})