Gobetween Exec discovery+ Elasticsearch. L4 балансування з Node Data Discovery

Навіщо все це потрібно
Всі, хто використовував Elasticsearch каластер для своїх потреб (особливо для логування та як основну базу даних) на великих навантаженнях стикався з проблемами консистентности і масштабованості. Коли потрібно розпаралелити навантаження на Elasticsearch зазвичай застосовувалися статичні рішення то типу NGINX+Elasticsearch. Це дозволяє розпаралелювати навантаження, але виглядає не дуже гнучко. Особливо якщо врахувати що ноди можуть самі випадати з кластера і простий хелсчек покаже що все добре, а насправді нода перевантажена, виключена з кластера. У будь-якому випадку хотілося б мати дані про стан кластера з перших рук, а не задовольнятися простими перевірками.
Отже, приступимо до побудови балансування .
Як ми будемо це робити
В даному випадку ми будемо використовувати CAT node API, яке є частиною мощьнейшего CAT API, який є інструментом пошуку заголовків за Elasticsearch клстреру.
Ми будемо використовувати тільки Gobetween і вбудовані механізми Elasticsearch для балансування запису /читання СRUD (DATA) нсд при довільній кількості/статус нсд в кластері.
image
Попередні налаштування
Нам буде потрібно:

Elasticsearch client node :

Потрібна спеціально для gobetween т. к. при мультимастер конфігурації вона сама буде перенаправляти запит на правильну майстер ноду(активний майстер), і таким чином буде нашим роутером всередині кластера для коректної роботи нашого Node Data 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
ітд...

Тепер все готово, і можна починати налаштовувати безпосередньо сам балансер.
Налаштування балансувальника
Після налаштування настав час настроїти балансування використовуючи EXEC discovery 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 оточень.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.