2016-09-28 1 views
0

私はEC2上に3つのインスタンスを持っています。各インスタンスはサービスmongoを持ち、レプリカセット、つまりプライマリ(192.168.1.1)、セカンダリ(192.168.1.2 )およびアービタ(192.168.1.3)を含む。mongoに新しいメンバを追加し、アプリケーションでエラー例外を防ぐ

私はmongoに接続するいくつかのアプリケーションを持っています。

次のように私の質問は:

私はレプリカで他のメンバーを追加した場合、私は新しいメンバーを含めるように接続設定内のすべてのアプリケーションを変更する必要がありますか?

お願いします。

最後の.1がプライマリ、.2がセカンダリであると仮定し、最後に新しいメンバーを追加します.4。また、この新しいメンバーをアプリケーションデータベースの設定に含めません。プライマリが落ちましたが、アービタは.4を新しいプライマリにするようにipを選択します。すべてのアプリケーションが例外をスローし始めます。

私はどのように新しいアプリケーションを追加する必要があるのか​​、アプリケーションデータベースの構成を変更する必要はありません。 'n'のメンバーを追加しなければならないと想像してください。

私のアプリケーションがPHPであることを知って、ホスト構成を追加せずにプライマリだけを識別する方法はありますか?

+0

難しいです。最初のホストセットがレプリカセットに永遠に残っていて、常に有効で利用可能なものが少なくとも1つある場合を除いて、アプリケーションの設定を最終的に変更する必要があります。この問題のさまざまな解決策は[tag:service-discovery]と呼ばれ、3番目のシステムに接続してアプリケーションがレプリカセットに接続できる場所を確認する必要があります。 –

答えて

0

アプリケーションで何も変更する必要はありません。コマンドrs.add( "address:port")を使って新しいノードをレプリカセットに追加するだけです。 3つのノード(プライマリとセカンダリの2つ)がある場合、それらのノードが投票のメンバーであれば、アービタを持ってはいけません。 (投票数は常に奇数でなければなりません)

プライオリティ値を持つプライマリヘリテージオーダーを「選択」できます。 .1ノードの優先度をf.exに設定した場合。 3、.2ノードの優先順位を2に、最後のセカンダリを優先順位1に、.1はできるだけプライマリを維持し、そうでない場合は.2がプライマリとして選択されます。 ポイントは、アプリケーションが接続するだけですレプリカセットの1つのノードであり、その(アプリケーション)getは自動的に情報を取得し、そのレプリカセットの他のノードは何か、「who」はプライマリです。

3つのノードレプリカセットでは、常に2つのノードを起動して(大半は2/3)、最後のノードをプライマリとして選択しないでください。

+0

レプリカセットの変更がわずかである限り、正常に動作します。多くの変更(例えば、5つの新しいホストの追加、元の3つのホストの削除など)を行った場合、アクティブなホストのアドレスが含まれていないため、アプリケーションの接続文字列は無効になります。 –

関連する問題