Приложение 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.
Пример настройки для выше-приведенной схемы может отличаться от реальной продуктовой среды.
- При использовании 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
- При использовании 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
- При использовании 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