Clickhouse Backup e Restore

Tutorial para efetuar Backup e Restore do Clickhouse

Dependências

  1. Clickhouse, v24.1.5.6-stable, Sistema de Gerênciamento de Banco de Dados colunar (TESTADO NA VERSÃO 24,VERSÕES ANTERIORES PODEM NÃO FUNCIONAR)

Backup Nativo e por terceiros

Das maneiras que existem de realizar o backup dos bancos de dados clickhouse dois se destacam, BACKUP/RESTORE nativo e o utilitario clickhouse-backup da Altiniti, dos quais cada um apresenta vantagens e desvantagens.

A forma nativa possui a vantagem de não precisar instalar outros softwares, escolher o local onde os backups são salvos, salvar como apenas um arquivo compactado e escolher o nome do banco para realizar restore, isso é vantajoso para situações em que se necessita restaurar um banco do backup sem ter que deletar ou alterar o ja existente. Como desvantagem possui uma lentidão muito alta para bancos de dados muito grandes (pode ser resolvido parcialmente com incremental backups).

Ja o clickhouse-backup da Altiniti possui como principal vantagem a velocidade, mesmo que o banco possua dezenas ou centenas de gigabytes, o backup é realizado em alguns segundos. Entretanto, possui desvantagens como instalação por copia do binário, não sendo gerenciada por um gerenciador de pacotes. Além disso os backups são sempre obrigatóriamente realizados dentro do diretório backup dentro do diretório de dados do clickhouse, os backups são salvos em diretórios, não é possível realizar o restore de um backup caso ja exista um banco com o mesmo nome.

Backup nativo

Crie um arquivo chamado /etc/clickhouse-server/config.d/backup_disk.xml com as seguintes informações para adicionar um novo local de disco:

<clickhouse>
    <!-- Storage do clickhouse -->
    <storage_configuration>
        <disks>
            <backups>
                <type>local</type>
                <path>/home/backup/</path>
            </backups>
        </disks>
    </storage_configuration>

    <!-- Label do storage -->
    <backups>
        <allowed_disk>backups</allowed_disk>
        <allowed_path>/home/backup/</allowed_path>
    </backups>
</clickhouse>

Verifique com:

SELECT
    name,
    path,
    formatReadableSize(free_space) AS free,
    formatReadableSize(total_space) AS total,
    formatReadableSize(keep_free_space) AS reserved
FROM system.disks

Exemplos de uso

Estes são exemplos básicos de uso, para exemplos mais complexos favor consultar a documentação citada na seção Links.
Com relação ao nome do arquivo, é obrigatorio o uso da extensão .zip ou .tar (sem encriptação).
Clickhouse é case sensetive, ou seja, comandos como ... TO DISK(...) ... geram erros.

# 1. Backup Database:
BACKUP DATABASE dbName TO Disk('backups', 'filename.zip') SETTINGS compression_method='lzma'

# 2. Restore Database:
RESTORE DATABASE dbName from Disk('backups', 'filename.zip')

# 3. Restore Database com novo nome
RESTORE DATABASE dbName as newdbName. from Disk('backups', 'filename.zip')

# 4. Backup Database incremental, os nomes dos arquivos devem ser diferentes
BACKUP TABLE dbName TO Disk('backups', 'incremental.zip') SETTINGS compression_method='lzma', base_backup = Disk('backups', 'filename.zip') 

# 5.  Backup Table:
BACKUP TABLE dbName.tableName TO Disk('backups', 'filename.zip') SETTINGS compression_method='lzma'

# 6.  Restore Table:
RESTORE Table dbName.tableName from Disk('backups', 'filename.zip')

# 7. Restore Table com novo nome
RESTORE Table dbName as dbName.newTableName from Disk('backups', 'filename.zip')

DETALHES IMPORTANTES

  1. Quando foram efetuados testes com um restore de um banco maior(10 GB), houve uma situação adversa em relação a timeout ao ser executado o Backup da Database: Independente do timeout definido, o clickhouse retornou a seguinte mensagem

    Timeout exceeded while receiving data from server. Waited for 10 seconds, timeout is 10 seconds.
    Cancelling query.

Este cancelamento de query levou uma hora para ser finalizado ,logo nos próximos testes foi-se pressionado Ctrl+C para não precissar esperar todo este tempo. No entanto, foi notado que o arquivo zip do backup continuava aumentando de tamanho como se o backup ainda estivesse vivo e após decorrido o tempo do backup, o arquivo .lock (que impede que qualquer outro processo interfira com o arquivo zip no meio do backup) sumiu e o tamanho parou de aumentar. O restore foi testado e foi obtido sucesso.

Ao permitir que o cancelamento de query fosse até o fim de maneira natural também houve sucesso no Backup e no Restore.

CONCLUSÃO: Até o momento da escrita deste relatório e pelos testes efetuados e resultados obtidos, o Timeout pareceu ser irrelevante para o Backup e pode ser tratado da maneira que o usuário preferir.

  1. Como alterar o timeout (há outras maneiras mais permanentes porém não foram testadas):

    clickhouse-client --receive-timeout=(tempo em segundos) --send_timeout=(tempo em segundos)

Para conferir o timeout atual rode dentro do clickhouse:

    select * from system.settings where name in ('send_timeout','receive_timeout')
  1. Caso haja erro de experimental_object_type, rodar set allow_experimental_object_type = 1 no clickhouse que o problema se resolve

  2. Clickhouse não possui diretamente um comando para deletar backups, tendo que deletar diretamente o arquivo no diretorio. Entretando isso ira quebrar a consulta SELECT * FROM system.backups. Caso queira corrigir a consulta remova o arquivo /etc/clickhouse-server/config.d/backup_disk.xml, os arquivos de backup dentro do diretório de backups e reinicie o server. Quanto reiniciar coloque novamente o arquivo XML de configuração e reinicie o server.

Backup com clickhouse-backup

Download

Baixe o binário compilado do repositório e copie para o diretório de binarios:

wget https://github.com/Altinity/clickhouse-backup/releases/download/v2.5.12/clickhouse-backup-linux-amd64.tar.gz

tar -zxvf clickhouse-backup-linux-amd64.tar.gz
cp build/linux/amd64/clickhouse-backup /usr/bin/clickhouse-backup
rm -rf clickhouse-backup-linux-amd64.tar.gz
rm -rf build

Exemplos

Devido ao clickhouse-backup sempre escrever os logs na saída padrão (não foi encontrado como desativar), em alguns comandos é utilizado bash para limpar a saída:

# Listar todas as tabelas para backup
clickhouse-backup tables | tail +11 | head -n -1

# Listar todos os backups existentes
clickhouse-backup list | tail +6 | head -n -1

# OBS: Todos os comandos de create backup salvam os arquivos no diretorio de dados do clickhouse
# EX: /home/clickhouse/backup

# Realizar backup completo de nome full_backup
clickhouse-backup create full_backup

# Realizar backup de uma unica tabela ou banco
clickhouse-backup create --table='default.hits' hits_backup
clickhouse-backup create --table='default.*' default_backup

# Restaurar backup
clickhouse-backup restore hits_backup
clickhouse-backup restore --rm hits_backup

# Deletar backup
clickhouse-backup delete local hits_backup