Кластер ArangoDB 3.0 — нулевое улучшение скорости чтения/записи?

У меня есть кластер ArangoDB 3.0, настроенный через DC/OS 1.7, как показано здесь:

Кластер ArangoDB 3.0 через DC/OS 1.7

Я попробовал два запроса на этой настройке сервера 3x co-ord, 6x. Каждый узел имеет следующие характеристики:

  • 15 ГБ ОЗУ (4 ГБ назначается на основную базу данных через DC/OS)
  • 8 ядер
  • CoreOS

Я попробовал два запроса для проверки производительности по отношению к коллекции coins. Индексы не добавлялись. Конфиг коллекции такой:

Wait for sync:  false
Type:   document
Status: loaded
Shards: 16
Replication factor: 1
Index buckets:  8

Написать:

FOR i IN 1..1000000 INSERT {flip:RAND() > 0.5 ? 'h' : 't'} IN coins

Результат:

Выполнено за 13,894 секунды

План выполнения:

 Id   NodeType            Site          Est.   Comment
  1   SingletonNode       COOR             1   * ROOT
  2   CalculationNode     COOR             1     - LET #2 = 1 .. 1000000   /* range */   /* simple expression */
  3   EnumerateListNode   COOR       1000000     - FOR i IN #2   /* list iteration */
  4   CalculationNode     COOR       1000000       - LET #4 = { "flip" : ((RAND() > 0.5) ? "h" : "t") }   /* v8 expression */
  6   DistributeNode      COOR       1000000       - DISTRIBUTE
  7   RemoteNode          DBS        1000000       - REMOTE
  5   InsertNode          DBS              0       - INSERT #4 IN coins
  8   RemoteNode          COOR             0       - REMOTE
  9   GatherNode          COOR             0       - GATHER

Indexes used:
 none

Optimization rules applied:
 Id   RuleName
  1   remove-data-modification-out-variables
  2   distribute-in-cluster

Write query options:
 Option                   Value
 ignoreErrors             false
 waitForSync              false
 nullMeansRemove          false
 mergeObjects             true
 ignoreDocumentNotFound   false
 readCompleteInput        false

Читать:

FOR coin IN coins COLLECT flip = coin.flip WITH COUNT INTO total RETURN {flip, total}

Результат:

Выполнено за 1,157 секунды

План выполнения:

 Id   NodeType                  Site          Est.   Comment
  1   SingletonNode             DBS              1   * ROOT
  2   EnumerateCollectionNode   DBS        1000000     - FOR coin IN coins   /* full collection scan */
  3   CalculationNode           DBS        1000000       - LET #3 = coin.`flip`   /* attribute expression */   /* collections used: coin : coins */
 10   RemoteNode                COOR       1000000       - REMOTE
 11   GatherNode                COOR       1000000       - GATHER
  4   CollectNode               COOR        800000       - COLLECT flip = #3 WITH COUNT INTO total   /* hash*/
  7   SortNode                  COOR        800000       - SORT flip ASC
  5   CalculationNode           COOR        800000       - LET #5 = { "flip" : flip, "total" : total }   /* simple expression */
  6   ReturnNode                COOR        800000       - RETURN #5

Indexes used:
 none

Optimization rules applied:
 Id   RuleName
  1   move-calculations-up
  2   move-calculations-down
  3   scatter-in-cluster
  4   distribute-filtercalc-to-cluster
  5   remove-unnecessary-remote-scatter

Затем я уменьшил масштаб до 1x координатора и 1x сервера, уменьшив доступную оперативную память с 90 ГБ / 48 ядер до 15 ГБ / 8 ядер.

Я ожидал, что запись и чтение покажут некоторую разницу. Вот результаты тех же запросов (после усечения коллекции и повторного запуска):

Написать:

Выполнено за 13,763 секунды

Читать:

Выполнено за 1,127 секунды

Результат – почти одинаковое время выполнения.

Вопросы:

  • Я пропустил какой-то шаг: явная репликация? (Я попытался «перебалансировать осколки», что привело к тому, что некоторые дополнительные серверы БД были помечены как последователи, но не повлияло на скорость выполнения)

  • Является ли конфигурация моей коллекции оптимальной? Я выбрал 16 осколков, основываясь на рекомендации «DBPrimary Squared» в документации (в моей исходной настройке использовались 4-кратные серверы и наблюдалась эквивалентная производительность).

  • Могут ли запросы, которые я пробовал, эффективно кластеризоваться? Диапазонные петли и т. д.

  • Есть ли образцы запросов, которые я могу попробовать, чтобы проверить, правильно ли настроен кластер, и должны ли они окончательно доказать разницу в производительности чтения/записи между узлами 1x и узлами n?


person Lee Benson    schedule 28.06.2016    source источник


Ответы (1)


Я думаю, что могу пролить свет на эти вопросы (будучи одним из основных разработчиков ArangoDB и ответственным за распределенный режим). В следующих комментариях рассматривается ArangoDB версии 3.0.

В одном запросе AQL в версии 3.0 и более ранних используется только один координатор. Следовательно, развертывание дополнительных координаторов не ускоряет выполнение отдельного запроса, будь то запрос на запись или чтение.

Это очень сложно изменить, потому что AQL организует конвейер данных в кластере, и трудно привлечь более одного координатора.

Если вы пишете запросы, в настоящее время у нас все еще есть эксклюзивная блокировка записи для задействованных коллекций в версии 3.0. Таким образом, большее количество сегментов или серверов БД не помогает увеличить производительность запросов записи AQL. Мы поработаем над этим ограничением для версии 3.1, но это тоже не так просто.

Дополнительные серверы БД и координаторы увеличат скорость чтения и записи отдельных документов (без использования AQL), ​​как показано в этот пост в блоге. Таким образом, ваш запрос на запись, вероятно, можно будет выполнить намного быстрее, используя стандартный API документов с новыми пакетными расширениями.

При чтении запросов AQL вы, как правило, увидите ускорение, если используете больше серверов, если запрос можно распараллелить между осколками или если вы измерите пропускную способность многих таких запросов.

Для вашего конкретного запроса на чтение с агрегацией нам не хватает правила оптимизатора запросов AQL с сопутствующей инфраструктурой, которое может перемещать агрегации в отдельные сегменты, а затем объединять результаты. Это запланировано, но еще не реализовано в версии 3.0, поэтому вы не видите ускорения в своем запросе на чтение. Выходные данные объяснения показывают, что COLLECT с его SORT выполняется на координаторе, и поэтому все данные должны быть перемещены через единственный координатор.

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

Мы сможем обойти это ограничение, когда у нас будут надлежащие транзакции в масштабе кластера, что также запланировано, но не реализовано в версии 3.0.

person Max Neunhöffer    schedule 29.06.2016