2016-06-12 111 views
0

我的簇大小爲6臺機器,我時常收到此錯誤信息,我真的不知道如何解決這個問題:操作卡桑德拉集羣超時錯誤

code=1100 [Coordinator node timed out waiting for replica nodes' responses] message="Operation timed out - received only 0 responses." info={'received_responses': 0, 'required_responses': 1, 'consistency': 'LOCAL_ONE'} 

這是我的完整代碼和其中錯誤消息發生的代碼的一部分是這樣的:

batch.add(schedule_remove_stmt, (source, type, row['scheduled_for'],row['id']));session.execute(batch,30) 

完整代碼:

cluster = Cluster(['localhost']) 
session = cluster.connect('keyspace') 
d = datetime.utcnow() 
scheduled_for = d.replace(second=0, microsecond=0) 
rowid=[] 
stmt = session.prepare('SELECT * FROM schedules WHERE source=? AND type= ? AND scheduled_for = ?') 
schedule_remove_stmt = session.prepare("DELETE FROM schedules WHERE source = ? AND type = ? AND scheduled_for = ? AND id = ?") 
schedule_insert_stmt = session.prepare("INSERT INTO schedules(source, type, scheduled_for, id) VALUES (?, ?, ?, ?)") 
schedules_to_delete = [] 
articles={} 
source='' 
type='' 
try: 
    rows = session.execute(stmt, [source,type, scheduled_for]) 
    article_schedule_delete = '' 
    for row in rows: 
     schedules_to_delete.append({'id':row.id,'scheduled_for':row.scheduled_for}) 
     article_schedule_delete=article_schedule_delete+'\''+row.id+'\',' 
     rowid.append(row.id) 
    article_schedule_delete = article_schedule_delete[0:-1] 
    cql = 'SELECT * FROM articles WHERE id in (%s)' % article_schedule_delete 
    articles_row = session.execute(cql) 
    for row in articles_row: 
     articles[row.id]=row.created_at 
except Exception as e: 
    print e 
    log.info('select error is:%s' % e) 
try: 
    for row in schedules_to_delete: 
     batch = BatchStatement() 
     batch.add(schedule_remove_stmt, (source, type, row['scheduled_for'],row['id'])) 
     try: 
      if row['id'] in articles.keys(): 
       next_schedule =d 
       elapsed = datetime.utcnow() - articles[row['id']] 
       if elapsed <= timedelta(hours=1): 
        next_schedule += timedelta(minutes=6) 
       elif elapsed <= timedelta(hours=3): 
        next_schedule += timedelta(minutes=18) 
       elif elapsed <= timedelta(hours=6): 
        next_schedule += timedelta(minutes=36) 
       elif elapsed <= timedelta(hours=12): 
        next_schedule += timedelta(minutes=72) 
       elif elapsed <= timedelta(days=1): 
        next_schedule += timedelta(minutes=144) 
       elif elapsed <= timedelta(days=3): 
        next_schedule += timedelta(minutes=432) 
       elif elapsed <= timedelta(days=30) : 
        next_schedule += timedelta(minutes=1440) 
       if not next_schedule==d: 
        batch.add(schedule_insert_stmt, (source,type, next_schedule.replace(second=0, microsecond=0),row['id'])) 
        #log.info('schedule id:%s' % row['id']) 
     except Exception as e: 
      print 'key error:',e 
      log.info('HOW IT CHANGES %s %s %s %s ERROR:%s' % (source,type, next_schedule.replace(second=0, microsecond=0), row['id'],e)) 
     session.execute(batch,30) 
except Exception as e: 
    print 'schedules error is =======================>',e 
    log.info('schedules error is:%s' % e) 

由於人ot的幫助,我真的不知道如何解決這個問題!

回答

2

我認爲你不應該在這種情況下使用批處理語句,因爲你正試圖使用​​批處理來執行大量不同分區鍵的操作,它會導致超時異常。您應該使用批處理來保持表同步,但不能用於性能優化。 你可以找到更多關於濫用批次this article

使用的asynchronous driver api更適合執行大量刪除查詢你的情況。它將允許保持代碼的性能並避免協調器過載。