這篇文章用來整理一下最近處理的事情,首先為什麼需要讓 MongoDB 有 replica 功能?
我們知道在操作資料庫時如果當中有一個部份出現錯誤而拋出異常,那麼這次的資料庫操作應該要進行 rollback 避免錯誤。
當我們想要在 MongoDB 當中進行 rollback 時就需要你的 MongoDB 有啟動 replica 功能。
要讓 MongoDB 啟動 replica 功能就需要至少 3 個節點,也就是需要啟動 3 個 MongoDB 達成啟動 replica 的最低要求。
創建 MongoDB 可以選擇使用 docker 或是直接在本機上啟動,如果想要使用 docker 一次啟動多個 MongoDB 達成 replica 需要確定最終要訪問 MongoDB 的程式也是跑在 docker 當中,否則當你想要連到 MongoDB 時就會發現無法連接,因為在本機當中我們通常使用 localhost:port 來進行連線,而這個 port 就是 docker 映射出來的 port,但是當啟動 replica 時他會需要辨識前面的 host 部分,此時 localhost 不符合 container 的名稱,最終就會導致連線失敗,所以如果要將 MongoDB 開在 docker 當中就需要確定程式也是跑在 docker 內,這樣 host 才會是正確的。
由於這部分還正在開發,大多數功能還需要添加以及測試,所以需要將 MongoDB 架設在本機當中,我這邊會透過 config 檔啟動以下是基礎的 config 檔案內容。
systemLog:
destination: file
path: 設定要存放 log 的檔案,以 .log 作為結尾
logAppend: true
storage:
dbPath: 設定資料存放的地方
net:
bindIp: 127.0.0.1
port: 27020
setParameter:
enableLocalhostAuthBypass: false
replication:
replSetName: rs0
接下來透過 mongod -f .\mongod.conf
來啟動 MongoDB,啟動後由於有設定 replica 所以需要進行額外設定才可以使用。
我們進入到你期望的主 MongoDB 當中 mongosh --port xxxxx
並透過以下指令設定。
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "localhost:27020" },
{ _id: 1, host: "localhost:27021" },
{ _id: 2, host: "localhost:27022" }
]
})
_id: 可以隨意填寫只要在 0 ~ 255 之間即可
host: 根據 config 當中的內容填寫
到這裡基本上就完成 MongoDB 的設定,並且當輸入 rs.status()
有看到以下內容就表示沒有問題了。

接下來如果是透過 Spring Data MongoDB 進行 DB 操作需將 URI 設定成以下spring.data.mongodb.uri=mongodb://localhost:27020,localhost:27021,localhost:27022/DBName?replicaSet=rs0
然後在需要操作 DB 的函數上面加上 @Transactional
就可以在函數過程中發生錯誤自動 rollback。