Neste exemplo, você aprenderá a configurar um cluster ClickHouse simples que oferece replicação e escalabilidade. Ele consiste em dois shards e duas réplicas, com um cluster ClickHouse Keeper de 3 nós para gerenciar a coordenação e manter o quórum no cluster.A arquitetura do cluster que você configurará é mostrada abaixo:
Embora seja possível executar o ClickHouse Server e o ClickHouse Keeper juntos no mesmo servidor,
recomendamos fortemente usar hosts dedicados para o ClickHouse Keeper em ambientes de produção,
e essa é a abordagem que demonstraremos neste exemplo.Os servidores do Keeper podem ser menores, e 4 GB de RAM geralmente bastam para cada servidor do Keeper
até que seus servidores ClickHouse atinjam grande porte.
Pré-requisitos
- Você já configurou anteriormente um servidor ClickHouse local
- Você está familiarizado com conceitos básicos de configuração do ClickHouse, como arquivos de configuração
- Você tem o Docker instalado na sua máquina
1
Configurar a estrutura de diretórios e o ambiente de teste
Neste tutorial, você usará o Docker compose para
configurar o cluster do ClickHouse. Esta configuração pode ser adaptada para funcionar
em máquinas locais separadas, máquinas virtuais ou instâncias de nuvem também.Execute os seguintes comandos para configurar a estrutura de diretórios deste exemplo:Adicione o seguinte arquivo Crie os seguintes subdiretórios e arquivos:
docker-compose.yml ao diretório clickhouse-cluster:docker-compose.yml
- O diretório
config.dcontém o arquivo de configuração do servidor ClickHouseconfig.xml, no qual é definida a configuração personalizada de cada nó do ClickHouse. Essa configuração é combinada com o arquivo de configuração padrãoconfig.xmldo ClickHouse, incluído em toda instalação do ClickHouse. - O diretório
users.dcontém o arquivo de configuração de usuáriosusers.xml, no qual é definida a configuração personalizada dos usuários. Essa configuração é combinada com o arquivo de configuração padrãousers.xmldo ClickHouse, incluído em toda instalação do ClickHouse.
2
Configurar nós do ClickHouse
Configuração do servidor
Agora modifique cada arquivo de configuração vazioconfig.xml localizado em
fs/volumes/clickhouse-{}/etc/clickhouse-server/config.d. As linhas que estão
destacadas abaixo precisam ser alteradas para serem específicas a cada nó:Cada seção do arquivo de configuração acima é explicada com mais detalhes a seguir.
Rede e logging
A comunicação externa pela interface de rede é habilitada ao ativar a configuração listen_host. Isso garante que o host do servidor ClickHouse possa ser acessado por outros hosts:8123:9000:<logger>. Esta configuração de exemplo
gera um log de depuração que será rotacionado em 1000M três vezes:Configuração do cluster
A configuração do cluster é definida no bloco<remote_servers>.
Aqui é definido o nome do cluster cluster_2S_2R.O bloco <cluster_2S_2R></cluster_2S_2R> define o layout do cluster,
utilizando as configurações <shard></shard> e <replica></replica>, e serve como
template para consultas de DDL distribuído, que são queries executadas em todo o
cluster por meio da cláusula ON CLUSTER. Por padrão, as consultas de DDL distribuído
são permitidas, mas também podem ser desativadas com a configuração allow_distributed_ddl_queries.internal_replication está definido como true para que os dados sejam gravados em apenas uma das réplicas.<cluster_2S_2R></cluster_2S_2R> define o layout do cluster
e serve como template para queries de DDL distribuído, que são queries executadas
em todo o cluster usando a cláusula ON CLUSTER.Configuração do Keeper
A seção<ZooKeeper> informa ao ClickHouse onde o ClickHouse Keeper (ou ZooKeeper) está em execução.
Como estamos usando um cluster do ClickHouse Keeper, cada <node> do cluster precisa ser especificado,
junto com seu hostname e número de porta, por meio das tags <host> e <port>, respectivamente.A configuração do ClickHouse Keeper é explicada na próxima etapa do tutorial.Embora seja possível executar o ClickHouse Keeper no mesmo servidor que o ClickHouse Server,
em ambientes de produção, recomendamos fortemente que o ClickHouse Keeper seja executado em servidores dedicados.
Configuração de macros
Além disso, a seção<macros> é usada para definir substituições de parâmetros para
tabelas replicadas. Elas são listadas em system.macros e permitem o uso de substituições
como {shard} e {replica} em queries.Configuração de usuário
Agora modifique cada arquivo de configuração vaziousers.xml localizado em
fs/volumes/clickhouse-{}/etc/clickhouse-server/users.d com o seguinte conteúdo:/users.d/users.xml
Neste exemplo, o arquivo
users.xml é idêntico em todos os nós do cluster.3
Configurar o ClickHouse Keeper
Em seguida, você vai configurar o ClickHouse Keeper, que é usado para coordenação.Crie os arquivos Modifique os arquivos de configuração vazios criados em cada
diretório de nó A seção a seguir é usada para configurar os servidores que participam do
quórum do algoritmo de consenso Raft:
Configuração do Keeper
Para que a replicação funcione, é necessário configurar e implantar um cluster do ClickHouse Keeper. O ClickHouse Keeper fornece o sistema de coordenação para a replicação de dados, atuando como um substituto direto do ZooKeeper, que também pode ser usado. No entanto, o ClickHouse Keeper é recomendado, pois oferece melhores garantias e confiabilidade, além de usar menos recursos do que o ZooKeeper. Para alta disponibilidade e para manter o quórum, recomenda-se executar pelo menos três nós do ClickHouse Keeper.O ClickHouse Keeper pode ser executado em qualquer nó do cluster junto com o ClickHouse, embora
seja recomendável executá-lo em um nó dedicado, o que permite escalar e
gerenciar o cluster do ClickHouse Keeper independentemente do cluster do banco de dados.
keeper_config.xml para cada nó do ClickHouse Keeper
usando o comando abaixo a partir da raiz da pasta de exemplo:fs/volumes/clickhouse-keeper-{}/etc/clickhouse-keeper. As
linhas destacadas abaixo precisam ser ajustadas para cada nó:/clickhouse-keeper/keeper_config.xml
Cada arquivo de configuração conterá a seguinte configuração exclusiva (mostrada abaixo).
O
server_id usado deve ser exclusivo para esse nó específico do ClickHouse Keeper
no cluster e corresponder ao <id> do servidor definido na seção <raft_configuration>.
tcp_port é a porta usada pelos clientes do ClickHouse Keeper.4
Teste a configuração
Verifique se o Docker está em execução na sua máquina.
Inicie o cluster com o comando Você deverá ver o Docker começar a baixar as imagens do ClickHouse e do Keeper,
e depois iniciar os contêineres:Para verificar se o cluster está em execução, conecte-se a qualquer um dos nós e execute a
consulta a seguir. O comando para se conectar ao primeiro nó é o seguinte:Se tudo ocorrer conforme esperado, você verá o prompt do ClickHouse client:Execute a seguinte consulta para verificar quais topologias de cluster estão definidas em quais
hosts:Execute a seguinte consulta para verificar o status do cluster do ClickHouse Keeper:O comando A resposta abaixo mostra um exemplo de resposta de um nó seguidor:A resposta abaixo mostra um exemplo de resposta de um nó líder:Com isso, você configurou com sucesso um cluster do ClickHouse com dois shards e duas réplicas.
Na próxima etapa, você criará uma tabela no cluster.
docker-compose up a partir da raiz do diretório cluster_2S_2R:Query
Response
Query
Response
mntr também é comumente usado para verificar se o ClickHouse Keeper está
em execução e para obter informações de estado sobre a relação entre os três nós do Keeper.
Na configuração usada neste exemplo, há três nós trabalhando juntos.
Os nós elegerão um líder, e os nós restantes serão seguidores.O comando mntr fornece informações relacionadas ao desempenho e indica se um determinado
nó é seguidor ou líder.Execute o comando abaixo em um shell no clickhouse-keeper-01, clickhouse-keeper-02 e
clickhouse-keeper-03 para verificar o status de cada nó do Keeper. O comando
para clickhouse-keeper-01 é mostrado abaixo:Response
Response
5
Criar um banco de dados
Agora que você verificou que o cluster está configurado corretamente e em execução,
você recriará a mesma tabela usada no tutorial do conjunto de dados de exemplo preços de imóveis no Reino Unido.
Ela contém cerca de 30 milhões de linhas com os valores pagos
por imóveis na Inglaterra e no País de Gales desde 1995.Conecte-se ao cliente de cada host executando cada um dos comandos a seguir em abas ou janelas
de terminal separadas:Você pode executar a consulta abaixo no clickhouse-client de cada host para confirmar que ainda não foi criado nenhum banco de dados,
além dos bancos de dados padrão:No cliente Você pode executar novamente a mesma consulta de antes a partir do cliente de cada host
para confirmar que o banco de dados foi criado em todo o cluster, apesar de a
consulta ter sido executada apenas a partir de
Query
Response
clickhouse-01, execute a seguinte consulta DDL distribuída usando a
cláusula ON CLUSTER para criar um novo banco de dados chamado uk:clickhouse-01:6
Crie uma tabela no cluster
Agora que o banco de dados foi criado, você criará uma tabela com replicação.Execute a seguinte consulta em qualquer um dos clientes host:Observe que ela é idêntica à consulta usada na instrução
O parâmetroonde:
CREATE original do
tutorial do conjunto de dados de exemplo preços de imóveis do Reino Unido,
exceto pela cláusula ON CLUSTER e pelo uso do motor ReplicatedMergeTree.A cláusula ON CLUSTER foi projetada para a execução distribuída de consultas DDL (Data Definition Language),
como CREATE, DROP, ALTER e RENAME, garantindo que essas
alterações no esquema sejam aplicadas em todos os nós de um cluster.O motor ReplicatedMergeTree
funciona exatamente como o motor de tabela MergeTree comum, mas também replica os dados.
Ele exige a especificação de dois parâmetros:zoo_path: O path do Keeper/ZooKeeper para os metadados da tabela.replica_name: O nome da réplica da tabela.
O parâmetro
zoo_path pode ser definido como qualquer valor de sua escolha, embora seja recomendável seguir
a convenção de usar o prefixo{database}e{table}serão substituídos automaticamente.{shard}e{replica}são macros que foram definidas anteriormente no arquivoconfig.xmlde cada nó do ClickHouse.
Query
Response
7
Inserir dados em uma tabela distribuída
Para inserir dados na tabela, Em cada host, agora você verá as seguintes tabelas no banco de dados Os dados podem ser inseridos na tabela Execute a seguinte consulta para confirmar que os dados inseridos foram distribuídos de forma uniforme
entre os nós do nosso cluster:
ON CLUSTER não pode ser usado, pois não
se aplica a consultas DML (Data Manipulation Language), como INSERT, UPDATE
e DELETE. Para inserir dados, é necessário usar o motor de tabela
Distributed.
Como você viu no guia para configurar um cluster com 2 shards e 1 réplica, tabelas distribuídas são tabelas que têm acesso a shards localizados em diferentes
hosts e são definidas com o motor de tabela Distributed.
A tabela distribuída atua como a interface entre todos os shards do cluster.Em qualquer um dos clientes nos hosts, execute a consulta a seguir para criar uma tabela distribuída
usando a tabela replicada existente que criamos no passo anterior:uk:uk_price_paid_distributed em qualquer um dos
clientes host usando a seguinte consulta: