2

最近、MongoengineとFlaskをレプリカセットで使用しようとしています。私は接続することができますが、プライマリノードが変わると接続が失われ、中断があります。MongoEngine ReplicaSet接続がステップダウンで失敗する

ここでは、動作をテストできるスニペットを示します。 pymongo.errors.AutoReconnect: connection closed :それは、デバッグレプリカセットの問題私は、主がエラーを変更するたびに取得

from flask import Flask 
from mongoengine import connect 
from flask_mongoengine import MongoEngine 
import os 
db = MongoEngine() 
app = Flask(__name__) 


class TestDoc(db.Document): 
    texto = db.StringField() 


class ProductionConfig: 
    def get_conn_data(self): 
     conn = { 
     'host':"mongodb://testdbuser:[email protected]:53117,flop.mongolab.com:54117/testdb?replicaSet=rs-flip-flop", 
     'replicaSet': 'rs-flip-flop' 
    } 
     return conn 


import time 

app.config['MONGODB_SETTINGS'] = ProductionConfig().get_conn_data() 
db.init_app(app) 

if __name__ == '__main__': 
    with app.test_client() as c: 
     while True: 
      time.sleep(1) 
      print(TestDoc.objects().count()) 
      TestDoc(texto="1").save() 

に非常に便利なhttp://flip-flop.mlab.com/サイトを使用しています。

多くの感謝!私はいくつかのPyMongoバージョンを試しましたが、成功しませんでした。どんな助けも本当に本当にありがとう!

+0

実行しているmongoengineとmongodbのバージョンを確認できますか? –

+0

私はpymongo == 3.2とフラスコ - mongoengine ==を使用しています== 0.7.4 –

答えて

0

ここでの問題は、新しいプライマリの選出が瞬時に行われないことです。 the docsから:

It varies, but a replica set will generally select a new primary within a minute.

For instance, it may take 10-30 seconds for the members of a replica set to declare a primary inaccessible (see electionTimeoutMillis). One of the remaining secondaries holds an election to elect itself as a new primary. During the election, the cluster is unavailable for writes.

The election itself may take another 10-30 seconds.

プライマリがダウンし、レプリカが新しいプライマリとして選出されている間の時間で、その後(彼らは予備選挙に行かなければならないので)書き込みを受け入れる接続されていません。

ただし、これらの状況でより弾力性を高めるためにコードに行うことができます。

まず、あなたは接続(more info here)の読み取りプリファレンスを設定する必要があります。

conn = { 
    'host':"mongodb://testdbuser:[email protected]:53117,flop.mongolab.com:54117/testdb", 
    'replicaSet': 'rs-flip-flop', 
    'read_preference': ReadPreference.SECONDARY_PREFERRED 
    } 

これは選挙の時にかなり堅牢されるべきであることを読み出します。

残念ながら、tryにあなたの書き込みをすべてラップするのが短すぎると、選挙中に書き込みしようとするとコードが転倒します。

これはあなたの質問の例のように思えます。フラスコルートで書いていると仮定すると、Webサーバーは500エラー応答を投げます。あなたがフラスコから再びルートをリクエストするときには、選挙は完了し、mongoengineは新しいプライマリに書いています。

+0

これは絶対に正しいです。私に残されたもう一つの事は、uwsgiファイルを変更して "lazy-apps = true"を追加することでした。それ以外の場合は、接続エラー(フェールオーバーのために)が発生したときにアプリ全体がフリーズします。どうもありがとう! –

関連する問題