feat: Настройка ClickHouse кластера с репликацией и балансировщиком нагрузки

- Настроен ClickHouse кластер с 2 репликами и автоматической репликацией
- Добавлен Nginx Load Balancer для ClickHouse (HTTP и TCP)
- Исправлена конфигурация кластера для правильной работы репликации
- Созданы таблицы с репликацией: metrics_raw, metrics_processed, agents_info
- Убран healthcheck у nginx load balancer (не нужен)
- Обновлен Makefile: автоматическое создание .env из env.example
- Обновлена документация с информацией о ClickHouse кластере
- Все сервисы протестированы и работают корректно

Автор: Сергей Антропов, сайт: https://devops.org.ru
This commit is contained in:
Sergey Antropoff 2025-09-10 19:50:20 +03:00
parent 0cb1ccaafb
commit db957f9890
17 changed files with 237 additions and 149 deletions

View File

@ -23,12 +23,13 @@ help: ## Показать справку по командам
setup: ## Первоначальная настройка инфраструктуры setup: ## Первоначальная настройка инфраструктуры
@echo "🔧 Настройка инфраструктуры Sensus..." @echo "🔧 Настройка инфраструктуры Sensus..."
@if [ ! -f .env ]; then \ @if [ ! -f .env ]; then \
echo "⚠️ Файл .env не найден. Создайте его на основе env.example"; \ echo "⚠️ Файл .env не найден. Копирую env.example в .env..."; \
echo " cp env.example .env"; \ cp env.example .env; \
echo " # Отредактируйте .env с вашими значениями"; \ echo "✅ Файл .env создан на основе env.example"; \
exit 1; \ echo "💡 Отредактируйте .env с вашими значениями при необходимости"; \
else \
echo "✅ Файл .env уже существует"; \
fi fi
@echo "✅ Файл .env найден"
@echo "🔐 Генерация SSL сертификатов..." @echo "🔐 Генерация SSL сертификатов..."
@$(MAKE) ssl-generate @$(MAKE) ssl-generate
@echo "🚀 Запуск инфраструктуры..." @echo "🚀 Запуск инфраструктуры..."

View File

@ -10,8 +10,9 @@ SensusInfra — это полная инфраструктура для рабо
- **Kafka** — брокер сообщений для передачи метрик от агентов к воркерам - **Kafka** — брокер сообщений для передачи метрик от агентов к воркерам
- **KafkaUI** — веб-интерфейс для мониторинга Kafka - **KafkaUI** — веб-интерфейс для мониторинга Kafka
- **PostgreSQL** — база данных для хранения метаданных агентов и конфигураций - **PostgreSQL** — база данных для хранения метаданных агентов и конфигураций
- **ClickHouse** — аналитическая база данных для хранения и анализа метрик (2 реплики) - **ClickHouse** — аналитическая база данных для хранения и анализа метрик (кластер с 2 репликами)
- **Nginx Load Balancer** — балансировщик нагрузки для ClickHouse - **Nginx Load Balancer** — балансировщик нагрузки для ClickHouse (HTTP и TCP)
- **ZooKeeper** — координатор для ClickHouse репликации
## Архитектура ## Архитектура
@ -32,6 +33,8 @@ SensusInfra — это полная инфраструктура для рабо
│ ClickHouse │ │ ClickHouse │
│ Load Balancer │ │ Load Balancer │
│ (Nginx) │ │ (Nginx) │
│ HTTP: 8125 │
│ TCP: 9002 │
└─────────────────┘ └─────────────────┘
@ -39,6 +42,15 @@ SensusInfra — это полная инфраструктура для рабо
│ ClickHouse │ │ ClickHouse │
│ (аналитика) │ │ (аналитика) │
│ (2 реплики) │ │ (2 реплики) │
│ Реплика 1: 8123│
│ Реплика 2: 8124│
└─────────────────┘
┌─────────────────┐
│ ZooKeeper │
│ (координатор) │
│ Port: 2181 │
└─────────────────┘ └─────────────────┘
``` ```
@ -50,10 +62,11 @@ SensusInfra — это полная инфраструктура для рабо
# Клонируйте репозиторий и перейдите в директорию # Клонируйте репозиторий и перейдите в директорию
cd SensusInfra cd SensusInfra
# Создайте файл .env на основе env.example # Файл .env будет создан автоматически при выполнении make setup
# Или создайте вручную:
cp env.example .env cp env.example .env
# Отредактируйте .env с вашими значениями # Отредактируйте .env с вашими значениями (опционально)
nano .env nano .env
``` ```
@ -159,7 +172,9 @@ make logs # Логи всех сервисов
- `CLICKHOUSE_PASSWORD` — пароль (обязательно изменить!) - `CLICKHOUSE_PASSWORD` — пароль (обязательно изменить!)
- `CLICKHOUSE_SECURE` — безопасный режим (по умолчанию true) - `CLICKHOUSE_SECURE` — безопасный режим (по умолчанию true)
- `CLICKHOUSE_1_PORT` — порт первой реплики (по умолчанию 8123) - `CLICKHOUSE_1_PORT` — порт первой реплики (по умолчанию 8123)
- `CLICKHOUSE_1_HTTP_PORT` — HTTP порт первой реплики (по умолчанию 9000)
- `CLICKHOUSE_2_PORT` — порт второй реплики (по умолчанию 8124) - `CLICKHOUSE_2_PORT` — порт второй реплики (по умолчанию 8124)
- `CLICKHOUSE_2_HTTP_PORT` — HTTP порт второй реплики (по умолчанию 9001)
#### ClickHouse Load Balancer #### ClickHouse Load Balancer
- `CLICKHOUSE_LB_HTTP_PORT` — HTTP порт балансировщика (по умолчанию 8125) - `CLICKHOUSE_LB_HTTP_PORT` — HTTP порт балансировщика (по умолчанию 8125)
@ -187,13 +202,18 @@ make logs # Логи всех сервисов
#### ClickHouse #### ClickHouse
**База `sensus_metrics`**: **База `sensus_metrics`** (реплицируется между узлами):
- `metrics_raw` — сырые метрики - `metrics_raw` — сырые метрики (ReplicatedMergeTree)
- `metrics_processed` — обработанные метрики - `metrics_processed` — обработанные метрики (ReplicatedMergeTree)
- `metrics_aggregated_hourly` — агрегация по часам - `agents_info` — информация об агентах (ReplicatedReplacingMergeTree)
- `metrics_aggregated_daily` — агрегация по дням
- `agents_info` — информация об агентах **Кластер `sensus_cluster`**:
- `collectors_info` — информация о коллекторах - **Шард 1** с двумя репликами:
- `clickhouse-1` (порт 8123/9000)
- `clickhouse-2` (порт 8124/9001)
- **ZooKeeper** для координации репликации
- **Автоматическая репликация** данных между узлами
- **Балансировщик нагрузки** для распределения запросов
**База `system`**: **База `system`**:
- `system_logs` — логи системы - `system_logs` — логи системы
@ -209,16 +229,24 @@ make logs # Логи всех сервисов
- Просмотр сообщений в реальном времени - Просмотр сообщений в реальном времени
- Авторизация через форму входа - Авторизация через форму входа
### ClickHouse Load Balancer
- **HTTP:** http://localhost:8125
- **TCP:** localhost:9002
- Балансировка нагрузки между репликами ClickHouse
- Health check endpoint: http://localhost:8125/health
- Статус endpoint: http://localhost:8125/status
### Health Check ### Health Check
```bash ```bash
make health-check make health-check
``` ```
Проверяет доступность всех сервисов: Проверяет доступность всех сервисов:
- Zookeeper - ZooKeeper
- Kafka - Kafka
- PostgreSQL - PostgreSQL
- ClickHouse (обе реплики) - ClickHouse (обе реплики)
- ClickHouse Load Balancer
### Логи ### Логи
```bash ```bash
@ -279,8 +307,11 @@ make restore BACKUP_FILE=postgres_20241201_120000.sql
- **9093** — Kafka (SSL) - **9093** — Kafka (SSL)
- **8080** — Kafka UI - **8080** — Kafka UI
- **5432** — PostgreSQL - **5432** — PostgreSQL
- **8123** — ClickHouse (реплика 1) - **2181** — ZooKeeper
- **8124** — ClickHouse (реплика 2) - **8123** — ClickHouse (реплика 1, HTTP)
- **9000** — ClickHouse (реплика 1, TCP)
- **8124** — ClickHouse (реплика 2, HTTP)
- **9001** — ClickHouse (реплика 2, TCP)
- **8125** — ClickHouse Load Balancer (HTTP) - **8125** — ClickHouse Load Balancer (HTTP)
- **9002** — ClickHouse Load Balancer (TCP) - **9002** — ClickHouse Load Balancer (TCP)

View File

@ -1,7 +1,7 @@
<!-- Автор: Сергей Антропов, сайт: https://devops.org.ru --> <!-- Автор: Сергей Антропов, сайт: https://devops.org.ru -->
<!-- Назначение: Базовая конфигурация ClickHouse --> <!-- Назначение: Базовая конфигурация ClickHouse -->
<yandex> <clickhouse>
<!-- Основные настройки --> <!-- Основные настройки -->
<listen_host>0.0.0.0</listen_host> <listen_host>0.0.0.0</listen_host>
<http_port>8123</http_port> <http_port>8123</http_port>
@ -42,4 +42,12 @@
<function>hdfs</function> <function>hdfs</function>
<function>s3</function> <function>s3</function>
</external_table_functions_whitelist> </external_table_functions_whitelist>
</yandex>
<!-- Настройки сети -->
<networks>
<ip>::/0</ip>
</networks>
<!-- Настройки для работы с большими запросами -->
<skip_check_for_incorrect_settings>1</skip_check_for_incorrect_settings>
</clickhouse>

View File

@ -0,0 +1,25 @@
<!-- Автор: Сергей Антропов, сайт: https://devops.org.ru -->
<!-- Назначение: Минимальная конфигурация ClickHouse -->
<clickhouse>
<!-- Основные настройки -->
<listen_host>0.0.0.0</listen_host>
<http_port>8123</http_port>
<tcp_port>9000</tcp_port>
<!-- Настройки для работы с дисками -->
<path>/var/lib/clickhouse/</path>
<tmp_path>/var/lib/clickhouse/tmp/</tmp_path>
<user_files_path>/var/lib/clickhouse/user_files/</user_files_path>
<!-- Настройки для работы с пользователями -->
<users_config>users.xml</users_config>
<!-- Настройки для работы с базами данных -->
<default_database>sensus_metrics</default_database>
<!-- Настройки сети -->
<networks>
<ip>::/0</ip>
</networks>
</clickhouse>

View File

@ -0,0 +1,49 @@
<!-- Автор: Сергей Антропов, сайт: https://devops.org.ru -->
<!-- Назначение: Конфигурация кластера ClickHouse для SensusAgent и SensusWorker -->
<!-- Настройка кластера с двумя репликами -->
<clickhouse>
<!-- Конфигурация кластера для репликации -->
<remote_servers>
<sensus_cluster>
<!-- Шард 1 с двумя репликами -->
<shard>
<replica>
<host>clickhouse-1</host>
<port>9000</port>
</replica>
<replica>
<host>clickhouse-2</host>
<port>9000</port>
</replica>
</shard>
</sensus_cluster>
</remote_servers>
<!-- Настройки для работы с ZooKeeper (если потребуется) -->
<zookeeper>
<node>
<host>zookeeper</host>
<port>2181</port>
</node>
</zookeeper>
<!-- Настройки для работы с Kafka -->
<kafka>
<broker_list>kafka:29092</broker_list>
<security_protocol>plaintext</security_protocol>
<topic_list>
<topic>sensus.metrics</topic>
</topic_list>
</kafka>
<!-- Настройки для работы с PostgreSQL -->
<postgresql>
<host>postgres</host>
<port>5432</port>
<database>sensus</database>
<user>sensus</user>
<password>sensus</password>
</postgresql>
</clickhouse>

View File

@ -1,100 +0,0 @@
<!-- Автор: Сергей Антропов, сайт: https://devops.org.ru -->
<!-- Назначение: Конфигурация кластера ClickHouse для SensusAgent и SensusWorker -->
<!-- Настройка репликации между двумя репликами ClickHouse -->
<yandex>
<!-- Конфигурация кластера для репликации -->
<remote_servers>
<sensus_cluster>
<!-- Первая реплика -->
<shard>
<replica>
<host>clickhouse-1</host>
<port>9000</port>
</replica>
</shard>
<!-- Вторая реплика -->
<shard>
<replica>
<host>clickhouse-2</host>
<port>9000</port>
</replica>
</shard>
</sensus_cluster>
</remote_servers>
<!-- Настройки для реплицируемых таблиц -->
<macros>
<shard>01</shard>
<replica>clickhouse-1</replica>
</macros>
<!-- Настройки сети -->
<networks>
<ip>::/0</ip>
</networks>
<!-- Настройки логирования -->
<logger>
<level>information</level>
<log>/var/log/clickhouse-server/clickhouse-server.log</log>
<errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
<size>1000M</size>
<count>10</count>
</logger>
<!-- Настройки HTTP сервера -->
<http_server_default_response><![CDATA[<html ng-app="SMI2"><head><base href="http://ui.tabix.io/"></head><body><div ui-view="" class="content-ui"></div><script src="http://loader.tabix.io/master.js"></script></body></html>]]></http_server_default_response>
<!-- Настройки для работы с большими данными (перенесены в users.xml) -->
<skip_check_for_incorrect_settings>1</skip_check_for_incorrect_settings>
<!-- Настройки для оптимизации запросов -->
<mark_cache_size>5368709120</mark_cache_size>
<uncompressed_cache_size>8589934592</uncompressed_cache_size>
<mmap_cache_size>1000</mmap_cache_size>
<!-- Настройки для работы с дисками -->
<storage_configuration>
<disks>
<default>
<path>/var/lib/clickhouse/</path>
</default>
</disks>
<policies>
<default>
<volumes>
<default>
<disk>default</disk>
</default>
</volumes>
</default>
</policies>
</storage_configuration>
<!-- Настройки для работы с ZooKeeper (если потребуется) -->
<zookeeper>
<node>
<host>zookeeper</host>
<port>2181</port>
</node>
</zookeeper>
<!-- Настройки для работы с Kafka -->
<kafka>
<broker_list>kafka:29092</broker_list>
<security_protocol>plaintext</security_protocol>
<topic_list>
<topic>sensus.metrics</topic>
</topic_list>
</kafka>
<!-- Настройки для работы с PostgreSQL -->
<postgresql>
<host>postgres</host>
<port>5432</port>
<database>sensus</database>
<user>sensus</user>
<password>sensus</password>
</postgresql>
</yandex>

View File

@ -2,7 +2,7 @@
<!-- Назначение: Конфигурация таблиц метрик для ClickHouse --> <!-- Назначение: Конфигурация таблиц метрик для ClickHouse -->
<!-- Определение структуры таблиц для хранения метрик от SensusAgent --> <!-- Определение структуры таблиц для хранения метрик от SensusAgent -->
<yandex> <clickhouse>
<!-- Настройки для таблиц метрик --> <!-- Настройки для таблиц метрик -->
<dictionaries_config>*_dictionary.xml</dictionaries_config> <dictionaries_config>*_dictionary.xml</dictionaries_config>
@ -121,4 +121,4 @@
<auto_offset_reset>latest</auto_offset_reset> <auto_offset_reset>latest</auto_offset_reset>
<skip_broken_messages>100</skip_broken_messages> <skip_broken_messages>100</skip_broken_messages>
</kafka> </kafka>
</yandex> </clickhouse>

View File

@ -0,0 +1,11 @@
<!-- Автор: Сергей Антропов, сайт: https://devops.org.ru -->
<!-- Назначение: Макросы для первой реплики ClickHouse -->
<!-- Специфичные настройки для clickhouse-1 -->
<clickhouse>
<!-- Макросы для первой реплики -->
<macros>
<shard>01</shard>
<replica>clickhouse-1</replica>
</macros>
</clickhouse>

View File

@ -0,0 +1,11 @@
<!-- Автор: Сергей Антропов, сайт: https://devops.org.ru -->
<!-- Назначение: Макросы для второй реплики ClickHouse -->
<!-- Специфичные настройки для clickhouse-2 -->
<clickhouse>
<!-- Макросы для второй реплики -->
<macros>
<shard>01</shard>
<replica>clickhouse-2</replica>
</macros>
</clickhouse>

View File

View File

@ -0,0 +1,11 @@
<!-- Автор: Сергей Антропов, сайт: https://devops.org.ru -->
<!-- Назначение: Макросы для первой реплики ClickHouse -->
<!-- Специфичные настройки для clickhouse-1 -->
<clickhouse>
<!-- Макросы для первой реплики -->
<macros>
<shard>01</shard>
<replica>clickhouse-1</replica>
</macros>
</clickhouse>

View File

@ -0,0 +1,11 @@
<!-- Автор: Сергей Антропов, сайт: https://devops.org.ru -->
<!-- Назначение: Макросы для второй реплики ClickHouse -->
<!-- Специфичные настройки для clickhouse-2 -->
<clickhouse>
<!-- Макросы для второй реплики -->
<macros>
<shard>01</shard>
<replica>clickhouse-2</replica>
</macros>
</clickhouse>

View File

@ -0,0 +1,45 @@
<!-- Автор: Сергей Антропов, сайт: https://devops.org.ru -->
<!-- Назначение: Простая конфигурация пользователя ClickHouse -->
<clickhouse>
<!-- Пользователь sensus -->
<users>
<sensus>
<!-- Пароль (будет переопределен через переменную окружения) -->
<password></password>
<!-- Сетевые настройки -->
<networks>
<ip>::/0</ip>
</networks>
<!-- Настройки профиля -->
<profile>default</profile>
<!-- Настройки квот -->
<quota>default</quota>
</sensus>
</users>
<!-- Профиль по умолчанию -->
<profiles>
<default>
<!-- Настройки для работы с памятью -->
<max_memory_usage>10000000000</max_memory_usage>
</default>
</profiles>
<!-- Квоты по умолчанию -->
<quotas>
<default>
<interval>
<duration>3600</duration>
<queries>0</queries>
<errors>0</errors>
<result_rows>0</result_rows>
<read_rows>0</read_rows>
<execution_time>0</execution_time>
</interval>
</default>
</quotas>
</clickhouse>

View File

@ -2,12 +2,11 @@
<!-- Назначение: Конфигурация пользователя ClickHouse для SensusAgent и SensusWorker --> <!-- Назначение: Конфигурация пользователя ClickHouse для SensusAgent и SensusWorker -->
<!-- Определение пользователя sensus с необходимыми правами доступа --> <!-- Определение пользователя sensus с необходимыми правами доступа -->
<yandex> <clickhouse>
<!-- Пользователь sensus --> <!-- Пользователь sensus -->
<users> <users>
<sensus> <sensus>
<!-- Пароль (будет переопределен через переменную окружения) --> <!-- Пароль (будет переопределен через переменную окружения) -->
<password_sha256_hex></password_sha256_hex>
<password></password> <password></password>
<!-- Сетевые настройки --> <!-- Сетевые настройки -->
@ -21,16 +20,6 @@
<!-- Настройки квот --> <!-- Настройки квот -->
<quota>default</quota> <quota>default</quota>
<!-- Настройки доступа к базам данных -->
<databases>
<sensus_metrics>
<table>metrics_raw</table>
<table>metrics_processed</table>
<table>metrics_aggregated</table>
<table>agents_info</table>
<table>collectors_info</table>
</sensus_metrics>
</databases>
<!-- Настройки для работы с большими запросами --> <!-- Настройки для работы с большими запросами -->
<max_memory_usage>10000000000</max_memory_usage> <max_memory_usage>10000000000</max_memory_usage>
@ -132,4 +121,4 @@
</interval> </interval>
</default> </default>
</quotas> </quotas>
</yandex> </clickhouse>

View File

@ -10,7 +10,7 @@
<networks> <networks>
<ip>::/0</ip> <ip>::/0</ip>
</networks> </networks>
<password><![CDATA[clickhouse_secure_password_2024]]></password> <password><![CDATA[sensus]]></password>
<quota>default</quota> <quota>default</quota>
<access_management>1</access_management> <access_management>1</access_management>
</sensus> </sensus>

View File

@ -129,6 +129,7 @@ services:
volumes: volumes:
- clickhouse-1-data:/var/lib/clickhouse - clickhouse-1-data:/var/lib/clickhouse
- ./clickhouse-config:/etc/clickhouse-server/config.d - ./clickhouse-config:/etc/clickhouse-server/config.d
- ./clickhouse-config/03-clickhouse-1-macros.xml:/etc/clickhouse-server/config.d/03-macros.xml
- ./clickhouse-users:/etc/clickhouse-server/users.d - ./clickhouse-users:/etc/clickhouse-server/users.d
ports: ports:
- "${CLICKHOUSE_1_PORT:-8123}:8123" - "${CLICKHOUSE_1_PORT:-8123}:8123"
@ -137,11 +138,11 @@ services:
- sensus-network - sensus-network
restart: unless-stopped restart: unless-stopped
healthcheck: healthcheck:
#test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8123/ping"] test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:8123/ping"]
test: ["CMD", "clickhouse-client", "--query", "SELECT 1"]
interval: 30s interval: 30s
timeout: 10s timeout: 10s
retries: 3 retries: 5
start_period: 60s
# ClickHouse - вторая реплика # ClickHouse - вторая реплика
clickhouse-2: clickhouse-2:
@ -156,6 +157,7 @@ services:
volumes: volumes:
- clickhouse-2-data:/var/lib/clickhouse - clickhouse-2-data:/var/lib/clickhouse
- ./clickhouse-config:/etc/clickhouse-server/config.d - ./clickhouse-config:/etc/clickhouse-server/config.d
- ./clickhouse-config/03-clickhouse-2-macros.xml:/etc/clickhouse-server/config.d/03-macros.xml
- ./clickhouse-users:/etc/clickhouse-server/users.d - ./clickhouse-users:/etc/clickhouse-server/users.d
ports: ports:
- "${CLICKHOUSE_2_PORT:-8124}:8123" - "${CLICKHOUSE_2_PORT:-8124}:8123"
@ -164,11 +166,11 @@ services:
- sensus-network - sensus-network
restart: unless-stopped restart: unless-stopped
healthcheck: healthcheck:
#test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8123/ping"] test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:8123/ping"]
test: ["CMD", "clickhouse-client", "--query", "SELECT 1"]
interval: 30s interval: 30s
timeout: 10s timeout: 10s
retries: 3 retries: 5
start_period: 60s
# Nginx балансировщик нагрузки для ClickHouse # Nginx балансировщик нагрузки для ClickHouse
clickhouse-lb: clickhouse-lb:
@ -187,11 +189,6 @@ services:
networks: networks:
- sensus-network - sensus-network
restart: unless-stopped restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:80/health"]
interval: 30s
timeout: 10s
retries: 3
volumes: volumes:

View File

@ -151,7 +151,6 @@ http {
# TCP балансировка для ClickHouse Native протокола # TCP балансировка для ClickHouse Native протокола
stream { stream {
# Логирование для stream # Логирование для stream
access_log /var/log/nginx/stream_access.log;
error_log /var/log/nginx/stream_error.log; error_log /var/log/nginx/stream_error.log;
# Upstream для ClickHouse Native протокола # Upstream для ClickHouse Native протокола