5

リモートのmongodbに接続しようとしています。ローカルの mongodb を使用してアプリケーションを開発しました。ここで、アプリケーションを dev にデプロイし、dev mongodb を構成しました。次の例外が発生しています。

Caused by: com.mongodb.MongoException: can't find a master
    at com.mongodb.DBTCPConnector.checkMaster(DBTCPConnector.java:509)
    at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:266)
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:289)
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:274)
    at com.mongodb.DBCursor._check(DBCursor.java:368)
    at com.mongodb.DBCursor._hasNext(DBCursor.java:459)
    at com.mongodb.DBCursor.hasNext(DBCursor.java:484)

面白いことに、ローカル アプリケーションからレプリカ セット サーバー アドレスを使用して dev mongodb に接続できますが、(dev にデプロイされた) アプリケーションを dev mongodb に接続しようとすると、上記のエラーが表示されます。

同じ問題に直面して解決した人がいるかどうか疑問に思っています。

4

1 に答える 1

1

mongodb のこの交絡する側面は、その投票ポリシーにおいて政治科学の原則と衝突しています。

これがどのように起こるかです。

  • レプリカ セットが存在します。奇数の投票ノードが必要です。
  • サーバー/ネットワークがダウンするかダウンするため、プライマリ ノードに障害が発生します。他のノードも失敗する可能性がありますが、最も重要なのは...
  • 偶数のノードが残り、プライマリはありません。
  • 残りの偶数のノードは予備選挙に決着をつけることができず、政治的膠着状態 (過半数のない ハングした議会) に陥ります。
    • 再選が行われますが、プライマリはまだダウンしています。その別のデッドロック。ここでループします。

解決策の 1 つは、候補者が平等ではなくなるように票に重みを付けて選挙を左右することです。prioritymongo の世界では、これはメンバーに割り当てることによって行われます。

優先順位の比較 優先順位の設定は選択に影響します。メンバーは、優先順位の値が最も高いメンバーに投票することを好みます。

これを行うには、mongo シェル (管理者上) に入り、rs.conf を更新します。

cfg = rs.conf()
cfg.members[0].priority = 100
cfg.members[1].priority = 99
cfg.members[3].priority = 98
rs.reconfig(cfg)

この構成では、プライマリ メンバー 0 に障害が発生すると、メンバー 1 がプライマリとして投票されます。

ここにいくつかの良いリンクがあります:

http://docs.mongodb.org/manual/core/replica-set-elections/

http://docs.mongodb.org/manual/core/replica-set-architecture-four-members/

最後に、この状況は、時間、CPU、負荷、またはその他のメトリックによってスケールアップおよびスケールダウンする可用性セットなどの手法を使用するクラウド アーキテクチャでは非常に一般的であり、ランダムまたは不当な差別ポリシーによって実際に処理する必要があります。すべてのデフォルトのレプリカ セット。テクニックがなくても、デフォルトのレプリカ セットのプライマリはある時点でデッドロックし、使用できなくなります。私の意見では重大な失敗。

于 2014-11-30T03:03:15.473 に答える