Оптимальные сегменты индекса Elasticsearch с высокими показателями чтения и очень низкими данными

Я следую документации AWS. для «Выбор количества сегментов» для индекса Elasticsearch.
Мои показатели TPS при чтении для индекса ES будут очень высокими (около 1300 TPS и могут увеличиться до 6500 TPS), но объем данных, которые будут присутствовать, будет очень меньше (менее ГБ).

  1. Чтобы соответствовать высоким показателям чтения, я планирую реализовать горизонтальное масштабирование (увеличить количество узлов данных).
  2. Из-за очень меньшего количества данных, согласно приведенной выше документации, количество осколков должно быть 1 (оптимальный желаемый размер осколка ~ 10–50 ГБ, а мои данные - менее 1 ГБ)

Вопросы:

  1. Насколько я понимаю, один шард не распределяется по узлам данных. (Один осколок может находиться только на одном узле данных). Правильно ли это понимание?
  2. From here, In Elasticsearch, each query is executed in a single thread per shard. Multiple shards can however be processed in parallel, as can multiple queries and aggregations against the same shard.. If the above understanding is correct, all the requests will be single threaded on a single data node, if I only have one shard. The horizontal scaling thus cannot be implemented.
    What should be the optimal number of primary shards/replicas for an index given the high TPS and low data?
    Should I
    1. still have a single shard, but multiple replicas (proportional to the number of hosts), or
    2. несколько первичных шардов (размер которых будет в МБ), и одна реплика (для экономии памяти). (Я не вижу, чтобы узлы в моем кластере так сильно выходили из строя, что мне НУЖНО больше одной реплики!)

person Kulkarni    schedule 07.04.2020    source источник
comment
Эй, не могли бы вы прочитать мой ответ и дайте мне знать, если у вас есть дополнительные комментарии?   -  person user156327    schedule 23.04.2020


Ответы (2)


  1. Да вы правы. При настройке сопоставления вы можете указать количество шардов (первичных) и реплик (копий). Осколки-реплики - это в основном клоны ваших первичных осколков, которые нужны для обеспечения отказоустойчивости, но также улучшают производительность чтения (они могут обслуживать операции чтения). Однако они могут нанести ущерб производительности записи, поскольку эластичный должен реплицировать данные между узлами, чтобы поддерживать их в актуальном состоянии. В зависимости от количества узлов вы можете выбрать количество первичных и реплицированных шардов с учетом устойчивости (что произойдет, если узел выйдет из строя)
  2. Да, если у вас есть один осколок без реплик, согласно документации, это будет один поток. Это не обязательно плохо или хорошо. Имейте в виду, что в случае одного запроса этот запрос обслуживается несколькими потоками (несколько сегментов, содержащих части данных), в конце концов, эти записи необходимо накапливать, чтобы их можно было обслужить клиенту. Это может повредить производительности. Более того, даже если у вас есть реплики, если у вас есть только один первичный осколок, это означает, что все данные вашего индекса находятся в осколке (первичном или реплике). Это означает, что разные запросы могут обслуживаться любым шардом (таким образом, любым потоком), но каждый запрос будет обслуживаться одним потоком (не должно происходить накопления, что для МБ данных неплохо)

Поскольку размер данных невелик и вам нужна очень высокая пропускная способность, я бы предпочел иметь 1 первичный и столько реплик, сколько количество узлов - 1 (который будет содержать первичный). Теперь количество узлов зависит. Вам нужно будет протестировать, но вы можете использовать 3 узла (что является обычной устойчивой / производительной первой настройкой). Итак, всего 1 первичный и 2 реплики. Проверьте эту настройку и попробуйте провести стресс-тестирование.

Для стресс-теста вы можете использовать rally, который является фреймворком, который elasticsearch использует при тестировании новых выпусков.

person Alkis Kalogeris    schedule 07.04.2020

Это интересный сценарий, и да, большая часть предоставленной информации неплохая, просто хочу добавить следующие моменты:

  1. Поскольку размер данных очень мал, наличие нескольких основных сегментов фактически приведет к снижению производительности из-за создания нескольких потоков для запроса нескольких сегментов и сбора результатов со всех сегментов.
  2. Теперь, поскольку для оптимальной производительности нам нужен только 1 первичный осколок, а реплика для первичного осколка не может быть выделена на том же физическом узле данных, вам необходимо иметь другие узлы в ваших кластерах для обеспечения высокой доступности и повышения производительности чтения (реплики помогают в обоих случаях).
  3. Теперь, что касается одного поискового запроса, он должен будет запросить только один сегмент (первичный или реплику), поэтому Elasticsearch просто создаст один поток.
  4. Для лучшего использования и экономии средств убедитесь, что у вас есть небольшие узлы данных с меньшим количеством ядер ЦП. В этом случае целесообразно использовать двухъядерный компьютер (но вы можете это проверить).
  5. Хорошо, что вы используете AWS Elasticsearch, поэтому вы можете быстро изменить количество реплик и развернуть узлы данных меньшего размера (как объяснено выше), когда вы читаете трафик, и даже можете изменить количество ядер, поэтому лучше автоматическое масштабирование вариант, который вы получаете, основываясь на некотором производственном трафике, и можете настроить его в дальнейшем.
  6. вы также можете изменять количество реплик динамически с помощью обновите API настройки индекса, но не забудьте добавить больше узлов данных, когда вы это делаете, если у существующих узлов данных загрузка ЦП высока.
person user156327    schedule 18.04.2020
comment
@Nag, вам нужно найти правильный баланс, в этом примере количество документов было меньше и могло легко поместиться в 1 осколок, поэтому нет смысла делить данные на 5 осколков. если количество первичных осколков больше, то elasticsearch должен искать данные во всех осколках и представлять, что все они находятся на другом компьютере, поэтому больше потоков и больше н / б переходов для одного запроса, поэтому это будет дорого. Это точная причина, по которой Elastic изменил первичные шарды по умолчанию с 5 на 1. Если у вас больше данных, вы всегда можете создать больше шардов и масштабировать их на несколько физических узлов. - person user156327; 29.04.2020
comment
хм, основная идея иметь больше шардов заключалась в увеличении параллелизма и масштабируемости. Но тогда это становится узким местом для небольших данных :-(. Действительно хороший пример, чтобы сделать упражнение с кластером перед запуском в производство - person Nag; 29.04.2020
comment
@Nag, да, вы всегда должны понимать свою производственную рабочую нагрузку и точно настраивать эти параметры, а также предоставили ответ на ваш другой вопрос в аналогичной ветке :) - person user156327; 30.04.2020