У нас возникают проблемы с запущенными Java-приложениями, которые обновляют счетчики в Cassandra. Из-за контроля загрузки серверов мы не видим корреляции с нагрузкой. Запросы довольно постоянны, потому что они обновляют значения только в 8 разных таблицах. Каждую минуту приложения java запускают тысячи запросов (может быть 20k или даже 50k запросов), но каждый раз некоторые из них терпят неудачу. Когда это происходит, мы записываем их в файл вместе с сообщением об исключении. Это сообщение всегда Cassandra timeout during write query at consistency ONE (1 replica were required but only 0 acknowledged the write)
Спорадически неудачные запросы Cassandra
Мы сделали некоторые погуглите и устранения неисправностей и сделал несколько действий:
- изменил политику повтора в приложениях ява для
DefaultRetryPolicy
вместоFallthroughRetryPolicy
, чтобы клиент повторить запрос на отказ. - Изменен параметр
write_request_timeout_in_ms
на узлах Кассандры от стандартного значения2000
до4000
, а затем до10000
.
Эти действия уменьшили количество неудачных запросов, но они все еще происходят. Из миллионов запросов, которые выполняются на почасовой основе, мы видим около 2000 неудачных запросов в течение 24 часов. Все они имеют одно и то же исключение, указанное выше, и они происходят в разное время.
Конечно, из журналов видно, что когда запросы не работают, требуется некоторое время, потому что он ждет тайм-аута и выполняет повторные попытки.
Некоторые факты:
- Бежим Cassandra v2.2.5 (недавно модернизированный от v2.2.4)
- Мы имеем гео осведомленный Cassandra кластер с 6 узлов: 3 в Европе, 3 в США.
- Приложения java, которые отправляют запросы, являются единственными клиентами, которые общаются с Cassandra (на данный момент).
- Число приложений в Java составляет 10: 5 в ЕС, 5 в США.
- Асинхронно выполняем все запросы (
session.executeAsync(statement);
) и отслеживаем, какие индивидуальные запросы, добавляя обратные вызовы для успеха и сбоя. - фактор репликации 2.
- фактор репликации 2.
- Бежим Oracle Java 1.7.0_76
Java(TM) SE Runtime Environment (build 1.7.0_76-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.76-b04, mixed mode)
- 6 Кассандры узлов работает на голом металле со следующими спецификациями:
- Хранение представляет собой группу SSD в рейде 5.
- Каждый узел имеет 2x (6 ядро) процессор Intel Xeon E5-2620 с частотой 2.00 ГГц (общее количество аппаратных потоков до 24).
- Размер оперативной памяти - 128 ГБ.
Как создать кластер:
private Cluster createCluster() {
return Cluster.builder()
.addContactPoints(contactPoints)
.withRetryPolicy(DefaultRetryPolicy.INSTANCE)
.withLoadBalancingPolicy(getLoadBalancingPolicy())
.withReconnectionPolicy(new ConstantReconnectionPolicy(reconnectInterval))
.build();
}
private LoadBalancingPolicy getLoadBalancingPolicy() {
return DCAwareRoundRobinPolicy.builder()
.withUsedHostsPerRemoteDc(allowedRemoteDcHosts) // == 3
.build();
}
Как мы создаем пространство ключей:
CREATE KEYSPACE IF NOT EXISTS traffic WITH REPLICATION = { 'class': 'NetworkTopologyStrategy', 'AMS1': 2, 'WDC1': 2};
Пример таблицы (все они выглядят одинаково)
CREATE TABLE IF NOT EXISTS traffic.per_node (
node text,
request_time timestamp,
bytes counter,
ssl_bytes counter,
hits counter,
ssl_hits counter,
PRIMARY KEY (edge, request_time)
) WITH CLUSTERING ORDER BY (request_time DESC)
AND compaction = {'class': 'DateTieredCompactionStrategy'};
Спасибо за ответ! (1) Список серверов, которые мы предоставляем, - это список локальных узлов. [Согласно документации] (https://docs.datastax.com/en/drivers/java/2.0/com/datastax/driver/core/policies/DCAwareRoundRobinPolicy.Builder.html#withLocalDc-java.lang.String-) это делает то же самое. (2) Мы обновили наш код, спасибо. (3) Согласовано. (4) Коэффициент репликации - 2. Для ясности он был добавлен к фактам. (5) Данные Cassandra хранятся на SSD в raid5. Обновлены факты. (6) Мы не дросселируем вставки. Подумаем об этом. - Нам любопытно увидеть эффект предлагаемых вами изменений! – Balthasar
Является ли группа SSD в RAID5 разделяемой 6 узлами или она является конфигом для ** каждого ** узла? – doanduyhai
Каждый узел имеет свои собственные SSD. – Balthasar