1. ホーム
  2. データベース
  3. モンゴルディーブ

mongosのクラッシュ後に再起動できない問題の解決法

2022-01-21 11:25:40

前置き

公式ドキュメントです。 https://docs.mongodb.com/manual/reference/program/mongos/#bin.mongos

mongos は MongoDB シャードの略で、アプリケーションレイヤーにクエリーリクエストを提供し、MongoDB シャード内のデータの場所を決定するルーティングサービスです。アプリケーション層から見ると、mongos は MongoDB のインスタンスと変わらない振る舞いをします。

詳細な設定パラメータは、公式ドキュメントにざっと目を通し、必要なときに調べればよい。

最近、様々なユーザーがSERVER-52654に遭遇しているようなので、いくつか注意点を挙げておきます。

影響を受けるバージョン

すべてのクラスタはMongoDB 4.2.2+をシャーディングで使用しています。

問題現象

コンフィグノードの最後の再起動、または再選択から90日または180日経過すると、すべてのモンゴルが同時にクラッシュし、再起動できなくなります。

不具合の原因

この問題は、configノードが署名キーを適切に更新しないために発生します。通常、2つの鍵があり、1つは90日後に期限切れとなり、もう1つは180日後に期限切れとなります。server-52654はconfigが適切に鍵を更新しないため、既存の鍵の期限が切れた後にmongosがクラッシュします。

修正バージョン

この問題は、4.2.12で修正される予定です。4.2.12をリリースしました。

規約

90日以内に一度、プライマリノードをstepDownすることでこの問題を回避することができます。署名鍵の有効期限を正確に知りたい場合は、任意のconfigノードに接続し、以下のスクリプトを実行することができます。

db.getSiblingDB("admin").system.keys.find().map(k => { return { _id: k._id, purpose: k.purpose, expiresAt: new Date(k.expiresAt. getTime()*1000) }})


鍵が2つ存在する場合(1つは90日後、もう1つは180日後)、今のところ何もする必要はありません。鍵が1つしかない場合は、90日以内にconfigマスターノードを切り替えるためにstepDownを実行する必要があります。

system.keys コレクションにアクセスするには特別なパーミッションが必要なため、パーミッションの問題が発生した場合は、以下のスクリプトで必要なロールを作成する必要があります (ADMIN を使用しているユーザーに置き換えます)。

use admin;
db.createRole({
 role: "query_keys",
 privileges: [
 { resource: { db: "admin", collection: "system.keys"}, actions: [ "find" ] },
 ],
 roles: [ ]
});
db.grantRolesToUser("ADMIN", ["query_keys"])


有効期限はconfig masterノードが再選択された後に新たに生成されますが、上記のスクリプトでリフレッシュされたかどうかを確認することは可能です。

概要

今回の記事は、mongosのクラッシュ後に再起動できない問題を解決する方法についてです。mongosのクラッシュ後に再起動できないことについては、スクリプトハウスの過去記事を検索するか、引き続き以下の関連記事を閲覧してください。