2

単一ノードで Cassandra インスタンス (v1.1.10) への単純な書き込み操作を実行したいと考えていました。一定の書き込みを処理する方法と、書き込み速度に追いつくことができるかどうかを確認したかっただけです.

pool = ConnectionPool('testdb')
test_cf = ColumnFamily(pool,'test')
test2_cf = ColumnFamily(pool,'test2')
test3_cf = ColumnFamily(pool,'test3')
test_batch = test_cf.batch(queue_size=1000)
test2_batch = test2_cf.batch(queue_size=1000)
test3_batch = test3_cf.batch(queue_size=1000)

chars=string.ascii_uppercase
counter = 0
while True:
    counter += 1
    uid = uuid.uuid1()
    junk = ''.join(random.choice(chars) for x in range(50))
    test_batch.insert(uid, {'junk':junk})
    test2_batch.insert(uid, {'junk':junk})
    test3_batch.insert(uid, {'junk':junk})
    sys.stdout.write(str(counter)+'\n')

pool.dispose()

長時間の書き込みの後 (カウンターが約 10M+ の場合)、コードがクラッシュし続け、次のメッセージが表示されます。

pycassa.pool.AllServersUnavailable: An attempt was made to connect to each of the servers twice, but none of the attempts succeeded. The last failure was timeout: timed out

queue_size=100役に立たなかったを設定しました。またcqlsh -3、スクリプトがクラッシュして次のエラーが発生した後、コンソールを起動してテーブルを切り捨てました。

Unable to complete request: one or more nodes were unavailable.

テーリング/var/log/cassandra/system.logではエラー サインは表示されませんが、Compaction、FlushWriter などでは INFO が表示されます。私は何を間違っていますか?

4

1 に答える 1

0

私もこの問題を抱えていました.@tyler-hobbsが彼のコメントで提案したように、ノードが過負荷になっている可能性があります(私にとってはそうでした)。私が使用した簡単な修正は、バックオフしてノードが追いつくようにすることです。上記のループを書き直してエラーをキャッチし、しばらくスリープしてから再試行します。これを単一ノードクラスターに対して実行しましたが、うまく機能します-一時停止(1分間)し、定期的にバックオフします(連続で5回以下)。エラーが 5 回連続してスローされない限り、このスクリプトを使用してデータが失われることはありません (この場合、おそらくループに戻るよりもハードに失敗する必要があります)。

while True:
  counter += 1
  uid = uuid.uuid1()
  junk = ''.join(random.choice(chars) for x in range(50))
  tryCount = 5 # 5 is probably unnecessarily high
  while tryCount > 0:
    try:
      test_batch.insert(uid, {'junk':junk})
      test2_batch.insert(uid, {'junk':junk})
      test3_batch.insert(uid, {'junk':junk})
      tryCount = -1
    except pycassa.pool.AllServersUnavailable as e:
      print "Trying to insert [" + str(uid) + "] but got error " + str(e) + " (attempt " + str(tryCount) + "). Backing off for a minute to let Cassandra settle down"
      time.sleep(60) # A delay of 60s is probably unnecessarily high
      tryCount = tryCount - 1
  sys.stdout.write(str(counter)+'\n')

ここに完全な要点を追加しました

于 2013-09-13T08:54:31.243 に答える