主頁 > 資料庫 > MongoDB Security

MongoDB Security

2022-01-17 18:09:48 資料庫

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. 授予或撤銷用戶角色
  3. 創建或修改自定義角色

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

 

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 資料庫上創建的角色可以從任何資料庫中的角色繼承權限,

分配了角色的用戶將獲得該角色的所有權限,一個用戶可以有多個角色,通過分配給不同資料庫中的用戶角色,在一個資料庫中創建的用戶可以具有操作其他資料庫的權限, 

注意:在資料庫中創建的第一個用戶應該是具有管理其他用戶權限的用戶管理員,

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.  管理用戶和角色

連接

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

 

下載安裝包,然后解壓,并設定環境變數

# 解壓
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 會在首次存盤該集合的資料時創建該集合,

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 存盤引擎或記憶體存盤引擎,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/413170.html

標籤:NoSQL

上一篇:MongoDB 安裝

下一篇:使用Neo4j的apoc插件,實作資料從MySQL抽取到Neo4j

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more