前提
Docker で3つのノードで mongodb のレプリカを構成しています。
version: '3'
services:
...
node1:
restart: always
image: "mongo:4.0"
command: --replSet rs1
node2:
restart: always
image: "mongo:4.0"
command: --replSet rs1
node3:
restart: always
image: "mongo:4.0"
command: --replSet rs1
...
注意:初期起動してから、レプリカの初期化処理が必要
アプリ側が接続文字列にこう書きました
ur = `mongodb://node1:27017/testDb?replicaSet=rs1,mongodb://node2:27017/testDb?replicaSet=rs1,mongodb://node3:27017/testDb?replicaSet=rs1`
問題
- レプリカ初期化処理を行い、アプリからは正常にアクセスできました
-
docker-compose
でdown
してから再度up
しました -
db.user.insert(...)
処理でnot master
エラーになりました
解決
- URL の書き方が間違っていました。ホストのリストをカンマ区切りで、
mongodb://
と/testDb?replicaSet=rs1
の真ん中に置く必要があります -
mongodb://node1:27017,node2:27017,node3:27017/testDb?replicaSet=rs1
のフォーマットで書きましょう - ちゃんとドキュメント読めましょう
まとめ
- 恥ずかしいですが、半日もハマってました。ちゃんと ドキュメント読めましょうを読みましょう!!!