天天看點

MongoDB Security

1.  Security

MongoDB提供了一系列的保護措施,以保護它自身安全:

  • 啟用通路控制并實行身份驗證
    • MongoDB支援多種身份認證機制,預設的認證機制是SCRAM 
  • 配置基于角色的通路控制
    • 首先建立一個管理者賬号(administrator),然後建立其他賬号。為每個通路系統的人和應用程式建立一個唯一的MongoDB賬号
    • 遵循最小特權原則。建立定義一組使用者所需通路權限的角色。然後建立使用者,并僅為他們配置設定執行操作所需的角色。使用者可以是人,也可以是用戶端應用程式
    • 一個使用者可以擁有跨不同資料庫的權限。如果一個使用者需要在多個資料庫上的權限,請建立一個具有授予适用資料庫權限的角色的使用者,而不是在不同的資料庫中多次建立該使用者
  • 加密通信(TLS/SSL)加密和保護資料
    • 将 MongoDB 配置為對所有輸入和輸出連接配接使用 TLS/SSL
  • 限制網絡暴露
    • 確定MongoDB運作在受信任的網絡環境中,并配置防火牆或安全組來控制MongoDB執行個體的入站和出站流量
    • 禁用直接SSH root通路
    • 僅允許受信任的用戶端通路 MongoDB 執行個體可用的網絡接口和端口
  • 審計系統活動
    • 跟蹤對資料庫配置和資料的通路和更改
  • 使用專用使用者運作MongoDB使用安全配置選項運作MongoDB
    • 使用專用作業系統使用者帳戶運作 MongoDB 程序。確定該帳戶具有通路資料的權限,但沒有不必要的權限

1.1.  Authentication(認證)

Authentication 是驗證使用者的身份

Authorization  授予使用者對資源和操作的通路權限

簡而言之,認證是告訴我“你是誰”,授權是“你可以做什麼”

通路控制很簡單,隻有三步:

  1. 啟用通路控制
  2. 建立使用者
  3. 認證使用者 

Salted Challenge Response Authentication Mechanism (SCRAM) 是 MongoDB 的預設身份驗證機制。

當使用者進行身份驗證時,MongoDB使用SCRAM根據使用者名、密碼和身份驗證資料庫 驗證提供的使用者憑據。

MongoDB支援兩種SCRAM機制:SCRAM-SHA-1 和 SCRAM-SHA-256

以下是單機版mongod執行個體進行SCRAM認證的步驟:

1、不帶通路控制啟動MongoDB

mongod --port 27017 --dbpath /var/lib/mongodb
           

2、連接配接到mongodb執行個體

mongosh --port 27017
           

3、建立 administrator 使用者

注意:可以在啟用通路控制之前或之後建立使用者管理者。如果在建立任意使用者之前啟用了通路控制,那麼MongoDB會傳回一個localhost異常,這個異常告訴我們允許在admin資料庫中建立管理者使用者。建立之後,必須作為使用者管理者進行身份驗證後,才可以再建立其他使用者。

(PS:上面這句話的意思是,在啟用通路控制之前或者之後建立使用者管理者都可以,但是如果先啟用了通路控制,而後再建立使用者的時候就會報錯。這個錯會告訴我們,應該首先在admin資料庫中建立使用者管理者,然後用使用者管理者登入(或者叫身份驗證)成功以後才可以再建立其它使用者。)

具體操作步驟如下:

(1)切換到admin資料庫

(2)添加一個myUserAdmin使用者,并賦予其“userAdminAnyDatabase”和“readWriteAnyDatabase”這兩個角色

use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: passwordPrompt(), // or cleartext password
    roles: [
    	{ role: "userAdminAnyDatabase", db: "admin" },
      	{ role: "readWriteAnyDatabase", db: "admin" }
    ]
  }
)           

注意:passwordPrompt()方法提示你輸入密碼。你也可以直接将密碼指定為字元串。建議使用passwordPrompt()方法,以避免在螢幕上看到密碼,并可能将密碼洩露到shell曆史記錄中。

userAdminAnyDatabase 角色運作使用者:

  1. 授予或撤銷使用者角色
  2. 建立或修改自定義角色

4、帶通路控制,重新開機MongoDB執行個體

用 mongosh 關閉 mongod 執行個體

db.adminCommand( { shutdown: 1 } )           

啟動mongod,這次帶上通路控制

  • 如果從指令行啟動mongod,則隻需帶上 --auth 參數即可 
mongod --auth --port 27017 --dbpath /var/lib/mongodb            
  • 如果從配置檔案啟動mongod,則隻需将配置檔案中security.authorization設定為enabled即可,然後 systemctl start mongod
security:
    authorization: enabled
           
MongoDB Security

5、以使用者管理者身份連接配接和認證 

方式一:連接配接的時候進行認證

用 mongosh 連接配接,帶上 -u <username>, -p 和 --authenticationDatabase <database> 指令行參數

mongosh --port 27017  --authenticationDatabase "admin"  -u "myUserAdmin" -p           

随後,輸入正确的密碼即可連接配接成功

方式二:連接配接之後再進行認證

先連接配接,然後切換到認證資料庫(本例中是admin),然後使用db.auth(<username>, <pwd>) 方法進行認證

mongosh --port 27017

use admin
db.auth("myUserAdmin", passwordPrompt()) // or cleartext password
           

1.2.  基于角色的通路控制

MongoDB預設情況下沒有啟用通路控制。可以通過 --auth 指令行參數 或者 将配置檔案中security.authorization設定為enabled 來啟用通路控制。

一個角色可以從它所屬資料庫中的其他角色那裡繼承權限。 在 admin 資料庫上建立的角色可以從任何資料庫中的角色繼承權限。

配置設定了角色的使用者将獲得該角色的所有權限。一個使用者可以有多個角色。通過配置設定給不同資料庫中的使用者角色,在一個資料庫中建立的使用者可以具有操作其他資料庫的權限。 

注意:在資料庫中建立的第一個使用者應該是具有管理其他使用者權限的使用者管理者。

MongoDB Security

1.2.1.  内置角色

每個MongoDB的内置角色都定義了角色資料庫中所有非系統集合的資料庫級别的通路權限以及所有系統集合的集合級别的通路權限。

MongoDB為每個資料庫提供内置的資料庫使用者和資料庫管理角色。MongoDB僅在admin資料庫上提供所有其他内置角色。 

角色類型 角色名稱 角色描述
Database User Roles  read 提供在所有非系統集合和system.js集合中讀取資料的能力。
readWrite 提供“read”角色的所有權限,外加在所有非系統集合和system.js集合中修改資料的能力。
Database Administration Roles    dbAdmin 提供執行管理任務的能力,例如與資料庫相關的任務、索引和收集統計資訊。該角色不授予使用者和角色管理權限。
dbOwner 資料庫所有者可以對資料庫執行任何管理操作。該角色結合了readWrite、dbAdmin和userAdmin三個角色的權限。
userAdmin  提供在目前資料庫上建立和修改角色和使用者的能力。
Cluster Administration Roles     clusterAdmin  提供最大的叢集管理通路。此角色結合了 clusterManager、clusterMonitor 和 hostManager 角色授予的權限。此外,該角色還提供 dropDatabase 操作的權限。
clusterManager  提供對叢集的管理和監控操作的權限
clusterMonitor  提供對監控工具的隻讀通路權限
hostManager  提供監控和管理伺服器的能力
Backup and Restoration Roles   backup  提供備份資料所需的最低權限
restore  提供從備份中恢複資料所需的權限
All-Database Roles     readAnyDatabase  提供和“read”角色相似的在所有資料庫上的隻讀權限,local和config資料庫除外
readWriteAnyDatabase  提供和“readWrite”角色相似的在所有資料庫上的讀寫權限,local和config資料庫除外
userAdminAnyDatabase  提供和“userAdmin”角色相似的在所有資料庫上通路使用者管理操作的權限,local和config資料庫除外
dbAdminAnyDatabase  提供和“dbAdmin”角色相似的在所有資料庫上管理操作的權限,local和config資料庫除外
Superuser Roles  root  超級使用者,提供以下角色的所有權限:
  • readWriteAnyDatabase
  • dbAdminAnyDatabase
  • userAdminAnyDatabase
  • clusterAdmin
  • restore
  • backup
Internal Role  __system  MongoDB 将此角色配置設定給代表叢集成員的使用者對象,例如副本內建員和 mongos 執行個體。 

1.2.2. 自定義角色

1.2.3.  管理使用者和角色

MongoDB Security

連接配接

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
           

 建立角色

use admin
db.createRole(
   {
     role: "mongostatRole", 
     privileges: [
       { resource: { cluster: true }, actions: [ "serverStatus" ] }
     ],
     roles: []
   }
)           

檢視使用者角色

db.getUser("zhangsan")           

檢視角色權限

db.getRole( "readWrite", { showPrivileges: true } )           

 回收(撤銷)角色

use reporting
db.revokeRolesFromUser(
    "reportsUser",
    [
      { role: "readWrite", db: "accounts" }
    ]
)           

授予角色

db.grantRolesToUser(
    "reportsUser",
    [
      { role: "read", db: "accounts" }
    ]
)           
use test
db.createUser(
   {
     user:"user123",
     pwd: passwordPrompt(),  // or cleartext password
     roles:[ "readWrite", { role:"changeOwnPasswordCustomDataRole", db:"admin" } ] 
   }
)
           

修改密碼

db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")           

或者

use test
db.updateUser(
   "user123",
   {
      pwd: passwordPrompt(),  // or cleartext password
      customData: { title: "Senior Manager" }
   }
)           

認證

db.auth( <username> )
db.auth( <username>, passwordPrompt() )
db.auth( <username>, <password> )
           

2.  MongoDB Shell

2.1.  安裝 mongosh

MongoDB Security

下載下傳安裝包,然後解壓,并設定環境變量

# 解壓
tar -zxvf mongosh-1.1.7-linux-x64.tgz

# 授予執行權限
chmod +x bin/mongosh
chmod +x bin/mongocryptd-mongosh

# 添加到PATH環境變量中
sudo cp mongosh /usr/local/bin/
sudo cp mongocryptd-mongosh /usr/local/bin/
# 或者
sudo ln -s $(pwd)/bin/* /usr/local/bin/
           

2.2.  連接配接到MongoDB伺服器

1、本地執行個體,預設端口

mongosh           

等同于

mongosh "mongodb://localhost:27017"           

以上兩種寫法是一樣的

2、本地執行個體,非預設端口

mongosh --port 28015           

等價于

mongosh "mongodb://localhost:28015"           

這兩種寫法是一樣的

3、遠端執行個體 

mongosh --host mongodb0.example.com --port 28015           
mongosh "mongodb://mongodb0.example.com:28015"
           

2.2.1.  選項參數

1、如果要連接配接到的MongoDB執行個體需要身份驗證,那麼可以使用 --username 和 --authenticationDatabase 指令行選項。mongosh 會提示你輸入密碼,它會在你鍵入時屏蔽該密碼。

例如:

mongosh "mongodb://mongodb0.example.com:28015" --username alice --authenticationDatabase admin           

也可以加上 --password 選項,這樣的話就是以明文方式帶上密碼

2、連接配接到副本集

# 連接配接到副本集
mongosh "mongodb://mongodb0.example.com.local:27017,mongodb1.example.com.local:27017,mongodb2.example.com.local:27017/?replicaSet=replA"           

3、連接配接到指定的資料庫

下面的連接配接字元串URI将連接配接到資料庫db1

mongosh "mongodb://localhost:27017/db1"
           

2.3. mongosh 用法

# 顯示目前資料庫
db

# 切換資料庫
use <database>

# 建立一個新的資料庫和集合
# 如果集合不存在,MongoDB 會在首次存儲該集合的資料時建立該集合
use myNewDatabase
db.myCollection.insertOne( { x: 1 } );           

1、向集合中插入資料 

db.myCollection.insertOne()
           

 其中:

  • db 代表目前資料庫
  • myCollection 是集合的名稱

2、檢視資料庫中的集合

db.getCollection()
           

3、終止指令行

Ctrl + C
           

4、清屏

cls           
Ctrl + L
           

5、文檔的增删查改

# 插入單條文檔
db.collection.insertOne()

# 插入多條文檔
db.collection.insertMany()

# 查詢所有文檔
db.collection.find() 

# 帶查詢條件
db.collection.find({<field>:<value>, <field>:<value>, ...})

# 更新單條文檔
db.collection.updateOne()

# 更新多條文檔
db.collection.updateMany()

# 替換
db.collection.replaceOne()

# 删除單條文檔
db.collection.deleteOne()

# 删除多條文檔
db.collection.deleteMany()           

示例

use example

db.movies.insertOne(
  {
    title: "The Favourite",
    genres: [ "Drama", "History" ],
    runtime: 121,
    rated: "R",
    year: 2018,
    directors: [ "Yorgos Lanthimos" ],
    type: "movie"
  }
)

db.movies.find( { title: "The Favourite" } )

db.movies.find( {
     year: 2010,
     $or: [ { "awards.wins": { $gte: 5 } }, { genres: "Drama" } ]
} )

db.listingsAndReviews.updateMany(
  { security_deposit: { $lt: 100 } },
  {
    $set: { security_deposit: 100, minimum_nights: 1 }
  }
)

db.movies.find( { rated: { $in: [ "PG", "PG-13" ] } } )

db.movies.deleteMany({})

db.movies.deleteMany( { title: "Titanic" } )
           

2.4.  mongosh Help

1、指令行幫助

mongosh --help
           

2、mongosh Shell 幫助

help
           

3、資料庫幫助

show dbs

db.help()
           

4、集合幫助

(1)檢視目前資料庫下的集合

show collections
           

(2)檢視集合對象幫助

db.collection.help()
           

(3)檢視特定方法的幫助,用 db.<collection>.<method>.help()

db.collection.getIndexes.help()
           

(4)光标幫助

db.collection.find().help()           

更多參見

https://docs.mongodb.com/mongodb-shell/reference/methods/

https://docs.mongodb.com/mongodb-shell/reference/options/ 

3.  資料庫、集合、文檔

在 MongoDB 中,資料庫儲存一個或多個文檔集合。

通過 use <db> 來選擇某一個資料使用 

如果資料庫不存在,MongoDB 會在首次存儲該資料庫的資料時建立該資料庫。

use myNewDB
db.myNewCollection1.insertOne( { x: 1 } )
           

MongoDB 将文檔存儲在集合中。 集合類似于關系型資料庫中的表。

MongoDB Security

如果集合不存在,MongoDB 會在首次存儲該集合的資料時建立該集合。

db.myNewCollection2.insertOne( { x: 1 } )
db.myNewCollection3.createIndex( { y: 1 } )           

MongoDB 将資料記錄存儲為 BSON 文檔。BSON 是 JSON 文檔的二進制表示,盡管它包含比 JSON 更多的資料類型。 

文檔結構

{
   field1: value1,
   field2: value2,
   field3: value3,
   ...
   fieldN: valueN
}
           

字段的值可以是任何 BSON 資料類型,包括其他文檔、數組和文檔數組。例如,以下文檔包含不同類型的值: 

var mydoc = {
               _id: ObjectId("5099803df3f4948bd2f98391"),
               name: { first: "Alan", last: "Turing" },
               birth: new Date('Jun 23, 1912'),
               death: new Date('Jun 07, 1954'),
               contribs: [ "Turing machine", "Turing test", "Turingery" ],
               views : NumberLong(1250000)
            }           

字段名稱是字元串,但是有以下限制

  • 字段名“_id”被保留用作主鍵,它的值在集合中必須是唯一的,是不可變的,并且可以是數組以外的任何類型。 如果 _id 包含子字段,則子字段名稱不能以 ($) 符号開頭。
  • 字段名稱不能包含null字元
  • 伺服器允許存儲包含點 (.) 和美元符号 ($) 的字段名稱。 

點符号

MongoDB 使用點(.)符号來通路數組的元素和通路嵌入文檔的字段。 

數組

"<array>.<index>"           
{
   ...
   contribs: [ "Turing machine", "Turing test", "Turingery" ],
   ...
}
           

要指定 contribs 數組中的第三個元素,請使用點表示法“contribs.2”

内嵌文檔

"<embedded document>.<field>"           
{
   ...
   name: { first: "Alan", last: "Turing" },
   contact: { phone: { type: "cell", number: "111-222-3333" } },
   ...
}           
  • 要指定“first”字段,可以使用“name.last”
  • 要指定“number”字段,可以使用“contact.phone.number”  

字段順序 

與 JavaScript 對象不同,BSON 文檔中的字段是有序的。 

對于查詢操作,在比較文檔時,字段排序非常重要。

例如,在文檔查詢中比較a和b兩個字段時,{a: 1, b: 1} 與 {b: 1, a: 1} 是不同的。

對于寫入操作,MongoDB 保留文檔字段的順序,但以下情況除外:

  • _id 字段始終是文檔中的第一個字段
  • 包含重命名字段名稱的更新操作可能會導緻文檔中的字段重新排序

BJSON類型 

https://docs.mongodb.com/manual/reference/bson-types/ 

ObjectId

ObjectId 很小,可能是唯一的,生成速度快,并且是有序的。 ObjectId 值的長度為 12 個位元組,包括: 

  • 一個4位元組的時間戳,表示ObjectId的建立時間
  • 一個5位元組的随機值,每個程序生成一次
  • 一個3位元組的遞增計數器,初始化為一個随機值

在MongoDB中,存儲在集合中的每個文檔都需要一個唯一的_id字段作為主鍵。如果插入的文檔省略了_id字段,MongoDB會自動為_id字段生成一個ObjectId。

MongoDB用戶端應添加具有唯一 ObjectId 的 _id 字段。 将 ObjectIds 用于 _id 字段可提供以下額外好處:

  • 在mongosh中,可以使用ObjectId.getTimestamp()方法來通路ObjectId的建立時間
  • 對存儲ObjectId值的_id字段進行排序大緻相當于按建立時間進行排序

4.  配置檔案選項

https://docs.mongodb.com/manual/reference/configuration-options/ 

Linux中,預設配置檔案是 /etc/mongod.conf

啟動時指定配置檔案,可以使用 --config 或者 -f 選項

mongod --config /etc/mongod.conf           
mongod -f /etc/mongod.conf           

主要的一些配置參見 https://docs.mongodb.com/manual/reference/configuration-options/#core-options 

5.  MongoDB 包元件

5.1.  mongod

mongod 是 MongoDB 系統的主要守護程序。 它處理資料請求,管理資料通路,并執行背景管理操作。

https://docs.mongodb.com/manual/reference/program/mongod/ 

6.  CRUD

https://docs.mongodb.com/manual/crud/ 

https://docs.mongodb.com/manual/reference/command/ 

https://docs.mongodb.com/manual/reference/method/ 

7.  存儲

存儲引擎是資料庫的元件,負責管理資料在記憶體和磁盤中的存儲方式。MongoDB 支援多個存儲引擎,因為不同的引擎對于特定的工作負載表現更好。選擇合适的存儲引擎會顯着影響應用程式的性能。

7.1.  WiredTiger Storage Engine (Default)

WiredTiger 是從 MongoDB 3.2 開始的預設存儲引擎。 它非常适合大多數工作負載,建議用于新部署。 WiredTiger 提供文檔級并發模型、檢查點和壓縮等功能。

從 MongoDB 3.2 開始,WiredTiger 存儲引擎是預設存儲引擎。對于現有部署,如果不指定 --storageEngine 或 storage.engine 設定,則 3.2+ 版本的 mongod 執行個體可以自動确定 --dbpath 或 storage.dbPath 中用于建立資料檔案的存儲引擎。 

7.1.1.  文檔級别的并發

WiredTiger 使用文檔級并發控制進行寫入操作。 是以,多個用戶端可以同時修改一個集合的不同文檔。

對于大多數讀寫操作,WiredTiger 使用樂觀并發控制。 WiredTiger 僅在全局、資料庫和集合級别使用意圖鎖。 當存儲引擎檢測到兩個操作之間的沖突時,會引發寫入沖突,導緻 MongoDB 透明地重試該操作。

7.1.2.  快照和檢查點

WiredTiger 使用多版本并發控制 (MVCC)。在操作開始時,WiredTiger 會為操作提供資料的時間點快照。快照呈現記憶體中資料的一緻視圖。

寫入磁盤時,WiredTiger 将快照中的所有資料以一緻的方式跨所有資料檔案寫入磁盤。現在持久的資料充當資料檔案中的檢查點。檢查點確定資料檔案在最後一個檢查點之前是一緻的,包括最後一個檢查點;即檢查點可以充當恢複點。

從 3.6 版開始,MongoDB 配置 WiredTiger 以每隔 60 秒建立檢查點(即将快照資料寫入磁盤)。在早期版本中,MongoDB 将檢查點設定為在 WiredTiger 中以 60 秒的間隔或在寫入 2 GB 的日志資料時發生在使用者資料上,以先發生者為準。

在寫入新的檢查點期間,之前的檢查點仍然有效。是以,即使 MongoDB 在寫入新檢查點時終止或遇到錯誤,在重新啟動時,MongoDB 也可以從最後一個有效檢查點恢複。

當 WiredTiger 的中繼資料表被原子更新以引用新的檢查點時,新的檢查點變得可通路和永久。一旦可以通路新的檢查點,WiredTiger 就會從舊的檢查點中釋放頁面。

7.1.3.  日志

WiredTiger 使用預寫日志(即日志)結合檢查點來確定資料的持久性。

WiredTiger 日志保留檢查點之間的所有資料修改。 如果 MongoDB 在檢查點之間退出,它會使用日志重放自上一個檢查點以來修改的所有資料。

7.1.4.  壓縮

使用 WiredTiger,MongoDB 支援所有集合和索引的壓縮。壓縮以增加 CPU 為代價最大限度地減少了存儲使用。

預設情況下,WiredTiger 使用 snappy 壓縮庫對所有集合使用塊壓縮,對所有索引使用字首壓縮。

7.1.5.  記憶體使用

使用 WiredTiger,MongoDB 同時利用 WiredTiger 内部緩存和檔案系統緩存。

從 MongoDB 3.4 開始,預設的 WiredTiger 内部緩存大小是以下兩者中的較大者:

  • 50% of (RAM - 1 GB)
  • 256 MB

例如,在一個總共有 4GB RAM 的系統上,WiredTiger 緩存将使用 1.5GB 的 RAM (0.5 * (4 GB - 1 GB) = 1.5 GB)。 相反,總共有 1.25 GB RAM 的系統将配置設定 256 MB 給 WiredTiger 緩存,因為這是總 RAM 減去 1 GB 的一半以上 (0.5 * (1.25 GB - 1 GB) = 128 MB < 256 MB) 。

7.2.  記憶體存儲引擎

記憶體存儲引擎在 MongoDB Enterprise 中可用。它不是将文檔存儲在磁盤上,而是将它們保留在記憶體中,以獲得更可預測的資料延遲。

從MongoDB Enterprise版本3.2.6開始,記憶體存儲引擎是64位版本中通用可用性(GA)的一部分。除了一些中繼資料和診斷資料,記憶體存儲引擎不維護任何磁盤上的資料,包括配置資料、索引、使用者憑據等。

通過避免磁盤I/O,記憶體存儲引擎允許更多可預測的資料庫操作延遲。 

7.2.1.  指定記憶體存儲引擎

為了選擇使用記憶體存儲引擎,可以這樣操作:

  •  指令行中使用 --storageEngine 選項指定 inMemory ,或者 在配置檔案中通過設定 storage.engine 的值
  • --dbpath 或 storage.dbPath(如果使用配置檔案)。盡管記憶體存儲引擎不會将資料寫入檔案系統,但它會在 --dbpath 中維護小型中繼資料檔案和診斷資料以及用于建構大型索引的臨時檔案。
mongod --storageEngine inMemory --dbpath <path>           
storage:
   engine: inMemory
   dbPath: <path>
           

7.2.2.  并發

記憶體存儲引擎對寫入操作使用文檔級并發控制。是以,多個用戶端可以同時修改一個集合的不同文檔。 

7.2.3.  記憶體使用

記憶體存儲引擎要求它的所有資料(包括索引,如果mongod執行個體是副本集的一部分,則包括oplog,等等)必須符合指令行選項 --inMemorySizeGB 或配置檔案中 storage.inMemory.engineConfig.inMemorySizeGB 設定的記憶體大小。 

預設情況下,記憶體存儲引擎使用 50% 的實體 RAM 減去 1 GB。

例如,記憶體8G,那麼使用記憶體存儲引擎的話,預設使用的記憶體大小最多是 8 × 0.5 - 1 = 3 GB

如果寫入操作會導緻資料超過指定的記憶體大小,MongoDB 會傳回錯誤:

"WT_CACHE_FULL: operation would overflow cache"           

為了指定新的記憶體大小,在配置檔案中設定 storage.inMemory.engineConfig.inMemorySizeGB 

storage:
   engine: inMemory
   dbPath: <path>
   inMemory:
      engineConfig:
         inMemorySizeGB: <newSize>
           

或者使用指令行參數 --inMemorySizeGB

mongod --storageEngine inMemory --dbpath <path> --inMemorySizeGB <newSize>
           

7.2.4.  持久化

記憶體存儲引擎是非持久化的,不向持久化存儲寫入資料。非持久資料包括應用程式資料和系統資料,如使用者、權限、索引、副本集配置、分片叢集配置等。

是以,日志或等待資料變得持久的概念不适用于記憶體存儲引擎。

7.2.5.  事務

從MongoDB 4.2開始,副本集和分片叢集上都支援事務: 主節點使用 WiredTiger 存儲引擎,并且次要成員使用 WiredTiger 存儲引擎或記憶體存儲引擎。

下一篇: MongoDB 安裝