好久沒有寫部落格了 (因為沒有什麼好分享的 XD)
(SOLID還沒完結呢。。。)

就來分享我最近在本機端部署3節點的MongoDB Replica Set的經驗吧~

使用了docker官方的mongo image: 官方Image

結果

直接由結果來說好了XD
準備以下檔案:

mongo1/Dockerfile 檔案

1
2
3
FROM mongo

COPY ./initdb.js /docker-entrypoint-initdb.d/

mongo1/initdb.js 檔案

1
2
3
4
5
6
7
8
rs.initiate({
_id: 'rs0',
members: [
{ _id: 0, host: 'mongo1:27016' },
{ _id: 1, host: 'mongo2:27018' },
{ _id: 2, host: 'mongo3:27019' },
]
});

docker-compose.yml 檔案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
version: '3.7'
services:
mongo1:
container_name: mongo1
build: './mongo1'
ports:
- '27016:27016'
command:
- --config
- /etc/mongo/mongod.conf
volumes:
- ./data1:/data/db
- ./mongo1:/etc/mongo
depends_on:
- mongo2
- mongo3
mongo2:
container_name: mongo2
image: mongo
ports:
- '27018:27018'
command:
- --config
- /etc/mongo/mongod.conf
volumes:
- ./data2:/data/db
- ./mongo2:/etc/mongo
mongo3:
container_name: mongo3
image: mongo
ports:
- '27019:27019'
command:
- --config
- /etc/mongo/mongod.conf
volumes:
- ./data3:/data/db
- ./mongo3:/etc/mongo

修改本機端的 hosts 檔案,新增以下資料:

1
2
3
127.0.0.1 mongo1
127.0.0.1 mongo2
127.0.0.1 mongo3

執行以下指令啟動MongoDB Replica Set:

docker-compose -f docker-compose.yml up -d
docker exec -it mongo1 /bin/bash mongo /docker-docker-entrypoint-initdb.d/initdb.js

接下來使用以下URL進行連線即可:

mongodb://mongo1:27016,mongo2:27018,mongo3:27019

~完~

說明

*詳細的各個檔案的設定問題就不細說了,文章下方會放上一些參考連結,都可以在裡面找到資料的。

這邊說些我找到資料中沒有說明的部分。

原本想要很普通地將3各container部署到27017~27019,然後使用 mongodb://localhost:27017,localhost:27018,localhost:27019 進行連線。
但最後發現replica set是可以建立成功的,但透過compass或程式都無法連線。。。

FB MongoDB 社群詢問,有大大說可能是domain的不對應導致的。

因為外部連結是使用 localhost 進行連線,但mongoDB內的replica set設定會因為 localhostmongo1/mogno2/mongo3 的對應錯誤,所以導致某種錯誤。
*沒有證據證明,只是猜測性的結果

在經過一堆思考以及研究後,最後想到當年學校擋FB時的解法了 XD

就是修改本機端的hosts檔案,將domain與ip的對應直接設定好。

這樣在本機端直接使用 mongo1/mongo2/mongo3 進行連線,就可以在replica set中也可以成功解析domain了~

大部分的資料,以及設定方法,都可以在網路上找到,只是設定 hosts 檔案的小技巧或許一時間難以想到,所以來分享一下 XD

未解之謎

其實。。。
這個方法還是有問題的。。。
就是 Dockerfile 中需要複製 initdb.js 到docker中,不過為什麼要複製到 docker-entrypoint-initdb.d 去呢?????

因為官方Image 中說,將需要執行的db初始化腳本放置在 docker-entrypoint-initdb.d 文件中,然後container會自動執行相關程式。
但在我的嘗試中卻發現該腳本有執行完成,但貌似有些問題,所以無法正常成功。
最後還是直接使用 docker exec -it mongo1 /bin/bash mongo /docker-docker-entrypoint-initdb.d/initdb.js 的方法直接初始化replica set了。

知識連結

MongoDB image: https://hub.docker.com/_/mongo (DB的初始化說明,config檔案的設定,db資料的儲存位置)
Deploy a Replica Set: https://docs.mongodb.com/manual/tutorial/deploy-replica-set/ (部署的方法,簡單的初始化腳本以及狀態查看指令)
MongoDB Configuration File: https://docs.mongodb.com/manual/reference/configuration-options/ (設定replica set以及bindIP)