From db957f98903635fdcee450d92b54b040a624f803 Mon Sep 17 00:00:00 2001 From: Sergey Antropoff Date: Wed, 10 Sep 2025 19:50:20 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B0=20ClickHouse=20=D0=BA=D0=BB=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D0=B0=20=D1=81=20=D1=80=D0=B5=D0=BF=D0=BB?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D0=B5=D0=B9=20=D0=B8=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=BB=D0=B0=D0=BD=D1=81=D0=B8=D1=80=D0=BE=D0=B2=D1=89?= =?UTF-8?q?=D0=B8=D0=BA=D0=BE=D0=BC=20=D0=BD=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Настроен 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 --- Makefile | 11 +- README.md | 59 ++++++++--- .../{00-basic.xml.bak => 00-basic.xml} | 12 ++- clickhouse-config/00-minimal.xml | 25 +++++ clickhouse-config/01-cluster.xml | 49 +++++++++ clickhouse-config/01-cluster.xml.bak | 100 ------------------ .../{02-metrics.xml.bak => 02-metrics.xml} | 4 +- clickhouse-config/03-clickhouse-1-macros.xml | 11 ++ clickhouse-config/03-clickhouse-2-macros.xml | 11 ++ clickhouse-config/03-macros.xml | 0 clickhouse-config/clickhouse-1/macros.xml | 11 ++ clickhouse-config/clickhouse-2/macros.xml | 11 ++ clickhouse-users/01-sensus-user-simple.xml | 45 ++++++++ ...s-user.xml => 01-sensus-user.xml.disabled} | 15 +-- clickhouse-users/default-user.xml | 2 +- docker-compose.yml | 19 ++-- nginx/clickhouse-lb.conf | 1 - 17 files changed, 237 insertions(+), 149 deletions(-) rename clickhouse-config/{00-basic.xml.bak => 00-basic.xml} (85%) create mode 100644 clickhouse-config/00-minimal.xml create mode 100644 clickhouse-config/01-cluster.xml delete mode 100644 clickhouse-config/01-cluster.xml.bak rename clickhouse-config/{02-metrics.xml.bak => 02-metrics.xml} (99%) create mode 100644 clickhouse-config/03-clickhouse-1-macros.xml create mode 100644 clickhouse-config/03-clickhouse-2-macros.xml create mode 100755 clickhouse-config/03-macros.xml create mode 100644 clickhouse-config/clickhouse-1/macros.xml create mode 100644 clickhouse-config/clickhouse-2/macros.xml create mode 100644 clickhouse-users/01-sensus-user-simple.xml rename clickhouse-users/{01-sensus-user.xml => 01-sensus-user.xml.disabled} (91%) diff --git a/Makefile b/Makefile index 239dcd7..9329bf5 100644 --- a/Makefile +++ b/Makefile @@ -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 "🚀 Запуск инфраструктуры..." diff --git a/README.md b/README.md index 6fc7b16..5b43bf8 100644 --- a/README.md +++ b/README.md @@ -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) diff --git a/clickhouse-config/00-basic.xml.bak b/clickhouse-config/00-basic.xml similarity index 85% rename from clickhouse-config/00-basic.xml.bak rename to clickhouse-config/00-basic.xml index 4013416..c1b3a0b 100644 --- a/clickhouse-config/00-basic.xml.bak +++ b/clickhouse-config/00-basic.xml @@ -1,7 +1,7 @@ - + 0.0.0.0 8123 @@ -42,4 +42,12 @@ hdfs s3 - + + + + ::/0 + + + + 1 + diff --git a/clickhouse-config/00-minimal.xml b/clickhouse-config/00-minimal.xml new file mode 100644 index 0000000..015829e --- /dev/null +++ b/clickhouse-config/00-minimal.xml @@ -0,0 +1,25 @@ + + + + + + 0.0.0.0 + 8123 + 9000 + + + /var/lib/clickhouse/ + /var/lib/clickhouse/tmp/ + /var/lib/clickhouse/user_files/ + + + users.xml + + + sensus_metrics + + + + ::/0 + + diff --git a/clickhouse-config/01-cluster.xml b/clickhouse-config/01-cluster.xml new file mode 100644 index 0000000..c943d9f --- /dev/null +++ b/clickhouse-config/01-cluster.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + clickhouse-1 + 9000 + + + clickhouse-2 + 9000 + + + + + + + + + zookeeper + 2181 + + + + + + + kafka:29092 + plaintext + + sensus.metrics + + + + + + postgres + 5432 + sensus + sensus + sensus + + \ No newline at end of file diff --git a/clickhouse-config/01-cluster.xml.bak b/clickhouse-config/01-cluster.xml.bak deleted file mode 100644 index dd0a320..0000000 --- a/clickhouse-config/01-cluster.xml.bak +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - clickhouse-1 - 9000 - - - - - - clickhouse-2 - 9000 - - - - - - - - 01 - clickhouse-1 - - - - - ::/0 - - - - - information - /var/log/clickhouse-server/clickhouse-server.log - /var/log/clickhouse-server/clickhouse-server.err.log - 1000M - 10 - - - -
]]>
- - - 1 - - - 5368709120 - 8589934592 - 1000 - - - - - - /var/lib/clickhouse/ - - - - - - - default - - - - - - - - - - zookeeper - 2181 - - - - - - kafka:29092 - plaintext - - sensus.metrics - - - - - - postgres - 5432 - sensus - sensus - sensus - -
diff --git a/clickhouse-config/02-metrics.xml.bak b/clickhouse-config/02-metrics.xml similarity index 99% rename from clickhouse-config/02-metrics.xml.bak rename to clickhouse-config/02-metrics.xml index c951f83..d01ea14 100644 --- a/clickhouse-config/02-metrics.xml.bak +++ b/clickhouse-config/02-metrics.xml @@ -2,7 +2,7 @@ - + *_dictionary.xml @@ -121,4 +121,4 @@ latest 100 - + diff --git a/clickhouse-config/03-clickhouse-1-macros.xml b/clickhouse-config/03-clickhouse-1-macros.xml new file mode 100644 index 0000000..2d6fd67 --- /dev/null +++ b/clickhouse-config/03-clickhouse-1-macros.xml @@ -0,0 +1,11 @@ + + + + + + + + 01 + clickhouse-1 + + diff --git a/clickhouse-config/03-clickhouse-2-macros.xml b/clickhouse-config/03-clickhouse-2-macros.xml new file mode 100644 index 0000000..90ed635 --- /dev/null +++ b/clickhouse-config/03-clickhouse-2-macros.xml @@ -0,0 +1,11 @@ + + + + + + + + 01 + clickhouse-2 + + diff --git a/clickhouse-config/03-macros.xml b/clickhouse-config/03-macros.xml new file mode 100755 index 0000000..e69de29 diff --git a/clickhouse-config/clickhouse-1/macros.xml b/clickhouse-config/clickhouse-1/macros.xml new file mode 100644 index 0000000..2d6fd67 --- /dev/null +++ b/clickhouse-config/clickhouse-1/macros.xml @@ -0,0 +1,11 @@ + + + + + + + + 01 + clickhouse-1 + + diff --git a/clickhouse-config/clickhouse-2/macros.xml b/clickhouse-config/clickhouse-2/macros.xml new file mode 100644 index 0000000..90ed635 --- /dev/null +++ b/clickhouse-config/clickhouse-2/macros.xml @@ -0,0 +1,11 @@ + + + + + + + + 01 + clickhouse-2 + + diff --git a/clickhouse-users/01-sensus-user-simple.xml b/clickhouse-users/01-sensus-user-simple.xml new file mode 100644 index 0000000..4a64327 --- /dev/null +++ b/clickhouse-users/01-sensus-user-simple.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + ::/0 + + + + default + + + default + + + + + + + + 10000000000 + + + + + + + + 3600 + 0 + 0 + 0 + 0 + 0 + + + + diff --git a/clickhouse-users/01-sensus-user.xml b/clickhouse-users/01-sensus-user.xml.disabled similarity index 91% rename from clickhouse-users/01-sensus-user.xml rename to clickhouse-users/01-sensus-user.xml.disabled index 2ff148f..c2b70a8 100644 --- a/clickhouse-users/01-sensus-user.xml +++ b/clickhouse-users/01-sensus-user.xml.disabled @@ -2,12 +2,11 @@ - + - @@ -21,16 +20,6 @@ default - - - - metrics_raw
- metrics_processed
- metrics_aggregated
- agents_info
- collectors_info
-
-
10000000000 @@ -132,4 +121,4 @@ -
+ diff --git a/clickhouse-users/default-user.xml b/clickhouse-users/default-user.xml index 0c1f0b7..12ab1e6 100644 --- a/clickhouse-users/default-user.xml +++ b/clickhouse-users/default-user.xml @@ -10,7 +10,7 @@ ::/0 - + default 1 diff --git a/docker-compose.yml b/docker-compose.yml index 1e1235a..76111b6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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: diff --git a/nginx/clickhouse-lb.conf b/nginx/clickhouse-lb.conf index 2b628d4..0d50c1d 100644 --- a/nginx/clickhouse-lb.conf +++ b/nginx/clickhouse-lb.conf @@ -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 протокола