1

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にアクセスしていた可能性があります。MongoCursorExceptionnot master and slaveok=false

ただし、フェールオーバー中MongoCursorExceptionにメッセージが表示されます。couldn't determine masterたとえば、フェイルオーバーを実行しました。mongod ログに基づいて、数秒後に新しいプライマリが選出されましたが、5 分後でも Web アプリケーションはその例外をスローしていました。

4

2 に答える 2

6

DoctrineMongoDBBundle の 2.0 ブランチに対応するタグの 1 つ (現時点では 2.2.1 まで) を使用していると思います。Symfony 2.1+ との互換性は、バンドルのタグ バージョン 3+ にあります。

構成クラスは、デフォルトでゼロに設定されているオプションをドキュメント マネージャー レベルで公開retry_queryします。retry_connectYML では、構成は次のようになります。

doctrine_mongodb:
    # Other proxy, hydrator and connection configuration options

    default_document_manager: dm1

    document_managers:
        dm1:
            retry_query: 1
            retry_connect: 1
            # Other mapping, metadata and DM options follow

これはバンドルのドキュメントに記載されていないことに気付いたので、このコミットにセクションを追加しました。

于 2012-11-06T21:16:24.847 に答える
1

MongoDB 内で構成された指定のレプリカ セットを指すように、replicaSet オプションを構成しましたか?

Symfony DoctrineMongoDBBundle ドキュメント

下部の完全な構成を見てください。私の知る限り、サーバー構成行ですべてのサーバーに名前を付け、オプションセクションでレプリカセットに名前を付ける必要があります。そのページのドキュメントでは、それがあまり明確ではありません。

コードを調べます。設定でリトライシステムを構成する必要があるようです。

retryConnect
retryQuery

データベース名と同じレベル。

これは、基本的に同じことを行う Zend Framework 構成の例です。

; Database details
resources.odm.configuration.defaultDB = "test"
resources.odm.connection.options.replicaSet = "test-replica-set"
resources.odm.connection.server = "mongodb://rs1a.testing.com:27017,rs1b.testing.com:27017,rs1c.testing.com:27017"
resources.odm.configuration.retryConnect = 3
resources.odm.configuration.retryQuery = 3

replicaSet を構成していない場合、同様のエラーが発生していました。

于 2012-06-20T19:22:36.353 に答える