【MongoDB】日誌管理(Manage Journaling)

MongoDB使用預寫日誌記錄到磁盤日誌上,以確保寫操作的持久性。

WiredTiger存儲引擎不需要journaling即可保證數據庫服務崩潰後的狀態一致。在恢復過程中,數據庫將恢復到最近的一致性檢查點。但是,如果MongoDB在檢查點之間意外退出,則需要journaling來恢復在最後一個檢查點之後發生的寫入。

注意

從MongoDB 4.0開始,在WiredTiger存儲引擎的副本集成員上,您不能指定--nojournal選項或storage.journal.enabled:false

啓用journaling功能後,如果mongod意外停止,則程序可以恢復journal 裏的所有內容。 MongoDB將在重新啓動時重新應用寫入操作,並保持一致狀態。默認情況下,最嚴重的丟失寫操作(即未寫入journal的操作)是最近100毫秒內進行的寫操作加上執行寫入journal操作所花費的時間。有關默認的更多信息,請參見commitIntervalMs

一、管理過程(Procedures)

 

1.禁用日誌(Disable Journaling)

警告

不要在生產環境上禁用日誌功能。

從MongoDB 4.0開始,在WiredTiger存儲引擎的副本集成員上,不能指定--nojournal選項或storage.journal.enabled:false

要禁用獨立部署服務的日誌功能,請使用--nojournal命令行選項啓動mongod。

 

2.獲取提交確認(Get Commit Acknowledgement)

可以使用Write Concernj選項獲得提交確認。有關詳細信息,請參見Write Concern

 

3.監視日誌狀態(Monitor Journal Status)

通過 serverStatus命令或db.serverStatus()方法可以獲取到wiredTiger.log,其中包含有關日誌的統計信息。

 

4.意外關機後恢復數據(Recover Data After Unexpected Shutdown)

服務在崩潰並重啓後,MongoDB會在服務恢復可用之前重播journal 目錄中的所有journal文件。當MongoDB重播journal文件時,mongod在日誌輸出中記錄這些重播事件。

切記:不應該運行--repair。

 

5.更換WiredTiger日記壓縮算法(Change WiredTiger Journal Compressor)

使用WiredTiger存儲引擎時,默認情況下,MongoDB使用快速壓縮存儲日誌。要爲mongod實例指定其他壓縮算法或不壓縮:

提示

如果在此過程中遇到mongod異常關閉的情況,則必須使用舊的壓縮機設置來使用日誌文件進行恢復。恢復後,您可以重試該過程。

5.1 單獨實例(Standalone)

使用以下步驟更改單獨mongod實例的日誌壓縮:

 

1. 將storage.wiredTiger.engineConfig.journalCompressor更新爲新的值。如果使用命令行選項而不是配置文件,則必須在下面的重新啓動過程中更新--wiredTigerJournalCompressor命令行選項。

2. 對mongod實例執行完全關閉。例如,通過mongo shell連接到實例並執行db.shutdownServer():

db.getSiblingDB('admin').shutdownServer()

3. 當該進程停止運行後,就可以重新啓動mongod實例:

     3.1 如果使用的是配置文件:

mongod -f <path/to/myconfig.conf>

    3.2 如果使用的是命令行選項,那麼更新--wiredTigerJournalCompressor選項:

mongod --wiredTigerJournalCompressor <differentCompressor|none>  ...

5.2 副本集成員 (Replica Set Member)

通過如下過程更改副本集成員的日誌壓縮:

注意

以下過程將副本成員視爲沒有journal的單獨服務來重啓服務。

1. 完全關閉mongod實例。例如,通過mongo shell連接mongod實例並執行db.shutdownServer()

db.getSiblingDB('admin').shutdownServer()

2. 更新配置文件,作爲單獨服務,啓動mongod:

例如:

storage:

   journal:

      enabled: false

#replication:

#   replSetName: replA

setParameter:

   disableLogicalSessionCacheRefresh: true

如果使用命令行選項,則必須在重啓時更新命令行選項。

3. 重新啓動mongod實例:

  • 如果使用的是配置文件:
mongod -f <path/to/myconfig.conf>
  • 如果使用命令行選項而非配置文件,

        > 包含--nojournal選項。

        > 移除所有副本命令行選項(例如--replSet)。

        > 將--setParameter選項中的參數disableLogicalSessionCacheRefresh設置爲true。

mongod --nojournal --setParameter disableLogicalSessionCacheRefresh=true  ...

4. 完全關閉mongod實例:

db.getSiblingDB('admin').shutdownServer()

確認該進程不再運行。

5. 更新配置文件,以準備使用新的日誌壓縮,作爲副本集成員重新啓動:

例如:

storage:
   wiredTiger:
      engineConfig:
         journalCompressor: <newValue>
replication:
   replSetName: replA

如果使用命令行選項而非配置文件,則必須在下面的重新啓動過程中更新命令行選項。

6. 重新啓動mongod實例,作爲副本集成員:

  • 如果您使用的是配置文件:
mongod -f <path/to/myconfig.conf>
  • 如果您使用命令行選項而非配置文件:
  1. 刪除--nojournal選項。
  2. 刪除--wiredTigerJournalCompressor命令行選項,以使用默認的日誌壓縮器或更新爲新值。
  3. 包括副本命令行選項以及副本集成員的所有其他選項。
  4. 刪除disableLogicalSessionCacheRefresh參數。
mongod --wiredTigerJournalCompressor <differentCompressor|none> --replSet ...

5.3 分片集羣成員(Sharded Cluster Member)

通過以下步驟,來更改分片副本集或配置服務副本集的成員的日誌壓縮:

注意

以下過程將副本成員視爲沒有journal的單獨服務來重啓服務。

1. 完全關閉mongod實例。例如,通過mongo shell連接mongod實例並執行db.shutdownServer()

db.getSiblingDB('admin').shutdownServer()

2. 更新配置文件,作爲單獨服務,啓動mongod:

  • storage.journal.enabled設置爲false。
  • setParameter中的參數disableLogicalSessionCacheRefresh設置爲true。
  • 註釋掉部署的副本設置。
  • 註釋掉sharding.clusterRole設置。
  • 如果未明確設置net.port,則將其設置爲該成員當前使用的端口。

例如:

storage:

   journal:

      enabled: false

setParameter:

   skipShardingConfigurationChecks: true

   disableLogicalSessionCacheRefresh: true

#replication:

#   replSetName: shardA

#sharding:

#   clusterRole: shardsvr

net:

  port: 27218

如果使用命令行選項而非配置文件,則必須在重新啓動時更新命令行選項。

3. 重新啓動mongod實例:

  • 如果使用的是配置文件:
mongod -f <path/to/myconfig.conf>
  • 如果使用命令行選項而非配置文件:
  • 如果使用命令行選項而非配置文件,
  1. 包含--nojournal選項
  2. 將參數skipShardingConfigurationChecks設置爲true。
  3. 將--setParameter選項中的參數disableLogicalSessionCacheRefresh設置爲true。
  4. 移除所有副本命令行選項(例如--replSet)。
  5. 刪除--shardsvr /-configsvr選項。
  6. 明確包括--port並設置爲實例的當前端口。
mongod --nojournal --setParameter skipShardingConfigurationChecks=true --setParameter disableLogicalSessionCacheRefresh=true --port <samePort> ...

4. 完全關閉mongod實例:

db.getSiblingDB('admin').shutdownServer()

確認該進程不再運行。

5. 更新配置文件,以準備使用新的日誌壓縮,作爲副本集成員重新啓動:

例如:

storage:

   wiredTiger:

      engineConfig:

         journalCompressor: <newValue>

replication:

   replSetName: shardA

sharding:

   clusterRole: shardsvr

net:

  port: 27218

如果使用命令行選項而不是配置文件,則必須在下面的重新啓動過程中更新命令行選項。

6. 重新啓動mongod實例,作爲副本集成員:

  • 如果您使用的是配置文件:
mongod -f <path/to/myconfig.conf>
  • 如果您使用命令行選項而非配置文件:

> 刪除--nojournal選項。

> 刪除skipShardingConfigurationChecks參數設置。

> 刪除disableLogicalSessionCacheRefresh參數。

> 刪除--wiredTigerJournalCompressor命令行選項,以使用默認的日誌壓縮器或更新爲新值。

> 包含--shardsvr / --configsvr選項。

> 包括副本命令行選項以及副本集成員的所有其他選項。

mongod --shardsvr --wiredTigerJournalCompressor <differentCompressor|none> --replSet ...

上一篇:日誌

參考原文:https://docs.mongodb.com/manual/tutorial/manage-journaling/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章