私は、マシン間のスムーズな移行方法として、Mongo のレプリカ セット機能を使用することに興味があります。私の Mongo データベースは現在、スタンドアロン インスタンスです。推奨される方法は、レプリカ セットとして 3 つの独立したインスタンスを実行することであることは理解しています。しかし、現在のところ、3 つの独立したインスタンスを実行するコストを正当化できるほど、可用性の要件は高くありません。そうは言っても、ダウンタイムはできるだけ避けたいと考えています。
サーバーに大きな変更を加える場合、理想的には、必要な変更を加えた新しいサーバーを起動します (元のサーバーからクローンするか、必要な変更を加えて最初から構築するなど)。このサーバーは mongo データベースをホストしています。
この新しいサーバーをテストしている間、これを非表示のセカンダリにしたいと思います。こうすると、データは保持されますが、実際にはクライアントの要求に応答しません。新しいサーバーに慣れたら、新しいサーバーをプライマリに、古いサーバーを非表示のセカンダリに切り替えます。こうすると、古いサーバーは引き続きデータを取得しますが、クライアントの要求は処理しません。問題が検出された場合は、プライマリとセカンダリを再度切り替えて、クライアントを古いサーバーに戻すことができます。数日後に問題がなければ、古いサーバーをシャットダウンできます。
私の質問は次のとおりです:
- この方法ではどのような問題が発生する可能性がありますか?
- ダウンタイムなしでデータをあるサーバーから別のサーバーに(そしてクライアントをあるサーバーから別のサーバーに)移動するという私の目標は達成できるでしょうか?
- 将来の変更に備えてこれを実行する可能性があるので、新しいサーバーをメンバー 0 のレプリカ セットのままにしておくことをお勧めします。これでは、少なくとも 3 つのメンバーが提供する高可用性は得られないことを理解しています。しかし、このままにしておくことで何か問題が生じるでしょうか。それとも、スタンドアロン インスタンスに戻すのが最善でしょうか。
答え1
プライマリーを選出するには、レプリカセット内に少なくとも 3 台のサーバーが必要です。既存のサーバー、新しいサーバー、およびそれらの 1 つで実行されているアービターを使用して、3 番目のサーバーにすることができます。単一サーバーのレプリカセットを実行することはできません。プライマリーがないと、書き込みを行うことはできません。
mongod サービスを停止/開始せずにスタンドアロンからレプリカセットに変更することはできません。mongod を再起動するか、mongod.conf にオプション--replSet replica_set_name
を追加する必要があります。replSet=replica_set_name
同期したら、スタンドアロンに戻すのも同様のプロセスになります (mongo を停止し、replSet 構成を削除し、mongo を起動します)。
クライアントが読み取り優先として「プライマリ」に設定されている場合、読み取りはセカンダリに送信されません (セカンダリは主に水平スケーリングではなく耐久性のために使用されるため、これは通常デフォルトです)。
http://docs.mongodb.org/manual/tutorial/convert-standalone-to-replica-set/