Doctrine ODM を使用して MongoDB に接続しています。私は 3 つのノードのレプリカ セットを持っています: 2 つのフルと 1 つのアービターです。レプリケーションは高可用性のみを目的としており、読み取りをノード間で分散しようとはしていません。私のアプリケーションはMongoCursorException
、メッセージで頻繁に sをログに記録していますnot master and slaveok=false
。mongodb ログにフェールオーバー イベントが発生し、プライマリが変更されなかったという証拠はありません。訂正:フェールオーバーは確かに発生しましnot master and slaveok=false
たが、新しいプライマリが正常に選出されてから 6 時間後にさえ、例外が頻繁に表示されていました。
何をすべきか?私たちのバージョンのdoctrine-mongodbには(実験的な?) 再試行機能が含まれていますが、それを有効にする簡単な方法がわかりません。
問題があるかどうかはわかりませんが、これは Symfony2 (v2.0) アプリです。
https://groups.google.com/d/topic/mongodb-user/6p710Rdycpg/discussionは、再試行が必要であることを意味します(私の強調):
アプリケーションは、再接続/再試行するように作成する必要があります。これは、通常の操作中のローリング アップグレード プロセスと同様に発生する可能性がある一時的な (ネットワーク) エラーがいくつもあるためです。
Mongo PHP extension docsはこれを説明しているようです:
最初の試行が特定の理由で失敗した場合、ドライバーは自動的に「プレーンな」クエリ (コマンドではない) を数回再試行します。これは、レプリカ セットのフェールオーバー中に発生する例外を減らし (おそらくまだ対処する必要がある場合もあります)、一時的なネットワークの問題を解決するためです。
doctrine-mongodb
そして、PHP拡張機能を使用して実際にmongodと通信しただけだと思いました。そのため、再試行の構成について心配する必要があるかどうかについて、少し混乱しています。
問題の一部を解決したと思います。Kristina Chodorow からのこのアドバイスに従って、接続文字列からアービターを削除しました。メッセージに s が表示されなくなりました。https://jira.mongodb.org/browse/PHP-392にアクセスしていた可能性があります。MongoCursorException
not master and slaveok=false
ただし、フェールオーバー中MongoCursorException
にメッセージが表示されます。couldn't determine master
たとえば、フェイルオーバーを実行しました。mongod ログに基づいて、数秒後に新しいプライマリが選出されましたが、5 分後でも Web アプリケーションはその例外をスローしていました。