好久沒有寫部落格了 (因為沒有什麼好分享的 XD)(SOLID還沒完結呢。。。)
就來分享我最近在本機端部署3節點的MongoDB Replica Set的經驗吧~
使用了docker官方的mongo image: 官方Image
結果
直接由結果來說好了XD
準備以下檔案:
mongo1/Dockerfile
檔案
1 | FROM mongo |
mongo1/initdb.js
檔案
1 | rs.initiate({ |
docker-compose.yml
檔案
1 | version: '3.7' |
修改本機端的 hosts
檔案,新增以下資料:
1 | 127.0.0.1 mongo1 |
執行以下指令啟動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設定會因為 localhost
與 mongo1/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)