← Назад к вопросам

как был развернут 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 развертывания.

как был развернут Clickhouse? | PrepBro