2016-09-12 2 views
2

Мы используем Cassandra 2.0.10 и имеем кластер из 5 узлов. Когда-то мы получаем большое количество сообщений SliceQueryFilter.java (line 225) Read 2 live and 1056 tombstoned cells ... в журнале Cassandra на одном конкретном узле, а узел сбрасывает всю производительность базы данных. Мы должны перезапустить службу cassandra на этом узле, чтобы решить проблему с производительностью.Один из 5 узлов cassandra снижает производительность всего кластера

Кто-нибудь видит, что может быть основной причиной этого и как его исправить?

+0

Трудно сказать, не видя вашу модель данных, но я представил некоторые мысли, основанные на проблемах, которые я видел раньше. – Aaron

ответ

3

Read 2 живые и 1056 надгробий клетки

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

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

на одном конкретном узле

ли это всегда происходит на том же узле? Если это так, значит, вы попадаете в другую ловушку моделирования данных, где слишком много данных записывается в один раздел, создавая «горячую точку» в вашем кластере.

Если это не всегда один и тот же узел, то это похоже на то, что узел используется в качестве координатора для выполнения слишком большого количества запросов. Убедитесь, что ваша команда приложений использует код TokenAwareLoadBalancingPolicy в своем коде драйвера и что они неправильно используют инструкции BATCH.

Откуда вы знаете, используется ли BATCH неправильно?

Если BATCH используется для обеспечения атомных обновлений в одном разделе, то он используется должным образом. Если BATCH используется для повышения производительности при применении серии обновлений в одном сетевом отключении, то он используется неправильно. Если вы используете Spring Data Cassandra, на самом деле это делает за кулисами при сохранении списка объектов.

+0

Я бы использовал BATCH только для того, чтобы сохранить две или более таблицы в синхронизации, даже если на нескольких разделах и получить штраф * right * за это (без атомарности). Тогда я позабочусь об этом на уровне приложений. Я не думаю, что это плохое использование BATCH, не так ли? – xmas79

+0

@ xmas79 Вы правы, нормально держать небольшое количество таблиц в синхронизации с BATCH, даже если ключи разделов не точны. Я просто хотел дать общее руководство в качестве примера для «плохого» использования партии. В вашем случае узлу-координатору нужно сделать только 2 (или больше), если «больше» - это одна цифра), так что это не большая проблема. – Aaron