Организация кластера


(Alexey) #1

Добрый день.
Хотел бы посоветоваться по вопросу организации кластера. Есть кластер состоящий из двух нод (два отдельных сервера: 24 и 32 GB соответственно):

ip        heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
10.8.0.1            29          99  66    6.21    5.99     4.86 mdi       *      kia
10.8.0.18            3          80  65   14.56   13.18    10.21 mi        -      ford

kia используется для запросов от backend (api app на этом же сервере), на ford работают воркеры (celery), которые и создают нагрузку (работа с datafeed и отдельные update/insert в индекс на ford). До вчерашнего дня ford использовался также для хранения данных (node.data: true)
И вот имеем ситуацию: запускаем задачи на ford, там возрастает LA, кластер, видимо за счет подтормаживающей ноды (ford, которая была data), начинает вцелом тормозить, имеем ситуацию на Рис.1 (я правильно понимаю?)

Сегодня я убрал хранение данных на ford, надеясь что запросы за данными не будут ходить на ford. Но, все равно имею падение производительности на kia.

Цель: как бы вот оптимально организовать систему, пока в ней участвует два сервера (хотелось бы пока остановиться на этом количестве :slight_smile:) Но не хотелось бы чтобы kia упиралась и как то зависела от LA ford (впоследствии количество серверов с воркерами будет увеличиваться) . Хочется чтобы сервера жили своими жизнями, но имели синхронизацию по данным.

Может можно как то отсрочить транслог между нодами или уменьшить его скорость (быстрота синхронизации между нодами на данный момент не актуальная величина)?


(Igor Motov) #2

Может можно как то отсрочить транслог между нодами или уменьшить его скорость (быстрота синхронизации между нодами на данный момент не актуальная величина)?

В elasticsearch репликация между шардами происходить на уровне документа (то есть нагрузка на праймари и копиях от индексации одна и та же). Этого избежать нельзя. Ассинхронную репликацию на старых версиях включить можно, но я бы не рекомендовал это делать. Толку от этого очень мало, а вреда - много.

Кроме того, что если вы подключаетесь к ford, то все запросы будут автоматически балансироваться между всеми нодами, на которых есть шарды (если вы не задали preference). То есть при установках по умолчанию у вас нагрузка должна быть одинакова на всех машинах.


(Alexey) #3

Получается что правильным выходом будет:

  1. изоляция воркеров на отдельную машину

  2. update/insert через bulk (для снижения нагрузки на все ноды кластера от запросов на индексацию)

  3. ford и kia сделать node.role: mdi и использовать как клиенты для чтения со стороны api и записи со стороны workers?

    es = Elasticsearch([{'host': 'kia'}, {'host': 'ford'}])


(Igor Motov) #4

Да, правильным выходом будет не перегружать elasticsearch сервер, и не смешивать elasticsearch с другими тяжелыми приложениями на одной и той же машине.


(Alexey) #5

Игорь, параллельно еще задам вопрос в этой теме, у меня реализован поиск по синонимам через фильтры

"filter": {
   "my_filter": {
      "type": "synonym",
      "synonyms_path" : "analysis/file.synonym.txt"
   }
}

Как я понимаю при добавлении записей в файл я должен перегрузить все ноды чтобы подцепить изменения? А если я хочу использовать иной источник данных? Например хранить в базе (редактирование клиентом в UI). Эти правила веть не должны быть определены на момент индексации данных, а могут появляться в процессе жизни индекса?


(Igor Motov) #6

Лучше задавать новые вопросы в новых темах, тем более, что это бесплатно :slight_smile:

Если этот фильтр используется в анализаторе для индексирования - то надо пере-индексировать все данные при каждом обновлении списка синонимов. Если он только используется при поиске то можно закрыть и открыть индекс.


(Alexey) #7

Про новые вопросы, учту :slight_smile:

Спасибо


(system) #8

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.