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

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

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

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

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

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

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

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

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

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

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

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

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

nats-cluster-01.jpg

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

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

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

apt -y install nats-server

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

dnf -y install nats-server

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

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

При установке единственного экземпляра NATS Server-а дополнительной настройки конфигурации не требуется. Сервис работоспособен сразу после его запуска.

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

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

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

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

# Example config file

server_name: host1.local
port: 4222
#monitor_port: 8222

accounts: {
SYS: {
users: [
{ user: "x", pass: "y" }
]
},
}

system_account: SYS

#cluster {
# name: nats-cluster
# port: 6222
# Routes are actively solicited and connected to from this server.
# routes: [
# nats-route://host2.local:6222
# nats-route://host3.local:6222
# ]
#}

max_payload: 16MB

jetstream: enabled

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

Изменяем значение параметра 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 --add-rich-rule='rule family=ipv4 source address=192.168.0.200/32 port port=4222 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
sudo ufw allow proto tcp from 192.168.0.200/32 to any port 4222
  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,192.168.0.200 \
--dport 4222
-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