2016-02-18 2 views
0

У нас возникают проблемы с запущенными 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'}; 

ответ

2

Многие ковчеги:

  1. первым для Cluster конфигурации, вы должны указать имя локального DC
  2. вы должны использовать local_one вместо ONE для уровня согласованности для повышения ДАТы, нас.пункту
  3. НЕ изменений значение write_request_timeout_in_ms. Вы просто подметаете проблемы под ковром, ваша реальная проблема не в настройке таймаута
  4. Ваш Фактор репликации?
  5. Every minute the java applications fires thousands of queries (can be 20k or even 50k queries) -> простые математические данные дают мне ~ 300 вставок/сек на узел с предположением, что RF = 1. Это не так много, но ваши вставки могут быть ограничены аппаратными средствами. Какова конфигурация вашего процессора (количество ядер) и тип диска (вращающийся диск или SSD)?
  6. Вы дросселируете асинхронные вставки? Например. стреляйте в пакет из N вставок и немного подождите, пока кластер не начнет дышать. См. Мой ответ здесь для дросселирования: What is the best way to get backpressure for Cassandra Writes?
+0

Спасибо за ответ! (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

+0

Является ли группа SSD в RAID5 разделяемой 6 узлами или она является конфигом для ** каждого ** узла? – doanduyhai

+0

Каждый узел имеет свои собственные SSD. – Balthasar

Смежные вопросы