MongoDB のマニュアルを読んでも、シャーディング+レプリケーション環境(シャードレプリカ環境)の記述が少なく、すべての mongod サーバーを停止する方法がいまいち分かりませんでした。
調べて試したところ、以下の手順で問題なく停止できたので、手順を記載します。
結論としては、レプリケーションを停止させる手順と一緒でした。
ちなみに、各コマンドは成功したら、出力に以下の文言が表示されます。
1 |
{ "ok" : 1 } |
(1) Secandary への設定
現在のレプリカセットメンバーを、指定された期間 Primary にならないようにします。これにより Primary を stepDown させても、この Secandary は Primary に昇格しなくなります。
https://docs.mongodb.com/manual/reference/method/rs.freeze/
すべての Secandary にログインし、以下のコマンドを実行します。
1 |
> shard1:SECONDARY> rs.freeze(600) |
(2) Arbiter への設定
念のために Secandary 同様、(1) と同じコマンドを実行します。
時間の都合上調査していませんが、Arbiter であるため、本コマンドは不要な可能性があります。
(3) Primary を Secandary に降格
すべての Secandary にログインし、以下のコマンドを実行します。
1 |
rs.stepDown() |
実行後、暫くすると、また Primary になるので、心配なら freeze() させておきましょう。
(4) Secandary, Arbiter を停止
すべての Secandary にログインし、以下のコマンドを実行します。
1 2 3 4 |
shard2:SECONDARY> use admin switched to db admin shard2:SECONDARY> db.shutdownServer() |
実行した際に、以下のエラーが出ることがあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Error: shutdownServer failed: { "operationTime" : Timestamp(1617252361, 2), "ok" : 0, "errmsg" : "shutdown must run from localhost when running db without auth", "code" : 13, "codeName" : "Unauthorized", "lastCommittedOpTime" : Timestamp(1617252361, 2), "$clusterTime" : { "clusterTime" : Timestamp(1617252371, 7), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } } } : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype.shutdownServer@src/mongo/shell/db.js:426:19 @(shell):1:1 |
この場合、シャットダウンさせたい mongod サーバの動作しているマシン上から host を localhost にしてログインすると正常に実行されます。
以上です。