Копирование журналов и логов


В Astra-monitoring используется ClickHouse для хранения пользовательских данных логов и событий.

ClickHouse поддерживает несколько методов резервного копирования. В этой документации рассмотрим процесс бэкапа для развертывания через Docker Compose с использованием:

  • clickhouse-backup (официальный инструмент для бэкапов)

  • Встроенных функций ClickHouse (FREEZE и COPY)

Подготовка к бэкапу docker-compose

  1. Убедитесь, что у вас есть доступ к хосту с ClickHouse

  2. Проверьте конфигурацию в docker-compose.yml:

    vmectrics-backup-pvc.yaml
    services:
      clickhouse:
        volumes:
        - ./clickhouse/data:/var/lib/clickhouse
        - ./clickhouse/config/config.xml:/etc/clickhouse-server/config.xml:ro
        - ./clickhouse/init:/docker-entrypoint-initdb.d
    

    Запомните пути ./clickhouse/data и /path/to/config

  3. Установите утилиту clickhouse-backup:

    shell
    docker pull altinity/clickhouse-backup
    
  4. Создайте конфигурационный файл для clickhouse-backup:

    shell
    mkdir -p /etc/clickhouse-backup
    cat > /etc/clickhouse-backup/config.yml <<EOL
    clickhouse:
      username: default
      password: ""
      host: localhost
      port: 9000
      data_path: "/var/lib/clickhouse"
      skip_tables:
        - system.*
    backup:
      path: "/var/lib/clickhouse/backup"
      compression_format: tar
      # Для инкрементальных бэкапов
      incremental_by_partition: true
    EOL
    

Резервное копирование docker-compose

При разворачивании astra-monitoring через docker-compose в директорию добавлен готовый скрипт бэкапа clickhouse.

  1. Создать директорию для бэкапов:

    shell
    mkdir /opt/am/astra-monitoring/clickhouse/backups
    
  2. Указать путь в скрипте ch-backup.sh:

    shell
    BACKUP_DIR="/opt/am/astra-monitoring/clickhouse/backups"
    
  3. Настроить расписание в cron:

    cron
    0 2 * * * /opt/am/astra-monitoring/clickhouse/tools/ch-backup.sh
    

Полное резервное копирование docker-compose

Способ 1: Использование clickhouse-backup

  1. Создайте директорию для бэкапов:

    shell
    mkdir -p /backup/clickhouse/full
    
  2. Выполните полный бэкап:

    shell
    docker run --rm \
      -v ./clickhouse/data:/var/lib/clickhouse \
      -v /backup/clickhouse/full:/var/lib/clickhouse/backup \
      -v /etc/clickhouse-backup:/etc/clickhouse-backup \
      --network clickhouse_network \ # Укажите вашу сеть
      altinity/clickhouse-backup create full_backup_$(date +%Y-%m-%d_%H-%M-%S)
    
  3. Проверьте список бэкапов:

    shell
    docker run --rm \
      -v ./clickhouse/data:/var/lib/clickhouse \
      -v /etc/clickhouse-backup:/etc/clickhouse-backup \
      altinity/clickhouse-backup list
    

Способ 2: Ручной бэкап с FREEZE

  1. Подключитесь к ClickHouse:

    shell
    docker exec -it clickhouse_server clickhouse-client
    
  2. Для каждой таблицы выполните:

    shell
    ALTER TABLE database.table FREEZE WITH NAME 'backup_$(date +%Y-%m-%d)';
    
  3. Скопируйте данные:

    shell
    cp -r ./clickhouse/data/shadow/backup_* /backup/clickhouse/manual/
    

Инкрементальное резервное копирование

Использование clickhouse-backup

  1. Создайте директорию для инкрементальных бэкапов:

    shell
    mkdir -p /backup/clickhouse/incremental
    
  2. Выполните инкрементальный бэкап:

    shell
    docker run --rm \
      -v ./clickhouse/data:/var/lib/clickhouse \
      -v /backup/clickhouse/incremental:/var/lib/clickhouse/backup \
      -v /etc/clickhouse-backup:/etc/clickhouse-backup \
      --network clickhouse_network \
      altinity/clickhouse-backup create incremental_backup_$(date +%Y-%m-%d_%H-%M-%S) --diff-from=full_backup_2025-01-01
    

Использование партиций

  1. Определите новые партиции:

    shell
    SELECT partition_id 
    FROM system.parts 
    WHERE table = 'your_table' 
      AND modification_time > now() - interval 1 day;
    
  2. Скопируйте только новые партиции:

    shell
    for part in $(clickhouse-client -q "SELECT partition_id FROM system.parts WHERE..."); do
      cp -r ./clickhouse/data/data/database/table/$part /backup/clickhouse/incremental/
    done
    

Восстановление из бэкапа docker-compose

Способ 1: Использование clickhouse-backup

  1. Остановите запись в ClickHouse (если возможно)

  2. Восстановите полный бэкап:

    shell
    docker run --rm \
      -v ./clickhouse/data:/var/lib/clickhouse \
      -v /backup/clickhouse/full:/var/lib/clickhouse/backup \
      -v /etc/clickhouse-backup:/etc/clickhouse-backup \
      --network clickhouse_network \
      altinity/clickhouse-backup restore full_backup_2023-01-01
    
  3. Для инкрементального восстановления сначала восстановите полный бэкап, затем:

    shell
    docker run --rm \
      -v ./clickhouse/data:/var/lib/clickhouse \
      -v /backup/clickhouse/incremental:/var/lib/clickhouse/backup \
      -v /etc/clickhouse-backup:/etc/clickhouse-backup \
      --network clickhouse_network \
      altinity/clickhouse-backup restore incremental_backup_2023-01-02
    

Способ 2: Ручное восстановление

  1. Скопируйте данные из бэкапа в директорию detached:

    shell
    cp -r /backup/clickhouse/manual/backup_*/* ./clickhouse/data/data/database/table/detached/
    
  2. Подключитесь к ClickHouse и выполните:

    shell
    ALTER TABLE database.table ATTACH PARTITION ID 'partition_id';
    

Автоматизация бэкапов docker-compose

  1. Создайте скрипт для полного бэкапа (/usr/local/bin/clickhouse_backup_full.sh):

    shell
    #!/bin/bash
    BACKUP_DIR="/backup/clickhouse/full"
    DATE=$(date +%Y-%m-%d_%H-%M-%S)
    
    docker run --rm \
      -v ./clickhouse/data:/var/lib/clickhouse \
      -v $BACKUP_DIR:/var/lib/clickhouse/backup \
      -v /etc/clickhouse-backup:/etc/clickhouse-backup \
      --network clickhouse_network \
      altinity/clickhouse-backup create full_$DATE
    
    # Ротация бэкапов (храним 7 последних)
    ls -dt $BACKUP_DIR/full_* | tail -n +8 | xargs rm -rf
    
  2. Создайте скрипт для инкрементального бэкапа (/usr/local/bin/clickhouse_backup_incremental.sh):

    shell
    #!/bin/bash
    BACKUP_DIR="/backup/clickhouse/incremental"
    DATE=$(date +%Y-%m-%d_%H-%M-%S)
    LAST_FULL=$(ls -dt /backup/clickhouse/full/full_* | head -n1 | xargs basename)
    
    docker run --rm \
      -v ./clickhouse/data:/var/lib/clickhouse \
      -v $BACKUP_DIR:/var/lib/clickhouse/backup \
      -v /etc/clickhouse-backup:/etc/clickhouse-backup \
      --network clickhouse_network \
      altinity/clickhouse-backup create incremental_$DATE --diff-from=$LAST_FULL
    
    # Ротация бэкапов (храним 30 последних)
    ls -dt $BACKUP_DIR/incremental_* | tail -n +31 | xargs rm -rf
    
  3. Настройте cron:

    cron
    # Полный бэкап каждое воскресенье в 2:00
    0 2 * * 0 /usr/local/bin/clickhouse_backup_full.sh
    
    cron
    # Инкрементальный бэкап каждый день в 3:00
    0 3 * * * /usr/local/bin/clickhouse_backup_incremental.sh
    

Резервное копирование helm

В astra-monitoring при установке в кластер Kubernetes предусмотрено создание автоматических резервных копий базы данных ClickHouse (CronJob).

Параметры резервного копирования:

  • Расписание: ежедневно в 2:00 UTC

  • Полные резервные копии создаются каждую неделю (1-й, 8-й и т.д. день)

  • Инкрементальные копии создаются между полными бэкапами

  • Глубина восстановления определяется параметром base_backup_copies_number:

    • 1 - восстановление за 7 дней

    • 2 - восстановление за 14 дней

  • Хранилище: PVC Kubernetes pvc-{{ $.Release.Name }}-clickhouse-backup


Конфигурация работы сервиса в values.yaml:

values.yaml
clickhouse:
  # Включить регулярный бекап бд
  db_backup_enabled: "true"
  # Название и путь до образа
  db_backup_image: registry.astralinux.ru/am/ch-backup-db
  # Версия образа
  db_backup_tag: 0.21
  # Количество хранимых базовых бекапов
  base_backup_copies_number: 1
  # Таймаут для подключения к инстансу бд (минуты)
  db_management_timeout: 5
  # Порт для подключения к инстансу бд
  db_management_port: 9000