Visão geral
Este guia mostra como usar ClickHouse e S3 para implementar uma arquitetura com armazenamento e computação separados.
A separação entre armazenamento e computação significa que os recursos de computação e de armazenamento são gerenciados de forma independente. No ClickHouse, isso proporciona melhor escalabilidade, eficiência de custos e flexibilidade. Você pode escalar os recursos de armazenamento e computação separadamente, conforme necessário, otimizando desempenho e custos.
Usar ClickHouse com S3 como backend é especialmente útil em casos de uso em que o desempenho de consulta sobre dados "frios" é menos crítico. O ClickHouse oferece suporte ao uso do S3 como armazenamento para a engine MergeTree por meio da S3BackedMergeTree. Esse mecanismo de tabela permite aproveitar a escalabilidade e os benefícios de custo do S3, mantendo o desempenho de inserção e consulta da engine MergeTree.
Observe que implementar e gerenciar uma arquitetura com separação entre armazenamento e computação é mais complexo do que em implantações padrão do ClickHouse. Embora o ClickHouse autogerenciado permita a separação entre armazenamento e computação, como discutido neste guia, recomendamos o uso do ClickHouse Cloud, que permite usar o ClickHouse nessa arquitetura sem necessidade de configuração, por meio da mecanismo de tabela SharedMergeTree.
Este guia pressupõe que você esteja usando o ClickHouse versão 22.8 ou superior.
Use o S3 como disco do ClickHouse
Criando um disco
Crie um novo arquivo no diretório config.d do ClickHouse para armazenar a configuração de storage:
vim /etc/clickhouse-server/config.d/storage_config.xmlCopie o XML a seguir para o arquivo recém-criado, substituindo BUCKET, ACCESS_KEY_ID, SECRET_ACCESS_KEY pelas informações do bucket da AWS no qual você deseja armazenar seus dados:
<clickhouse>
<storage_configuration>
<disks>
<s3_disk>
<type>s3</type>
<endpoint>$BUCKET</endpoint>
<access_key_id>$ACCESS_KEY_ID</access_key_id>
<secret_access_key>$SECRET_ACCESS_KEY</secret_access_key>
<metadata_path>/var/lib/clickhouse/disks/s3_disk/</metadata_path>
</s3_disk>
<s3_cache>
<type>cache</type>
<disk>s3_disk</disk>
<path>/var/lib/clickhouse/disks/s3_cache/</path>
<max_size>10Gi</max_size>
</s3_cache>
</disks>
<policies>
<s3_main>
<volumes>
<main>
<disk>s3_disk</disk>
</main>
</volumes>
</s3_main>
</policies>
</storage_configuration>
</clickhouse>Se você precisar detalhar ainda mais as configurações do disco S3, por exemplo, para especificar uma region ou enviar um header HTTP personalizado, você pode encontrar a lista de configurações relevantes aqui.
Você também pode substituir access_key_id e secret_access_key pelo seguinte, que tentará obter credenciais das variáveis de ambiente e dos metadados do Amazon EC2:
<use_environment_credentials>true</use_environment_credentials>Depois de criar o arquivo de configuração, você precisa alterar o proprietário do arquivo para o usuário e o grupo clickhouse:
chown clickhouse:clickhouse /etc/clickhouse-server/config.d/storage_config.xmlAgora, você pode reiniciar o servidor ClickHouse para que as alterações entrem em vigor:
service clickhouse-server restartCriar uma tabela armazenada no S3
Para testar se o disco S3 foi configurado corretamente, podemos tentar criar e consultar uma tabela.
Crie uma tabela especificando a nova política de armazenamento S3:
CREATE TABLE my_s3_table
(
`id` UInt64,
`column1` String
)
ENGINE = MergeTree
ORDER BY id
SETTINGS storage_policy = 's3_main';Observe que não foi necessário especificar o engine como S3BackedMergeTree. O ClickHouse converte automaticamente o tipo de engine internamente se detectar que a tabela está usando S3 para armazenamento.
Mostre que a tabela foi criada com a política correta:
SHOW CREATE TABLE my_s3_table;O resultado deverá ser o seguinte:
┌─statement────────────────────────────────────────────────────
│ CREATE TABLE default.my_s3_table
(
`id` UInt64,
`column1` String
)
ENGINE = MergeTree
ORDER BY id
SETTINGS storage_policy = 's3_main', index_granularity = 8192
└──────────────────────────────────────────────────────────────Agora, vamos inserir algumas linhas na nossa nova tabela:
INSERT INTO my_s3_table (id, column1)
VALUES (1, 'abc'), (2, 'xyz');Vamos verificar se as linhas foram inseridas:
SELECT * FROM my_s3_table;┌─id─┬─column1─┐
│ 1 │ abc │
│ 2 │ xyz │
└────┴─────────┘
2 rows in set. Elapsed: 0.284 sec.No console da AWS, se seus dados foram inseridos com sucesso no S3, você deverá ver que o ClickHouse criou novos arquivos no bucket especificado.
Se tudo funcionou como esperado, agora você está usando o ClickHouse com storage e compute separados!

Implementação de replicação para tolerância a falhas (opcional)
Para tolerância a falhas, você pode usar vários nós do servidor ClickHouse distribuídos por várias regiões da AWS, com um bucket do S3 para cada nó.
A replicação com disks S3 pode ser realizada usando o table engine ReplicatedMergeTree. Consulte o guia a seguir para obter detalhes: