feat(infra): кластер ClickHouse — 2 ноды и keeper, smoke ON CLUSTER #16

Merged
ddmitry merged 2 commits from feat/12-clickhouse-cluster into main 2026-07-30 18:58:30 +03:00
Owner

Закрывает #12.

Что сделано

Кластер ClickHouse как единственный режим стенда: две ноды по одному шарду и отдельный clickhouse-keeper. Образ зафиксирован точным LTS-выпуском 26.3.17.56, серверы и keeper берут одну переменную и разъехаться не могут. Порты открыты только на 127.0.0.1.

Роли нод заложены сразу, как требует спека: clickhouse-01 — инициатор DDL и будущая точка Airflow, clickhouse-02 — будущий Superset. Записаны и в README, и комментариями рядом с сервисами в compose.

make smoke — восемь проверок ON CLUSTER одной командой, вывод по-русски. make smoke-guards — три проверки самой smoke-команды: аварийная очистка ограничена по времени, прерывание обрабатывается, keeper работает от непривилегированного пользователя.

Проверка

make up && make smoke && make smoke-guards && make clean

Холодный старт — 11,7 с, три контейнера здоровы. Smoke — 8/8, guards — 3/3.
Кластер в покое занимает 0,49 ГБ при заложенных спекой +0,6–0,8 ГБ.

Как это ревьюировали

Реализация — Codex, дальше саморевью своим же диффом, затем независимое слепое ревью, триаж находок и узкая перепроверка тем же ревьюером.

Ревьюер поднимал стенд и ломал его нарочно. Найдено девять расхождений: главное — при упавшей ноде smoke молча висел 362 секунды, и Ctrl-C не помогал. Стало 107–118 мс, а при падении ноды посреди прогона — 13 с с ограниченной уборкой. Четыре проверки печатали больше, чем доказывали: теперь каждая умеет краснеть, что подтверждено подставными таблицами (например, Distributed с ключом по сырому ClientID роняет проверку ключа шардирования). Keeper работал от root с лимитом в 1024 дескриптора — стало clickhouse и 262144.

Одна находка отклонена с доводом: пустые каталоги /clickhouse/tables/{shard} в keeper — общее пространство имён будущих таблиц, а не мусор проверки; удалять их после smoke было бы вредной привычкой. Довод признан верным при перепроверке.

Конфигурация сверена через Context7 с актуальной документацией ClickHouse 26.x — ничего устаревшего или переименованного.

Что вынесено дальше

Три наблюдения перенесены в #13 (healthcheck проверяет живость, а не готовность кластера; CLICKHOUSE_SKIP_USER_SETUP молча проглотит будущий пароль; потолок 1 ГБ на ноду), одно — в #4 (путь в keeper без {database} столкнётся, если рабочие DDL скопируют шаблон).

Закрывает #12. ## Что сделано Кластер ClickHouse как единственный режим стенда: две ноды по одному шарду и отдельный clickhouse-keeper. Образ зафиксирован точным LTS-выпуском `26.3.17.56`, серверы и keeper берут одну переменную и разъехаться не могут. Порты открыты только на `127.0.0.1`. Роли нод заложены сразу, как требует спека: `clickhouse-01` — инициатор DDL и будущая точка Airflow, `clickhouse-02` — будущий Superset. Записаны и в README, и комментариями рядом с сервисами в compose. `make smoke` — восемь проверок ON CLUSTER одной командой, вывод по-русски. `make smoke-guards` — три проверки самой smoke-команды: аварийная очистка ограничена по времени, прерывание обрабатывается, keeper работает от непривилегированного пользователя. ## Проверка ``` make up && make smoke && make smoke-guards && make clean ``` Холодный старт — 11,7 с, три контейнера здоровы. Smoke — 8/8, guards — 3/3. Кластер в покое занимает 0,49 ГБ при заложенных спекой +0,6–0,8 ГБ. ## Как это ревьюировали Реализация — Codex, дальше саморевью своим же диффом, затем независимое слепое ревью, триаж находок и узкая перепроверка тем же ревьюером. Ревьюер поднимал стенд и ломал его нарочно. Найдено девять расхождений: главное — при упавшей ноде smoke молча висел 362 секунды, и Ctrl-C не помогал. Стало 107–118 мс, а при падении ноды посреди прогона — 13 с с ограниченной уборкой. Четыре проверки печатали больше, чем доказывали: теперь каждая умеет краснеть, что подтверждено подставными таблицами (например, Distributed с ключом по сырому `ClientID` роняет проверку ключа шардирования). Keeper работал от root с лимитом в 1024 дескриптора — стало `clickhouse` и 262144. Одна находка отклонена с доводом: пустые каталоги `/clickhouse/tables/{shard}` в keeper — общее пространство имён будущих таблиц, а не мусор проверки; удалять их после smoke было бы вредной привычкой. Довод признан верным при перепроверке. Конфигурация сверена через Context7 с актуальной документацией ClickHouse 26.x — ничего устаревшего или переименованного. ## Что вынесено дальше Три наблюдения перенесены в #13 (healthcheck проверяет живость, а не готовность кластера; `CLICKHOUSE_SKIP_USER_SETUP` молча проглотит будущий пароль; потолок 1 ГБ на ноду), одно — в #4 (путь в keeper без `{database}` столкнётся, если рабочие DDL скопируют шаблон).
ddmitry added 2 commits 2026-07-30 18:54:37 +03:00
- Зачем:
  - этап 1 спеки требует стенд, поднимаемый одной командой; кластер —
    единственный режим, выключателя «без кластера» нет (issue #12).
- Что:
  - compose.yaml: две ноды ClickHouse и отдельный clickhouse-keeper на
    зафиксированном LTS-образе 26.3.17.56, порты только на 127.0.0.1.
  - infra/clickhouse: общее описание кластера, подключение к keeper и
    отдельные макросы shard и replica для каждой ноды.
  - scripts/clickhouse-smoke.sh: восемь проверок ON CLUSTER от описания
    кластера до удаления временных таблиц, вывод по-русски.
  - tests/smoke-guards.sh: три проверки самой smoke-команды —
    ограниченная аварийная очистка, обработка прерывания, окружение keeper.
  - README.md: быстрый старт, роли нод, обоснование выбора версии.
- Проверка:
  - make up && make smoke && make smoke-guards && make clean
- Зачем:
  - конвейер работы над тикетом раздаёт рассуждения и механику разным
    субагентам; определение в репозитории задаёт модель и глубину явно и
    переживает сессию.
- Что:
  - .claude/agents/deep-reasoner.md — рассуждения и ревью, модель opus.
  - .claude/agents/fast-worker.md — механическая работа, модель sonnet.
- Проверка:
  - .gitignore уже разрешает .claude/agents/; субагенты видны в списке
    агентов Claude Code.
ddmitry merged commit dca0142fd1 into main 2026-07-30 18:58:30 +03:00
ddmitry deleted branch feat/12-clickhouse-cluster 2026-07-30 18:58:30 +03:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ddmitry/clickstream-data-platform#16