2014-02-04 3 views
0

Я использую узел Cassandra (один узел) в системе разработки и некоторое время назад при запуске «сильных тестов» (как в очень быстрых тестах на запись) у меня появилось много ошибок. Они видят в них вопросы по всем местам и не дают никаких реальных ответов только о том, что вы просто не можете идти слишком быстро. Хорошо, я в целом в порядке с этим.apache :: бережливость :: транспорт :: TTransportException - Кассандра временами из-за мусора?

Тем не менее, сегодня я использовал систему, как и в процессе производства, и получаю таблицу, которая генерирует ошибку тайм-аута. Это в режиме READ (частичная запись в ошибке находится в сокете, а не в базе данных).

Thrift: Tue Feb 4 01:46:44 2014 TSocket::write_partial() send() <Host: 127.0.0.1 Port: 9160>Broken pipe 
terminate called after throwing an instance of 'apache::thrift::transport::TTransportException' 
    what(): write() send(): Broken pipe 

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

У кого-то были проблемы с этим раньше? Если да, у вас есть способ исправить это? Эта конкретная строка, которую я мог бы восстановить, но что произойдет в кластере со многими узлами? Может ли строка на одном узле решить разорвать всю систему? (что одна строка разбивала мою систему разработки!) Если у вас есть идеи, я бы хотел услышать о них, так что в следующий раз, когда это произойдет, я смогу заглянуть в исправление, а не взорвать всю базу данных и создать новую (я мог бы просто удалить таблицы и перезапуск свежей, нет необходимости удалять весь кластер, но все же ..., но это не является решением проблемы в системе производства.)

======== UPDATE

Ah ! Nevermind, я искал неправильный файл журнала (системы разработки, я скажу вам ...). Ошибка - исключение EOFException.

ERROR [ReadStage:29174] 2014-02-04 01:17:00,587 CassandraDaemon.java (line 185) Exception in thread Thread[ReadStage:29174,5,main] 
java.io.IOError: java.io.EOFException 
at org.apache.cassandra.db.Column$1.computeNext(Column.java:79) 
at org.apache.cassandra.db.Column$1.computeNext(Column.java:64) 
at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143) 
at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138) 
at org.apache.cassandra.db.columniterator.SimpleSliceReader.computeNext(SimpleSliceReader.java:88) 
at org.apache.cassandra.db.columniterator.SimpleSliceReader.computeNext(SimpleSliceReader.java:37) 
at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143) 
at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138) 
at org.apache.cassandra.db.columniterator.SSTableSliceIterator.hasNext(SSTableSliceIterator.java:82) 
at org.apache.cassandra.db.filter.QueryFilter$2.getNext(QueryFilter.java:157) 
at org.apache.cassandra.db.filter.QueryFilter$2.hasNext(QueryFilter.java:140) 
at org.apache.cassandra.utils.MergeIterator$OneToOne.computeNext(MergeIterator.java:200) 
at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143) 
at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138) 
at org.apache.cassandra.db.filter.SliceQueryFilter.collectReducedColumns(SliceQueryFilter.java:189) 
at org.apache.cassandra.db.filter.QueryFilter.collateColumns(QueryFilter.java:122) 
at org.apache.cassandra.db.filter.QueryFilter.collateOnDiskAtom(QueryFilter.java:80) 
at org.apache.cassandra.db.filter.QueryFilter.collateOnDiskAtom(QueryFilter.java:72) 
at org.apache.cassandra.db.CollationController.collectAllData(CollationController.java:294) 
at org.apache.cassandra.db.CollationController.getTopLevelColumns(CollationController.java:53) 
at org.apache.cassandra.db.ColumnFamilyStore.getTopLevelColumns(ColumnFamilyStore.java:1468) 
at org.apache.cassandra.db.ColumnFamilyStore.getColumnFamily(ColumnFamilyStore.java:1294) 
at org.apache.cassandra.db.Keyspace.getRow(Keyspace.java:332) 
at org.apache.cassandra.db.SliceFromReadCommand.getRow(SliceFromReadCommand.java:65) 
at org.apache.cassandra.service.StorageProxy$LocalReadRunnable.runMayThrow(StorageProxy.java:1365) 
at org.apache.cassandra.service.StorageProxy$DroppableRunnable.run(StorageProxy.java:1897) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:724) 
Caused by: java.io.EOFException 
at java.io.RandomAccessFile.readFully(RandomAccessFile.java:416) 
at java.io.RandomAccessFile.readFully(RandomAccessFile.java:394) 
at org.apache.cassandra.io.util.RandomAccessReader.readBytes(RandomAccessReader.java:348) 
at org.apache.cassandra.utils.ByteBufferUtil.read(ByteBufferUtil.java:392) 
at org.apache.cassandra.utils.ByteBufferUtil.readWithLength(ByteBufferUtil.java:355) 
at org.apache.cassandra.db.ColumnSerializer.deserializeColumnBody(ColumnSerializer.java:118) 
at org.apache.cassandra.db.OnDiskAtom$Serializer.deserializeFromSSTable(OnDiskAtom.java:85) 
at org.apache.cassandra.db.Column$1.computeNext(Column.java:75) 
... 28 more 
+0

войти ли Cassandra ошибку, тоже? Или просто клиент? Обычно таймауты отображаются в журналах. – Ralf

+0

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

+0

Думаю, я слишком быстро прокомментировал! Глядя на настройку журнала, он находится на INFO, поэтому я уже получаю довольно много журналов. Дело в том, что я смотрел на старый журнал. Теперь я вижу ошибку, обновленную в вопросе. –

ответ

0

Ralf указал мне на страницу, где Ричард был ответ, говоря:

«вы можете просто удалить поврежденный SSTable затем запустить ремонт, чтобы восстановить данные из реплик. »

Итак, я пробовал сегодня, так как снова получил такую ​​же ошибку, и она действительно сработала. То есть, поскольку у меня есть единственный узел, ремонт фактически бесполезен из того, что я могу сказать. Тем не менее, «удалить поврежденную SSTable» часть работает красиво. Как только я сделал скраб для данной таблицы, я смог прочитать строку, которая генерировала тайм-аут (т. Е. Тайм-аут происходит, потому что Кассандра бросает и, таким образом, никогда не отвечает на бережливость, которая через некоторое время решает выбросить ошибку таймаута на клиенте . сторона)

В моем случае, я побежал следующую команду и получил проблема решена для таблицы с именем files:

nodetool scrub snap_websites files 
      ^   ^
       |    | 
       |    +--- your table name 
       +--- your context name 
Смежные вопросы