Настройка балансировки запросов к ClickHouse и PostgreSQL
При установке системы на этапах настройки ClickHouse и PostgreSQL можно указать по одному адресу узла из их кластеров. По умолчанию на указанные узлы будут отправляться все запросы от системы к СУБД, и поэтому данные узлы могут стать точками отказа.
Для обеспечения равномерной нагрузки на узлы кластеров СУБД рекомендуется настроить балансировку запросов. Можно использовать следующие методы балансировки:
|
Если вы установили PostgreSQL на одном сервере, действия, связанные с балансировкой запросов к PostgreSQL, выполнять не нужно. |
Независимая балансировка запросов к ClickHouse и PostgreSQL
Данный метод обеспечивает балансировку запросов следующим образом:
-
Для ClickHouse балансировка запросов осуществляется на уровне DNS-сервера по алгоритму Round-robin DNS: одно доменное имя (A-запись) сопоставляется с IP-адресами всех узлов кластера ClickHouse, и на каждый запрос к этому доменному имени возвращается IP-адрес нового узла.
-
Для PostgreSQL балансировка осуществляется с помощью сервиса keepalived по протоколу VRRP.
Преимущества:
-
Выделенные узлы балансировщика не требуются.
-
Для Round-robin DNS — простая настройка и минимальные расходы вычислительных ресурсов на балансировку.
Недостатки:
-
При использовании метода Round-robin DNS нагрузка и доступность узлов кластера ClickHouse не отслеживаются: если узел окажется перегружен или недоступен, часть запросов к ClickHouse по-прежнему будет направляться к нему.
-
Сервис keepalived разворачивается на узлах кластера PostgreSQL и создает дополнительную нагрузку на них.
Балансировка запросов к ClickHouse
Алгоритм Round-robin DNS позволяет производить циклическую ротацию адресов, возвращаемых сервером в ответ на запросы DNS Lookup. В контексте R-Vision SIEM это означает, что каждый последующий запрос системы к ClickHouse будет обрабатываться разными узлами кластера ClickHouse. В случае недоступности узла, указанного во время установки системы, запросы будут обработаны другими узлами кластера.
| В данном разделе приведена инструкция по настройке Round-robin DNS для DNS-сервера на базе Windows Server. Для выполнения настройки на другом DNS-сервере обратитесь к официальной документации его производителя. |
Чтобы настроить Round-robin DNS, выполните следующие действия на DNS-сервере вашей организации:
-
Включите алгоритм Round-robin DNS:
-
Откройте оснастку Диспетчер DNS, выполнив следующую команду:
dnsmgmt.msc -
Откройте окно свойств DNS-сервера.
-
Перейдите на вкладку Дополнительно.
-
Установите флажок Включить циклическое обслуживание.
-
-
В оснастке Диспетчер DNS добавьте доменное имя кластера ClickHouse.
Выбранное доменное имя кластера ClickHouse потребуется указать в качестве имени хоста на этапе ClickHouse setup установки системы. -
Для вышеуказанного доменного имени добавьте A-записи для каждого узла кластера ClickHouse. Каждая из записей должна содержать IP-адрес определенного узла.
Пример настройки A-записей для кластера ClickHouse с тремя узлами Имя Тип Данные clickhouse-cluster.example.local
Host (A)
192.168.0.1
clickhouse-cluster.example.local
Host (A)
192.168.0.2
clickhouse-cluster.example.local
Host (A)
192.168.0.3
-
Чтобы каждый запрос к ClickHouse гарантированно обращался к новому узлу кластера, а не использовал IP-адрес из кэша DNS, отключите кэширование результатов DNS-запросов для созданных A-записей:
-
В оснастке DNS-сервер включите режим Вид → Расширенный.
-
В свойствах каждой из созданных A-записей установите свойство Срок жизни (TTL) записи равным нулю.
-
Балансировка запросов к PostgreSQL
| Действия, описанные в этом разделе, необходимо выполнять, только если СУБД PostgreSQL установлена в выделенном кластере. |
| Для работы протокола VRRP нужны определенные сетевые условия: все узлы кластера PostgreSQL должны находиться в одном L2-сегменте (multicast). |
Чтобы настроить балансировку запросов к узлам кластера PostgreSQL, выполните следующие действия на каждом узле кластера:
-
Установите пакет keepalived:
-
РЕД ОС
-
Debian
dnf install keepalivedapt-get install -y keepalived -
-
В терминале создайте переменные окружения, значения которых будут использованы в конфигурационном файле VRRP:
VRRP_ADDRESS="<virtual_ip>" VRRP_NETMASK="<virtual_netmask>" VRRP_ROUTER_ID="<virtual_router_id>" ETH_INTERFACE="<vrrp_interface>" VRRP_AUTH_PASS="<auth_pass>"Здесь:
-
<virtual_ip>— выделенный IP-адрес, который будет привязан к сетевому интерфейсу на сервере, являющемся лидером VRRP, например,10.99.57.50. -
<virtual_netmask>— маска подсети для VRRP-адреса, например,24. -
<virtual_router_id>— индивидуальный идентификатор группы VRRP внутри L2-сегмента сети. Целое положительное число, например,50. -
<vrrp_interface>— имя интерфейса, к которому будет привязан VRRP-адрес. По умолчанию —ens192. -
<auth_pass>— пароль для аутентификации в VRRP-сети.
-
-
Создайте конфигурационный файл VRRP, выполнив команду ниже.
Перед выполнением команды необходимо заменить шаблоны в угловых скобках ( <>) на значения параметров, актуальные для вашего кластера.echo -e """global_defs { router_id <postgres_node_name> } vrrp_script track_pgmaster { script \"/usr/local/bin/chk_master.sh\" interval 5 rise 3 fall 3 weight -25 } vrrp_instance ${VRRP_ADDRESS} { state BACKUP interface ${ETH_INTERFACE} virtual_router_id ${VRRP_ROUTER_ID:?} priority 100 preempt advert_int 1 authentication { auth_type PASS auth_pass ${VRRP_AUTH_PASS} } virtual_ipaddress { ${VRRP_ADDRESS:?}/${VRRP_NETMASK:?} dev ${ETH_INTERFACE:?} } track_script { track_pgmaster } } """ > /etc/keepalived/keepalived.confЗдесь:
-
<postgres_node_name>— имя узла кластера PostgreSQL, например,postgres1.
-
-
Создайте скрипт для отслеживания текущего лидера Patroni:
echo '''#!/bin/bash [ $(curl -s -X OPTIONS -o /dev/null --max-time 1 -w '%{http_code}' http://localhost:8008/master) -eq 200 ] ''' > /usr/local/bin/chk_master.sh chmod +x /usr/local/bin/chk_master.sh -
Проверьте конфигурацию сервиса keepalived, выполнив следующую команду:
keepalived -t -
Запустите сервис keepalived:
systemctl enable --now keepalived
Предварительно настроенный балансировщик нагрузки
Если в вашей инфраструктуре есть выделенный балансировщик, который вы планируете использовать для распределения нагрузки в кластерах СУБД, настройте на нем балансировку трафика по следующим правилам:
-
Для ClickHouse — по портам для взаимодействия системы и ClickHouse (по умолчанию 9100, 8123 и 8443).
-
Для PostgreSQL:
-
Трафик по порту 5432 должен направляться на порт 5432 master-узла Patroni.
-
Трафик по порту 5433 должен направляться на порт 5432 replica-узла Patroni.
Чтобы проверить, является ли узел кластера PostgreSQL master-узлом или replica-узлом в кластере Patroni, можно выполнить в его терминале следующие команды:
curl -s -o /dev/null -w "%{http_code}" localhost:8008/master curl -s -o /dev/null -w "%{http_code}" localhost:8008/replicaЕсли первая команда вернет ответ
200, то узел является master-узлом, иначе — replica-узлом. -
Настройку следует производить согласно документации производителя балансировщика.
Преимущество: дополнительные узлы балансировщика не требуются.
Недостаток: настройку выделенного балансировщика необходимо производить самостоятельно.
Один сервер HAProxy
Балансировка с помощью выделенного сервера HAProxy обладает следующими свойствами:
Преимущества:
-
Балансировка выполняется для кластеров ClickHouse и PostgreSQL одновременно.
-
Реализован алгоритм проверки состояния узлов (healthcheck).
-
При балансировке запросов учитывается нагрузка на узлы.
Недостатки:
-
Узел, на котором расположен единственный балансировщик, может стать точкой отказа.
-
Для балансировщика требуется выделенный сервер.
Чтобы настроить балансировку запросов с помощью выделенного сервера HAProxy, выполните следующие действия:
-
Перейдите в директорию с файлами распакованного архива
clickhouse-cluster.tar.gz. -
Откройте файл
inventory/hosts.iniи дополните его содержимое.В файле
inventory/hosts.iniдолжны быть заполнены разделы[clickhouse],[clickhouse_keeper],[clickhouse_shard<shard_id>].Пример содержимого файла
inventory/hosts.iniприведен в разделе документации Настройка нового кластера ClickHouse.-
В раздел
[balancer]добавьте FQDN узла, на котором будет расположен сервер балансировщика. -
Если СУБД PostgreSQL установлена в выделенном кластере, в раздел
[patroni]добавьте FQDN узлов кластера PostgreSQL.
Пример конфигурации балансировщика в файлеinventory/hosts.ini[balancer] balancer.my.lan [patroni] postgres1.my.lan postgres2.my.lan -
-
Если при настройке кластера ClickHouse было включено шифрование трафика между системой и кластером (в файле
clickhouse.ymlуказан параметрdcc_clickhouse_ssl_enabled: true), необходимо настроить TLS-сертификат для узла балансировщика.По умолчанию роль
generate_certificates, встроенная в плейбук, производит генерацию самоподписанного сертификата. Генерируемый сертификат и ключ сохраняются в директории<clickhouse_playbook_dir>/files/certsна хосте, с которого производится запуск плейбука.Здесь и далее: <clickhouse_playbook_dir>— полный путь к директории, в которую распакован архив плейбука.Если у вас есть заранее подготовленный TLS-сертификат, который вы хотите использовать для балансировщика, добавьте в директорию
<clickhouse_playbook_dir>/files/certsфайлы сертификата и ключа, соблюдая следующие правила именования:Имя файла Назначение ca-certificate.crtСертификат доверенного центра сертификации.
ca-certificate.keyКлюч доверенного центра сертификации.
Данный ключ используется для выпуска и подписания сертификатов, которые генерируются ролью
generate_certificatesпри работе плейбука.При использовании своих сертификатов создайте пустой файл с таким именем.
<balancer_fqdn>_server.crtСертификат узла балансировщика, выпущенный доверенным центром сертификации.
<balancer_fqdn>_server.keyПриватный ключ для сертификата
<balancer_fqdn>_server.crt.Здесь:
-
<balancer_fqdn>— FQDN узла балансировщика, указанное в файлеhosts.ini.
При запуске плейбука с заранее подготовленными сертификатами генерация сертификатов производиться не будет. Произойдет копирование подготовленных сертификатов на узлы кластера.
Если установка системы будет производиться не с того же хоста, с которого выполняется развертывание ClickHouse, скопируйте сертификат доверенного центра сертификации
<clickhouse_playbook_dir>/files/certs/ca-certificate.crtна этот хост.Путь к сертификату центра сертификации на хосте, с которого производится установка системы, потребуется указать на этапе ClickHouse setup установки системы.
-
-
Если СУБД PostgreSQL установлена в выделенном кластере, в файл
playbooks/deploy_balancer.ymlдобавьте конфигурацию для создания точек отслеживания состояния PostgreSQL:- name: "Deploying Balancer" hosts: balancer any_errors_fatal: true tasks: # ... - name: "Include role haproxy" ansible.builtin.include_role: name: haproxy vars: haproxy_cfg_configuration: # ... postgresql_master_tcp: frontend: | bind *:5432 mode tcp backend: | option httpchk OPTIONS /master http-check expect status 200 default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions {% for host in groups['patroni'] -%} server patroni{{ groups['patroni'].index(host) + 1 }} {{ host }}:5432 maxconn 3000 check port 8008 {% endfor %} postgresql_slave_tcp: frontend: | bind *:5433 mode tcp backend: | option httpchk OPTIONS /replica http-check expect status 200 default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions {% for host in groups['patroni'] -%} server patroni{{ groups['patroni'].index(host) + 1 }} {{ host }}:5432 maxconn 3000 check port 8008 {% endfor %} -
Запустите плейбук для развертывания балансировщика:
cd .. ansible-playbook -i inventory/hosts.ini playbooks/deploy_balancer.yml
Несколько серверов HAProxy и VRRP
Балансировка с помощью нескольких серверов HAProxy и протокола VRRP обладает следующими свойствами:
Преимущества:
-
Балансировка выполняется для кластеров ClickHouse и PostgreSQL одновременно.
-
Реализован алгоритм проверки состояния узлов (healthcheck).
-
При балансировке запросов учитывается нагрузка на узлы.
-
Серверы балансировщика не являются точками отказа.
Недостаток: для балансировщика требуется несколько выделенных серверов.
| Для работы протокола VRRP нужны определенные сетевые условия: все узлы HAProxy должны находиться в одном L2-сегменте (multicast). |
-
Перейдите в директорию с файлами распакованного архива
clickhouse-cluster.tar.gz. -
Откройте файл
inventory/hosts.iniи дополните его содержимое.В файле
inventory/hosts.iniдолжны быть заполнены разделы[clickhouse],[clickhouse_keeper],[clickhouse_shard<shard_id>].Пример содержимого файла
inventory/hosts.iniприведен в разделе документации Настройка нового кластера ClickHouse.-
В раздел
[balancer]добавьте FQDN узлов балансировщика. -
Если СУБД PostgreSQL установлена в выделенном кластере, в раздел
[patroni]добавьте FQDN узлов кластера PostgreSQL.
Пример конфигурации двух узлов балансировщика в файлеinventory/hosts.ini[balancer] balancer1.my.lan balancer2.my.lan [patroni] postgres1.my.lan postgres2.my.lan -
-
Если при настройке кластера ClickHouse было включено шифрование трафика между системой и кластером (в файле
clickhouse.ymlуказан параметрdcc_clickhouse_ssl_enabled: true), необходимо настроить TLS-сертификаты для узлов балансировщика.По умолчанию роль
generate_certificates, встроенная в плейбук, производит генерацию самоподписанных сертификатов. Генерируемые сертификаты и ключи сохраняются в директории<clickhouse_playbook_dir>/files/certsна хосте, с которого производится запуск плейбука.Здесь и далее: <clickhouse_playbook_dir>— полный путь к директории, в которую распакован архив плейбука.Если у вас есть заранее подготовленные TLS-сертификаты, которые вы хотите использовать для балансировщика, добавьте в директорию
<clickhouse_playbook_dir>/files/certsфайлы сертификатов и ключей, соблюдая следующие правила именования:Имя файла Назначение ca-certificate.crtСертификат доверенного центра сертификации.
ca-certificate.keyКлюч доверенного центра сертификации.
Данный ключ используется для выпуска и подписания сертификатов, которые генерируются ролью
generate_certificatesпри работе плейбука.При использовании своих сертификатов создайте пустой файл с таким именем.
<balancer_fqdn>_server.crtСертификат узла балансировщика, выпущенный доверенным центром сертификации.
Сертификаты должны быть сгенерированы для каждого узла балансировщика.
<balancer_fqdn>_server.keyПриватный ключ для сертификата
<balancer_fqdn>_server.crt.Приватные ключи должны быть сгенерированы для каждого узла балансировщика.
Здесь:
-
<balancer_fqdn>— FQDN узла балансировщика, указанное в файлеhosts.ini.
При запуске плейбука с заранее подготовленными сертификатами генерация сертификатов производиться не будет. Произойдет копирование подготовленных сертификатов на узлы кластера.
Если установка системы будет производиться не с того же хоста, с которого выполняется развертывание ClickHouse, скопируйте сертификат доверенного центра сертификации
<clickhouse_playbook_dir>/files/certs/ca-certificate.crtна этот хост.Путь к сертификату центра сертификации на хосте, с которого производится установка системы, потребуется указать на этапе ClickHouse setup установки системы.
-
-
Если СУБД PostgreSQL установлена в выделенном кластере, в файл
playbooks/deploy_balancer.ymlдобавьте конфигурацию для создания точек отслеживания состояния PostgreSQL:- name: "Deploying Balancer" hosts: balancer any_errors_fatal: true tasks: # ... - name: "Include role haproxy" ansible.builtin.include_role: name: haproxy vars: haproxy_cfg_configuration: # ... postgresql_master_tcp: frontend: | bind *:5432 mode tcp backend: | option httpchk OPTIONS /master http-check expect status 200 default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions {% for host in groups['patroni'] -%} server patroni{{ groups['patroni'].index(host) + 1 }} {{ host }}:5432 maxconn 3000 check port 8008 {% endfor %} postgresql_slave_tcp: frontend: | bind *:5433 mode tcp backend: | option httpchk OPTIONS /replica http-check expect status 200 default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions {% for host in groups['patroni'] -%} server patroni{{ groups['patroni'].index(host) + 1 }} {{ host }}:5432 maxconn 3000 check port 8008 {% endfor %} -
В файле
inventory/group_vars/balancer.ymlопределите переменные для работы VRRP:vrrp_virtual_ipaddress: "<virtual_ip>" vrrp_virtual_router_id: "<virtual_router_id>" vrrp_interface: "<vrrp_interface>"Здесь:
-
<virtual_ip>— выделенный IP-адрес, который будет привязан к сетевому интерфейсу на сервере, являющемся лидером VRRP. -
<virtual_router_id>— индивидуальный идентификатор группы VRRP внутри L2-сегмента сети. Целое положительное число. -
<vrrp_interface>— имя интерфейса, к которому будет привязан VRRP-адрес. По умолчанию —ens192.
-
-
Запустите плейбук для развертывания балансировщика:
cd .. ansible-playbook -i inventory/hosts.ini playbooks/deploy_balancer.yml
Была ли полезна эта страница?