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

View File

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

View File

@ -1,7 +1,7 @@
<!-- Автор: Сергей Антропов, сайт: https://devops.org.ru -->
<!-- Назначение: Базовая конфигурация ClickHouse -->
<yandex>
<clickhouse>
<!-- Основные настройки -->
<listen_host>0.0.0.0</listen_host>
<http_port>8123</http_port>
@ -42,4 +42,12 @@
<function>hdfs</function>
<function>s3</function>
</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 -->
<!-- Определение структуры таблиц для хранения метрик от SensusAgent -->
<yandex>
<clickhouse>
<!-- Настройки для таблиц метрик -->
<dictionaries_config>*_dictionary.xml</dictionaries_config>
@ -121,4 +121,4 @@
<auto_offset_reset>latest</auto_offset_reset>
<skip_broken_messages>100</skip_broken_messages>
</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 -->
<!-- Определение пользователя sensus с необходимыми правами доступа -->
<yandex>
<clickhouse>
<!-- Пользователь sensus -->
<users>
<sensus>
<!-- Пароль (будет переопределен через переменную окружения) -->
<password_sha256_hex></password_sha256_hex>
<password></password>
<!-- Сетевые настройки -->
@ -21,16 +20,6 @@
<!-- Настройки квот -->
<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>
@ -132,4 +121,4 @@
</interval>
</default>
</quotas>
</yandex>
</clickhouse>

View File

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

View File

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

View File

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