Кассандра Гектор - UnavailableException

Я пытаюсь вставить записи с помощью Hector и время от времени получаю эту ошибку:

me.prettyprint.hector.api.exceptions.HUnavailableException: : May not be enough replicas present to handle consistency level.
    at me.prettyprint.cassandra.service.ExceptionsTranslatorImpl.translate(ExceptionsTranslatorImpl.java:59)
    at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:264)
    at me.prettyprint.cassandra.model.ExecutingKeyspace.doExecuteOperation(ExecutingKeyspace.java:113)
    at me.prettyprint.cassandra.model.MutatorImpl.execute(MutatorImpl.java:243)
    at me.prettyprint.cassandra.service.template.AbstractColumnFamilyTemplate.executeBatch(AbstractColumnFamilyTemplate.java:115)
    at me.prettyprint.cassandra.service.template.AbstractColumnFamilyTemplate.executeIfNotBatched(AbstractColumnFamilyTemplate.java:163)
    at me.prettyprint.cassandra.service.template.ColumnFamilyTemplate.update(ColumnFamilyTemplate.java:69)
    at ustocassandra.USToCassandraHector.consumer(USToCassandraHector.java:271)
    at ustocassandra.USToCassandraHector.access$100(USToCassandraHector.java:41)
    at ustocassandra.USToCassandraHector$2.run(USToCassandraHector.java:71)
    at java.lang.Thread.run(Thread.java:724)
Caused by: UnavailableException()
    at org.apache.cassandra.thrift.Cassandra$batch_mutate_result.read(Cassandra.java:20841)
    at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
    at org.apache.cassandra.thrift.Cassandra$Client.recv_batch_mutate(Cassandra.java:964)
    at org.apache.cassandra.thrift.Cassandra$Client.batch_mutate(Cassandra.java:950)
    at me.prettyprint.cassandra.model.MutatorImpl$3.execute(MutatorImpl.java:246)
    at me.prettyprint.cassandra.model.MutatorImpl$3.execute(MutatorImpl.java:243)
    at me.prettyprint.cassandra.service.Operation.executeAndSetResult(Operation.java:104)
    at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:258)
    ... 9 more

Я знаю, что обычное объяснение состоит в том, что не хватает узлов, но это не тот случай. Все мои узлы работают:

./nodetool ring
Note: Ownership information does not include topology; for complete information, specify a keyspace

Datacenter: DC1
==========
Address         Rack        Status State   Load            Owns                Token
                                                                               4611686018427388000
172.16.217.222  RAC1        Up     Normal  353.36 MB       25.00%              -9223372036854775808
172.16.217.223  RAC2        Up     Normal  180.84 MB       25.00%              -4611686018427388000
172.16.217.224  RAC3        Up     Normal  260.34 MB       25.00%              -2
172.16.217.225  RAC4        Up     Normal  222.71 MB       25.00%              4611686018427388000

Я вставляю записи с 20 потоками (может быть, я должен использовать меньше? Насколько я знаю, в этом случае ошибка будет перегружена, а не недоступна). Я использую согласованность записи ONE. Я использую AutoDiscoveryAtStartup и LeastActiveBalancingPolicy. Коэффициент репликации равен 2.

Я использую Cassandra 1.2.8 (пробовал с 2.0, тоже самое).

Ошибка возникает не с самого начала. Обычно мне удается вставить около 2 миллионов записей, прежде чем я получу ошибку. Мой код настроен на повторную попытку при возникновении ошибки. После нескольких десятков попыток вставка обычно завершается успешно. После этого он снова работает нормально для нескольких миллионов вставок, затем я снова получаю сообщение об ошибке, и цикл продолжается.

Может быть, потому что я установил gc_grace = 60? Во всяком случае, я не получаю ошибку каждые 60 секунд, поэтому я не думаю, что это причина.

Не могли бы вы дать мне несколько предложений о причине этой ошибки и что мне делать?

РЕДАКТИРОВАТЬ:

'nodetool tpstats' говорит, что у меня пропущено несколько сообщений:

Message type           Dropped
RANGE_SLICE                  0
READ_REPAIR                  0
BINARY                       0
READ                         0
MUTATION                    11
_TRACE                       0

И я вижу следующие предупреждения в файле журнала:

 WARN [ScheduledTasks:1] 2013-09-30 09:20:16,633 GCInspector.java (line 136) Heap is 0.853986836999536 full.  You may need to reduce memtable and/or cache sizes.  Cassandra is now reducing cache sizes to free up memory.  Adjust reduce_cache_sizes_at threshold in cassandra.yaml if you don't want Cassandra to do this automatically
 WARN [ScheduledTasks:1] 2013-09-30 09:20:16,634 AutoSavingCache.java (line 185) Reducing KeyCache capacity from 1073741824 to 724 to reduce memory pressure
 WARN [ScheduledTasks:1] 2013-09-30 09:20:16,634 GCInspector.java (line 142) Heap is 0.853986836999536 full.  You may need to reduce memtable and/or cache sizes.  Cassandra will now flush up to the two largest memtables to free up memory.  Adjust flush_largest_memtables_at threshold in cassandra.yaml if you don't want Cassandra to do this automatically
 WARN [ScheduledTasks:1] 2013-09-30 09:20:16,634 StorageService.java (line 3618) Flushing CFS(Keyspace='us', ColumnFamily='my_cf') to relieve memory pressure

Это как раз то время, когда Гектор создает исключение «Недоступно». Так что, вероятно, проблема связана с памятью. Думаю, я попробую то, что говорит предупреждение: уменьшить размер памяти.


person Anakin001    schedule 27.09.2013    source источник


Ответы (1)


Вероятно, это связано с тем, что ваши серверы перегружены, поэтому некоторые узлы не отвечают. Нет OverloadedException (перегруженный узел выглядит как недоступный узел).

Вы должны проверить свои журналы Cassandra - есть ли предупреждения о заполнении кучи? В списке nodetool tpstats есть потерянные сообщения? Какова загрузка ЦП на ваших серверах?

person Richard    schedule 27.09.2013
comment
Спасибо, похоже (из лог-файла и tpstats) мои узлы действительно перегружены. Я отредактировал свой вопрос. Если у вас есть другие предложения, они будут приветствоваться :) - person Anakin001; 30.09.2013