- PVSM.RU - https://www.pvsm.ru -
Все кто использовал Elasticsearch каластер для своих нужд (особенно для логирования и как основную базу данных) на больших нагрузках сталкивался с проблемами консистентности и масштабируемости. Когда требуется распараллелить нагрузку на Elasticsearch обычно применялись статические решения то типу NGINX+Elasticsearch [1]. Это позволяет распараллелить нагрузку, но выглядит не слишком гибко. Особенно если учесть что ноды могут сами выпадать из кластера и простой хелсчек покажет что все отлично, а на самом деле нода перегружена, исключена из кластера. В любом случае хотелось бы иметь данные о состоянии кластера из первых рук, а не довольствоваться простыми проверками.
Итак, приступим к построению балансировки .
В данном случае мы будем использовать CAT node API [2], которое является частъю мощьнейшего CAT API [3], который является инструментом поиска заголовков по Elasticsearch клстреру.
Мы будем использовать только Gobetween [4] и встроенные механизмы Elasticsearch для балансировки записи /чтения СRUD [5] (DATA) нод при произвольном количестве/статусе нод в кластере.
Нам потребуются:
Нужна специально для gobetween т.к. при мультимастер конфигурации она сама будет перенаправлять запрос на правильную мастер ноду(активный мастер), и таким образом будет нашим роутером внутри кластера для корректной работы нашего Data Node discovery.
В elasticsearch.conf на client ноде прописываем:
node.master: false
node.data: false
и остальные настройки идентичные настройкам нод в вашем кластере.
Теперь создадим скрипт который будет запрашивать API и возвращать нам список нод.
назовем его discovery_elasticsearch.sh :
#!/bin/bash
curl -sS -XGET 'http://PI_OF_YOUR_CLIENT_NODE:9200/_cat/nodes?v&h=ip,r=d' |sed '1d'|tr -d ' '|sed 's/$/:9200/'
вывод скрипта будет примерно таким :
10.0.0.51:9200
10.0.0.55:9200
10.0.0.53:9200
10.0.0.52:9200
10.0.0.54:9200
итд...
Теперь все готово, и можно начинать настраивать непосредственно сам балансер.
После установки [6] настало время настроить балансировку используя EXEC discovery [7] и round robin алгоритм балансировки.
Данный пример довольно простой и служит для описания возможностей данного типа балансировки. Можно расширить скрипт для динамической генерации весов для каждой ноды по их загрузке (cpu,io и т.д.).
конфиг нашего балансера будет выглядеть :
[logging]
level = "warn" # "debug" | "info" | "warn" | "error"
output = "stdout" # "stdout" | "stderr" | "/path/to/gobetween.log"
[defaults]
max_connections = 0
client_idle_timeout = "0"
backend_idle_timeout = "0"
backend_connection_timeout = "0"
[servers.sample3]
bind = "100.100.1.5:9200"
protocol = "tcp"
balance = "weight"
[servers.sample3.discovery]
kind = "exec"
exec_command = ["/etc/gobetween/discovery_elasticsearch.sh"]
interval="1m"
timeout = "10s"
[servers.sample3.healthcheck]
kind = "ping"
interval = "20s"
timeout = "2s"
fails = 3
passes = 3
Итак, мы имеем "рыбу" решения для построения гибкой балансировки в elasticsearch кластере.
В "боевых" условиях у нас работет более сложная конфигурация с динамическим определением весов.
Так же в нашем продакшне мы используем сложный скрипт хелсчека тоже завязанного на API мониторинга и самого Elasticsearch.
В Следующих статьях — json discovery, windocker service discovery и балансировка, Windows swarm service discovery и балансировка, Балансировка (Windows+linux) Doсker окружений.
Автор: nickdoikov
Источник [14]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/143339
Ссылки в тексте:
[1] NGINX+Elasticsearch: https://www.nginx.com/blog/nginx-elasticsearch-better-together/
[2] CAT node API: https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-nodes.html
[3] CAT API: https://www.elastic.co/guide/en/elasticsearch/reference/current/cat.html
[4] Gobetween: https://gobetween.io
[5] СRUD: https://en.wikipedia.org/wiki/Create,_read,_update_and_delete
[6] установки: https://github.com/yyyar/gobetween/wiki/Installation
[7] EXEC discovery: https://github.com/yyyar/gobetween/wiki/Discovery#exec
[8] первая обзорная статъя: https://habrahabr.ru/post/303428/
[9] DRAFT Rest API: https://github.com/yyyar/gobetween/wiki/REST-API
[10] Проект на Github: https://github.com/yyyar/gobetween
[11] Вики на Github: https://github.com/yyyar/gobetween/wiki
[12] тесты производительности: https://github.com/yyyar/gobetween/wiki/Performance-tests-results
[13] Установка под Windows: https://github.com/yyyar/gobetween/wiki/3.3-Windows-specific-notes
[14] Источник: https://habrahabr.ru/post/304096/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.