問題の説明
データがレプリカセットインスタンスに書き込まれると、次のエラーメッセージが返されます:"errmsg": "not master", "code": 10107, "codeName": "NotMaster"
、"errmsg": "not master", "code": 10107, "codeName": "NotWritablePrimary"
、または Time out after 30000ms while waiting for a server that matches writableServerSelector.
原因
レプリカセットインスタンスでプライマリ /セカンダリの切り替えが発生します。 ノードの役割が変わります。 業務がプライマリノードのエンドポイントに接続されている場合、セカンダリノードはプライマリ /セカンダリの切り替え後に実際に接続されます。 したがって、データの書き込みは失敗する。
プライマリ /セカンダリの切り替えは、多くの理由でトリガーされます。 詳細については、「インスタンスのプライマリ /セカンダリの切り替えの原因」をご参照ください。
各レプリカセットインスタンスには、1つのプライマリノード、1つ以上のセカンダリノード、1つの隠しノード、およびオプションで1つ以上の読み取り専用ノードが含まれます。 各ノードには、ノードの役割 (プライマリ、セカンダリ、非表示、または読み取り専用) 、ノードID、ノードのIPアドレス、エンドポイント、ポートなどの独自の属性情報があります。 プライマリ /セカンダリの切り替えにより、ノードのロールが変更されますが、ノードの他の属性は変更されません。
レプリカセットインスタンスでは、ノード1がプライマリノードであり、ノード2がセカンダリノードです。 プライマリノード (ノード1) のエンドポイントは、プライマリ /セカンダリスイッチの前に接続されています。 セカンダリノード (ノード2) のエンドポイントは、プライマリ /セカンダリの切り替え後に実際に接続されます。 したがって、データの書き込みは失敗します。
解決策
インスタンスのノードロールを手動で切り替えます。 プライマリ /セカンダリの切り替え後にエンドポイントが実際に接続されているノードがプライマリノードとして機能します。 ノードの役割を切り替える方法の詳細については、「ノードの役割の切り替え」をご参照ください。
アプリケーションが本番環境で実行されている場合は、接続文字列URIを使用してアプリケーションをインスタンスに接続することを推奨します。 このようにして、プライマリ /セカンダリの切り替えを実行して、ノードに障害が発生した場合でもアプリケーションの読み取りおよび書き込み操作を使用できるようにすることができます。 詳細については、「レプリカセットインスタンスへの接続」をご参照ください。
アプリケーションが切断された後、ApsaraDB for MongoDBインスタンスに再接続できるようにし、例外を処理してビジネス継続性を保護することを推奨します。