3

pymongo を使用して大規模なデータ更新を実行しています。更新を実行するには、個々のレコードが を使用して検索されcollection.find_one(unique criteria)、変更が行われ、更新がバッチ処理され、最後に を使用してチャンクで送信されます。db.collection.save([long list of records to save])

私のローカル マシン (1.6.3 を実行) では、インポートは正常に機能します。

ローカル マシンよりもはるかに高速なリモート サーバー (1.6.0 を実行) では、挿入の一部を問題なく処理できますが、元のレコードを検索すると、突然次のエラーが発生します。

connection = Connection(...)
...
raise AutoReconnect("could not find master/primary")
pymongo.errors.AutoReconnect: could not find master/primary

通過できるレコードの数は多少異なりますが、ランダムではありません。

最初は、接続制限に達していると思いました。レコードを検索するたびに手動で接続を閉じ始めました。

collection.database.connection.disconnect()

これは問題を解決しませんでした。私は正しい軌道に乗っていますか?

4

2 に答える 2

4

したがって、ここにはいくつかの潜在的な問題があります。

raise AutoReconnect("could not find master/primary") 
pymongo.errors.AutoReconnect: could not find master/primary

このエラーは、既存の接続が無効になったことを示しています。これにはいくつかの理由が考えられます。

これが発生する最も一般的な理由は、レプリカ セットのプライマリが停止したか、失敗したことです。この場合、コードは次のことを行う必要があります。

  1. エラーをキャッチ (またはトラップ) します。
  2. 再試行戦略を決定します。(失敗しますか? もう一度やり直しますか?...)

あなたはこれをやっていますか?レプリカ セットまたはマスター/スレーブを実行していますか? これらのサーバーのパフォーマンスを追跡していますか? ネットワークに問題がありますか? 彼らは役割を切り替えていますか?

collection.database.connection.disconnect()

これは問題を解決しませんでした。私は正しい軌道に乗っていますか?

例外が「起こっている」のはどこですか? それは接続自体からのものですか、それとも保存コマンドからのものですか?

リモート サーバー上 (1.6.0 を実行)

これを書いている時点では、1.6.0 は MongoDB の非常に古いバージョンです。後続の 1.6.x バージョンおよび 1.7.x バージョンでは、複数のレプリケーション バグが修正されました。(すでに 1.8.1rc-0 です)

サーバーで何が起こっているかを調べることから始めますが、それはアップグレード パスにつながる可能性があります。

于 2011-04-04T19:24:04.237 に答える
2

pymongo を使用したインタラクティブな python の使用でこの問題が発生しました。セッションをアイドル状態のままにして、戻るときに AutoReconnect に遭遇しました。私はそれをこのように処理しました:

import functools
import pymongo
import time

MAX_AUTO_RECONNECT_ATTEMPTS = 5

def graceful_auto_reconnect(mongo_op_func):
  """Gracefully handle a reconnection event."""
  @functools.wraps(mongo_op_func)
  def wrapper(*args, **kwargs):
    for attempt in xrange(MAX_AUTO_RECONNECT_ATTEMPTS):
      try:
        return mongo_op_func(*args, **kwargs)
      except pymongo.errors.AutoReconnect as e:
        wait_t = 0.5 * pow(2, attempt) # exponential back off
        time.sleep(wait_t)

  return wrapper

@graceful_auto_reconnect
def some_func_that_does_mongodb_ops():
  ...
  ...

YMMV

于 2011-09-25T07:08:22.617 に答える