← Назад к вопросам
как был развернут Clickhouse?
2.0 Middle🔥 81 комментариев
#Опыт и soft skills#Хранилища данных
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Развертывание ClickHouse: Полное Руководство
ClickHouse — это столбцовая OLAP база данных, специально разработанная для анализа больших наборов данных с экстремальными скоростями. Вот полное руководство по её развертыванию и конфигурации.
Архитектура ClickHouse
┌─────────────────────────────────────┐
│ ClickHouse Cluster │
├────────────────────┬────────────────┤
│ Shard 1 │ Shard 2 │
├────┬────┬────┬─────┼────┬────┬──────┤
│Rep1│Rep2│Rep3│Rep4 │Rep1│Rep2│Rep3 │
└────┴────┴────┴─────┴────┴────┴──────┘
↓ Replication
↓ Sharding
1. Установка ClickHouse
На Linux (Ubuntu/Debian)
# Добавить репозиторий ClickHouse
echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg]" \
"https://packages.clickhouse.com/deb stable main" | \
sudo tee /etc/apt/sources.list.d/clickhouse.list
# Добавить GPG ключ
curl https://packages.clickhouse.com/deb/key.pub | \
gpg --dearmor | sudo tee /usr/share/keyrings/clickhouse-keyring.gpg
# Установить
sudo apt-get update
sudo apt-get install -y clickhouse-server clickhouse-client clickhouse-common-static
# Запустить сервис
sudo systemctl start clickhouse-server
sudo systemctl enable clickhouse-server
# Проверить статус
sudo systemctl status clickhouse-server
В Docker
# Dockerfile
FROM clickhouse/clickhouse-server:latest
# Копировать конфигурацию
COPY clickhouse-config.xml /etc/clickhouse-server/config.xml
COPY users.xml /etc/clickhouse-server/users.xml
# Exponse ports
EXPOSE 8123 9000 9009
# Healthcheck
HEALTHCHECK --interval=10s --timeout=5s \
CMD curl -f http://localhost:8123/ping || exit 1
# docker-compose.yml
version: '3.8'
services:
clickhouse:
image: clickhouse/clickhouse-server:latest
ports:
- "8123:8123" # HTTP port
- "9000:9000" # Native protocol
- "9009:9009" # Replication
volumes:
- ./config.xml:/etc/clickhouse-server/config.xml
- ./users.xml:/etc/clickhouse-server/users.xml
- clickhouse-data:/var/lib/clickhouse
environment:
- CLICKHOUSE_DB=analytics
- CLICKHOUSE_USER=default
- CLICKHOUSE_PASSWORD=password
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8123/ping"]
interval: 10s
timeout: 5s
retries: 3
volumes:
clickhouse-data:
2. Конфигурация ClickHouse
Основной config.xml
<?xml version="1.0"?>
<clickhouse>
<!-- Слушающий порт -->
<http_port>8123</http_port>
<tcp_port>9000</tcp_port>
<interserver_http_port>9009</interserver_http_port>
<!-- Логирование -->
<logger>
<level>notice</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>
<!-- Пути к данным -->
<path>/var/lib/clickhouse/</path>
<tmp_path>/var/lib/clickhouse/tmp/</tmp_path>
<!-- Пул потоков -->
<max_connections>4096</max_connections>
<keep_alive_timeout>3</keep_alive_timeout>
<!-- Параметры памяти -->
<max_memory_usage>0</max_memory_usage> <!-- 0 = no limit -->
<max_memory_usage_for_user>0</max_memory_usage_for_user>
<!-- Параметры слияния таблиц -->
<merge_tree>
<max_suspicious_broken_parts>5</max_suspicious_broken_parts>
<use_minimalistic_checksums_in_metadata>false</use_minimalistic_checksums_in_metadata>
</merge_tree>
<!-- Удалённые серверы для репликации и шардирования -->
<remote_servers>
<default>
<!-- Shard 1 -->
<shard>
<weight>1</weight>
<replica>
<host>clickhouse-node1.example.com</host>
<port>9000</port>
</replica>
<replica>
<host>clickhouse-node2.example.com</host>
<port>9000</port>
</replica>
</shard>
<!-- Shard 2 -->
<shard>
<weight>1</weight>
<replica>
<host>clickhouse-node3.example.com</host>
<port>9000</port>
</replica>
<replica>
<host>clickhouse-node4.example.com</host>
<port>9000</port>
</replica>
</shard>
</default>
</remote_servers>
<!-- ZooKeeper для координации -->
<zookeeper>
<node>
<host>zookeeper-1.example.com</host>
<port>2181</port>
</node>
<node>
<host>zookeeper-2.example.com</host>
<port>2181</port>
</node>
<node>
<host>zookeeper-3.example.com</host>
<port>2181</port>
</node>
</zookeeper>
</clickhouse>
users.xml (Безопасность)
<?xml version="1.0"?>
<users>
<default>
<!-- Пустой пароль для разработки -->
<password></password>
<networks>
<ip>::/0</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
</default>
<analytics>
<password_sha256_hex>abc123...</password_sha256_hex> <!-- Хеш пароля -->
<networks>
<ip>10.0.0.0/8</ip> <!-- Только из локальной сети -->
</networks>
<profile>analytics</profile>
<quota>analytics_quota</quota>
<allow_databases>
<database>analytics</database>
<database>logs</database>
</allow_databases>
</analytics>
<readonly_user>
<password_sha256_hex>def456...</password_sha256_hex>
<networks>
<ip>::/0</ip>
</networks>
<readonly>1</readonly> <!-- Только чтение -->
<profile>readonly</profile>
</readonly_user>
</users>
3. Создание Таблиц
Простая MergeTree таблица
CREATE TABLE events (
timestamp DateTime,
user_id UInt64,
event_name String,
event_value Float32,
event_data JSON
) ENGINE = MergeTree()
ORDER BY timestamp
TTL timestamp + INTERVAL 90 DAY; -- Удалять старые данные
Распределённая таблица (для кластера)
-- На каждом сервере создаём локальную таблицу
CREATE TABLE events_local (
timestamp DateTime,
user_id UInt64,
event_name String
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/events', '{replica}')
ORDER BY timestamp;
-- Затем создаём распределённую таблицу для queries
CREATE TABLE events AS events_local
ENGINE = Distributed('default', 'default', 'events_local', rand());
4. Репликация
-- Таблица с репликацией через ZooKeeper
CREATE TABLE events_replicated (
id UInt64,
timestamp DateTime,
message String
) ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/events', -- ZooKeeper path
'replica-1' -- Replica name
)
PARTITION BY toYYYYMM(timestamp)
ORDER BY (timestamp, id);
5. Шардирование
-- Создаём локальную таблицу на каждом сервере
CREATE TABLE events_shard (
id UInt64,
user_id UInt64,
timestamp DateTime,
message String
) ENGINE = MergeTree()
ORDER BY timestamp;
-- Создаём распределённую таблицу
CREATE TABLE events_distributed AS events_shard
ENGINE = Distributed(
'default', -- cluster name
'default', -- database
'events_shard', -- local table
hash(user_id) -- sharding key
);
-- Теперь INSERT/SELECT автоматически шардируются
INSERT INTO events_distributed VALUES (1, 100, now(), 'test');
SELECT COUNT(*) FROM events_distributed; -- Агрегирует с обоих шардов
6. Оптимизация Производительности
Используй правильные типы данных
-- ❌ Неэффективно
CREATE TABLE events (
id String, -- UUID как String
value Decimal(18, 2)
);
-- ✅ Эффективно
CREATE TABLE events (
id UUID,
value Float32
);
Используй примарный ключ правильно
-- ❌ Медленно: порядок не оптимален
CREATE TABLE events (
event_name String,
timestamp DateTime
) ENGINE = MergeTree()
ORDER BY event_name;
-- ✅ Быстро: сначала часто используемые
CREATE TABLE events (
timestamp DateTime,
event_name String,
user_id UInt64
) ENGINE = MergeTree()
ORDER BY (timestamp, event_name);
Партиционирование
CREATE TABLE events (
timestamp DateTime,
user_id UInt64,
message String
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(timestamp) -- Партиции по месяцам
ORDER BY timestamp;
7. Мониторинг
# Python скрипт для мониторинга
import requests
import json
from datetime import datetime
def check_clickhouse_health():
# Проверка состояния сервера
response = requests.get('http://localhost:8123/ping')
print(f"Server status: {response.status_code}")
# Получить информацию о БД
query = "SELECT database, table, rows FROM system.tables FORMAT JSON"
response = requests.post(
'http://localhost:8123/',
params={'query': query}
)
tables = json.loads(response.text)
for table in tables['data']:
print(f"Table: {table['database']}.{table['table']} - {table['rows']} rows")
# Метрики производительности
query = "SELECT metric, value FROM system.metrics"
response = requests.post(
'http://localhost:8123/',
params={'query': query}
)
print(f"Metrics: {response.text}")
if __name__ == '__main__':
check_clickhouse_health()
8. Обслуживание
# Проверить размер данных
du -sh /var/lib/clickhouse/
# Бэкап
clickhouse-client --query="BACKUP DATABASE analytics"
# Восстановление
clickhouse-client --query="RESTORE DATABASE analytics"
# Optimize таблицы (слияние партиций)
clickhouse-client --query="OPTIMIZE TABLE events FINAL"
# Просмотр логов
tail -f /var/log/clickhouse-server/clickhouse-server.log
Production Deployment Checklist
✅ ZooKeeper настроен для координации ✅ Нескольких реплик для каждого шарда ✅ Правильные TTL для старых данных ✅ Мониторинг включён ✅ Резервные копии настроены ✅ Пароли для пользователей установлены ✅ Firewall настроен (9000 для TCP, 8123 для HTTP) ✅ Достаточно дискового пространства ✅ Partitioning стратегия определена ✅ Профилирование queries в production
ClickHouse — это мощный инструмент для аналитики и требует внимательной конфигурации для production развертывания.