Перейти к основному содержимому

Приложение 6. Установка и настройка NATS

NATS - это совокупность продуктов с открытым кодом предоставляющий для ИТ инфраструктуры функционал:

  • по хранению данных в формате ключ:значение (key:value)
  • по хранению больших объектов (в том числе файлов)
  • по предоставлению решений для модели издатель:подписчик (pub/sub)

NATS включает в себя функционал масштабирования, позволяющий организовать распределенное хранение и гарантированную доступность данных.

Планирование

Для обеспечения отказоустойчивости необходимо построение инфраструктуры из серверов NATS на нечетном количестве узлов. Минимальное количество узлов для отказоустойчивого решения - 3.
NATS Server может работать и в режиме одного инстанса, но мы не рекомендуем такое решение для продуктовых сред.

Хранение данных в NATS может потребовать достаточно много дискогово пространства. Необходимо заранее спланировать инфраструктуру, чтобы переполнение разделов не привело к деградации остальных сервисов. Правильнее всего, выделить под nats отдельный раздел и монтировать его в /opt/nats. В этом случае переполнение никак не повлияет на работу системы.

Хранение больших объектов(файлов) включает в себя хранение метаданных, поэтому максимальный размер хранимых файлов меньше предоставленного раздела. Кроме того, файловая система используется для хранения данных ключ:значение и очередей сообщений (pub/sub).

Определение размера раздела зависимсит от действующей в Вашей компании политики глубины хранения оперативных данных (отчетов). Мы рекомендуем начинать с размера в 10 ГБ.

Типовая схема

Ниже приведена типовая схема с указанием стартовых параметров по размерам файловой системы. Реальные размеры файловой системы зависят от функционала инсталяции.

Совмещение компонентов NATS с другими компонентами системы Luxms BI возможно. Но мы рекомендуем использовать выделенные хосты для развертывания.

Установка и настройка

Установка NATS производится с помощью пакета, который мы собираем из исходного кода проекта.
Пакет содержит единый исполняемый бинарник и конфигурационные файлы, сервис, необходимый для развертывания распределенного хранилища.

Для ОС, основанных на DEB-пакетах, необходимо выполнить команды:

apt -y install nats-server

Для ОС, основаных на RPM-пакетах, необходимо выполнить команду:

dnf -y install nats-server

Проверяем, что nats-server может быть запущен:

# nats-server -v
nats-server: v2.10.22

При развертывании кластерного решения необходима дополнительная корректировка конфигурационного файла.

Настройка кластера

Конфигурационный файл, поставляемый пакетом, содержит закомментированный блок параметров cluster.
Необходимо удалить символы комментирования и указать в параметре routes правильный список серверов кластера, за исключением адреса хоста, на котором выполняется настройка:

На всех серверах необходимо отредактировать конфигурационный файл /opt/nats/nats-server.conf:

# Example config file
server_name: change_me_please
port: 4222
monitor_port: 8222

accounts: {
SYS: {
users: [
{ user: "x", pass: "y" }
]
},
FE: {
users: [ { user: "fe", pass: "fe", allowed_connection_types: ["WEBSOCKET", "STANDARD"] } ]
imports: [ { stream: {account: "BE", subject: "bi.cube.>"} } ]
},
BE: {
jetstream: {}
users: [ { user: "be" } ]
exports: [ { stream: "bi.cube.>", accounts: [FE] } ]
},
}

system_account: SYS

#cluster {
# name: nats-cluster
# port: 6222
# Routes are actively solicited and connected to from this server.
# This Docker image has none by default, but you can pass a
# flag to the nats-server docker image to create one to an existing server.
# routes = ["nats://nats-seed:6222","nats://nats-server-1:6223","nats://nats-server-2:6224"]
#}

max_payload: 16MB

jetstream: enabled
jetstream {
store_dir: /opt/nats
max_mem: 1G
}

websocket {
port: 8888
no_tls: true
no_auth_user: "fe"
}

no_auth_user: "be"

Изменяем значение параметра server_name на более осмысленное, рекомендуем использовать FQDN хоста. Обязательно, на всех хостах должно быть уникальное значение для server_name, в противном случае, кластер не запустится корректно.

осторожно

Для выполнения команд с административными привилегиями необходимо авторизованное подключение к контексту SYS. Необходимо поменять имя подключения и пароль после установки.

Настройка фильтра сетевых соединений

При использовании фаерволов необходимо обеспечить сетевую доступность между хостами с установленным NATS Server и компонентами Luxms BI.

осторожно

Пример настройки для выше-приведенной схемы может отличаться от реальной продуктовой среды.

  1. При использовании FirewallD необходимо выполнить следующие команды.
  • Для обеспечения сетевой доступности сервисов NATS, исключив команду с собственным адресом хоста.

а) На первом сервере NATS (192.168.0.10):

sudo firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.20/32 port port=6222 protocol=tcp accept'
sudo firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.30/32 port port=6222 protocol=tcp accept'
sudo firewall-cmd --runtime-to-permanent

б) На втором сервере NATS (192.168.0.20):

sudo firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.10/32 port port=6222 protocol=tcp accept'
sudo firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.30/32 port port=6222 protocol=tcp accept'
sudo firewall-cmd --runtime-to-permanent

в) На третьем сервере NATS (192.168.0.30):

sudo firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.10/32 port port=6222 protocol=tcp accept'
sudo firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.20/32 port port=6222 protocol=tcp accept'
sudo firewall-cmd --runtime-to-permanent
  • Для обеспечения доступа Java-компонентов Luxms BI

На всех серверах NATS:

sudo firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.100/32 port port=4222 protocol=tcp accept'
sudo firewall-cmd --runtime-to-permanent
  • Для обеспечения доступа Web-приложения

На всех серверах NATS:

sudo firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.300/32 port port=8888 protocol=tcp accept'
sudo firewall-cmd --runtime-to-permanent
  1. При использовании UFW необходимо выполнить следующие команды,
  • Для обеспечения сетевой доступности сервисов NATS, исключив команду с собственным адресом хоста.

а) На первом сервере NATS (192.168.0.10):

sudo ufw allow proto tcp from 192.168.0.20 to any port 6222
sudo ufw allow proto tcp from 192.168.0.30 to any port 6222

б) На втором сервере NATS (192.168.0.20):

sudo ufw allow proto tcp from 192.168.0.10 to any port 6222
sudo ufw allow proto tcp from 192.168.0.30 to any port 6222

в) На третьем сервере NATS (192.168.0.30):

sudo ufw allow proto tcp from 192.168.0.10 to any port 6222
sudo ufw allow proto tcp from 192.168.0.20 to any port 6222
  • Для обеспечения доступа Java-компонентов Luxms BI

На всех серверах NATS:

sudo ufw allow proto tcp from 192.168.0.100/32 to any port 4222
  • Для обеспечения доступа Web-приложения

На всех серверах NATS:

sudo ufw allow proto tcp from 192.168.0.300/32 to any port 8888
  1. При использовании IPTables необходимо выполнить следующие команды,
  • Для обеспечения сетевой доступности сервисов NATS, исключив команду с собственным адресом хоста.

а) На первом сервере NATS (192.168.0.10):

sudo iptables -I INPUT -p tcp -m tcp \
-s 192.168.0.20,192.168.0.30 \
--dport 6222 \
-j ACCEPT

б) На втором сервере NATS (192.168.0.20):

sudo iptables -I INPUT -p tcp -m tcp \
-s 192.168.0.10,192.168.0.30 \
--dport 6222 \
-j ACCEPT

в) На третьем сервере NATS (192.168.0.30):

sudo iptables -I INPUT -p tcp -m tcp \
-s 192.168.0.10,192.168.0.20 \
--dport 6222 \
-j ACCEPT
  • Для обеспечения доступа Java-компонентов Luxms BI

На всех серверах NATS:

sudo iptables -I INPUT -p tcp -m tcp \
-s 192.168.0.100 \
--dport 4222
-j ACCEPT
  • Для обеспечения доступа Web-приложения

На всех серверах NATS:

sudo iptables -I INPUT -p tcp -m tcp \
-s 192.168.0.300 \
--dport 8888
-j ACCEPT
осторожно

Не забываем сохранить правила с помощью iptables-save. В зависимости от системы и ее версии, варианты использования последней различаются. Подробнее читайте в документации к операционной системе.

Запуск сервисов

Для активации автоматического запуска NATS сервера после установки и корректировки конфигурационного файла необходимо выполнить команду:

systemctl enable nats-server --now

Проверка работоспособности кластера

После запуска сервера можно проверить его работоспособность в журнале сервиса, мы должны увидеть примерно следующее:

# journalctl -u nats-server

Cluster name is test-nats
Listening for route connections on 0.0.0.0:6222
192.168.0.20:6222 - rid:4 - Route connection created

Для проверки работоспособности функционала pub/sub можно на одном сервере запустить подписку из командной строки:

nats sub -s 127.0.0.1 "test-subject"

А на другом сервере отправить сообщение:

nats pub -s 127.0.0.1 "test-subject" "Test message"

В итоге, сообщение должно быть получено на первом сервере.

Встроенный мониторинг

Для включения мониторинга в кофигурационном файле необходимо снять комментарий с параметра monitor_port и перезапустить сервис.

По адресу http://(адрес сервера nats):8222 можно получить список метрик в формате json. Также данные метрики могут быть переданы в Prometheus с помощью экспортера prometheus-nats-exporter и визуализированы с помощью Grafana.

Подробнее настройка мониторинга изложена в официальной документации продукта:

Полезные команды

Для получения информации по статусу и состоянию сервера NATS можно использовать CLI-интерфейс, выполнив следующие команды

Server Info

# nats --user=x --password=y server info
Server information for NDD2QZ3ERNLOVTRH2KA7OFM5Y46NX4EHHTNWD2PUALOOQ4TPOQWO4WU3

Process Details:

Version: 2.9.11
Git Commit:
Go Version: go1.19.4
Start Time: 2023-04-13 11:52:41.605030061 +0000 UTC
Uptime: 13d20h28m53s

Connection Details:

Auth Required: true
TLS Required: false
Host: 0.0.0.0:4222
Client URLs:

JetStream:

Domain:
Storage Directory: /tmp/jetstream
Max Memory: 954 MiB
Max File: 63 GiB
Active Acconts: 1
Memory In Use: 0 B
File In Use: 29 MiB
API Requests: 2,636
API Errors: 40

Limits:

Max Conn: 65536
Max Subs: 0
Max Payload: 1.0 MiB
TLS Timeout: 2s
Write Deadline: 10s

Statistics:

CPU Cores: 4 0.00%
Memory: 26 MiB
Connections: 3
Subscriptions: 177
Msgs: 58,403,928 in 114,840,129 out
Bytes: 26 GiB in 52 GiB out
Slow Consumers: 1

Server Ping

Для проверки доступности и работоспособности сервера:

# nats --user=x --password=y server ping
NDD2QZ3ERNLOVTRH2KA7OFM5Y46NX4EHHTNWD2PUALOOQ4TPOQWO4WU3 rtt=752.387µs

---- ping statistics ----
1 replies max: 0.00 min: 0.00 avg: 0.00