Pular para o conteúdo principal
Em uma plataforma SaaS de análise de dados, é comum que vários tenants, como organizações, clientes ou unidades de negócio, compartilhem a mesma infraestrutura de banco de dados, mantendo a separação lógica de seus dados. Isso permite que diferentes usuários acessem com segurança seus próprios dados dentro da mesma plataforma. Dependendo dos requisitos, há diferentes maneiras de implementar multitenancy. Abaixo, apresentamos um guia de como implementá-la com o ClickHouse Cloud.

Tabela compartilhada

Nessa abordagem, os dados de todos os tenants são armazenados em uma única tabela compartilhada, com um campo (ou conjunto de campos) usado para identificar os dados de cada tenant. Para maximizar o desempenho, esse campo deve ser incluído na chave primária. Para garantir que você só possa acessar os dados do tenant correspondente, usamos controle de acesso baseado em funções, implementado por meio de políticas de linha.
Recomendamos essa abordagem por ser a mais simples de gerenciar, principalmente quando todos os tenants compartilham o mesmo esquema de dados e os volumes de dados são moderados (< TBs)
Ao consolidar todos os dados dos tenants em uma única tabela, a eficiência de armazenamento melhora com a otimização da compressão de dados e a redução da sobrecarga de metadados. Além disso, as atualizações de esquema são simplificadas, já que todos os dados são gerenciados de forma centralizada. Esse método é particularmente eficaz para lidar com um grande número de tenants (potencialmente, milhões). No entanto, abordagens alternativas podem ser mais adequadas se os tenants tiverem esquemas de dados diferentes ou se houver tendência de divergirem ao longo do tempo. Nos casos em que há uma disparidade significativa no volume de dados entre os tenants, os menores podem sofrer impactos desnecessários no desempenho das consultas. Observe que esse problema é amplamente mitigado ao incluir o campo do tenant na chave primária.

Exemplo

Este é um exemplo de implementação de um modelo de multitenancy com tabela compartilhada. Primeiro, vamos criar uma tabela compartilhada com um campo tenant_id incluído na chave primária.
Vamos inserir dados fictícios.
Agora, vamos criar dois usuários: user_1 e user_2.
Criamos políticas de linha que restringem user_1 e user_2 a acessar apenas os dados de seus respectivos tenants.
Em seguida, conceda privilégios GRANT SELECT na tabela compartilhada usando uma role comum.
Agora você pode se conectar como user_1 e executar um SELECT simples. Apenas as linhas do primeiro tenant são retornadas.

Tabelas separadas

Nessa abordagem, os dados de cada tenant são armazenados em uma tabela separada no mesmo banco de dados, eliminando a necessidade de um campo específico para identificar tenants. O acesso do usuário é controlado por meio de uma instrução GRANT, garantindo que cada usuário possa acessar apenas as tabelas que contêm os dados dos seus tenants.
Usar tabelas separadas é uma boa opção quando os tenants têm esquemas de dados diferentes.
Em cenários com poucos tenants e conjuntos de dados muito grandes, nos quais o desempenho das consultas é crítico, essa abordagem pode ter desempenho superior ao de um modelo de tabela compartilhada. Como não é necessário filtrar os dados de outros tenants, as consultas podem ser mais eficientes. Além disso, as chaves primárias podem ser ainda mais otimizadas, já que não é preciso incluir um campo extra (como um ID de tenant) na chave primária. Observe que essa abordagem não escala para milhares de tenants. Consulte limites de uso.

Exemplo

Este é um exemplo de implementação do modelo de multi-tenancy com tabelas separadas. Primeiro, vamos criar duas tabelas: uma para os eventos do tenant_1 e outra para os eventos do tenant_2.
Vamos inserir dados fictícios.
Em seguida, vamos criar dois usuários user_1 e user_2.
Em seguida, conceda privilégios GRANT SELECT na tabela correspondente.
Agora você pode se conectar como user_1 e executar um select simples na tabela correspondente a esse usuário. Apenas as linhas do primeiro tenant são retornadas.

Bancos de dados separados

Os dados de cada tenant são armazenados em um banco de dados separado dentro do mesmo serviço ClickHouse.
Essa abordagem é útil se cada tenant precisar de um grande número de tabelas e, possivelmente, visões materializadas, além de ter um esquema de dados diferente. No entanto, ela pode se tornar difícil de gerenciar se o número de tenants for grande.
A implementação é semelhante à abordagem de tabelas separadas, mas, em vez de conceder privilégios no nível da tabela, os privilégios são concedidos no nível do banco de dados. Observe que essa abordagem não escala para milhares de tenants. Consulte os limites de uso.

Exemplo

Este é um exemplo de implementação de um modelo de multitenancy com bancos de dados separados. Primeiro, vamos criar dois bancos de dados, um para tenant_1 e um para tenant_2.
Vamos inserir dados fictícios.
Então, vamos criar dois usuários, user_1 e user_2.
Em seguida, conceda privilégios GRANT SELECT sobre a tabela correspondente.
Agora você pode se conectar como user_1 e executar uma consulta SELECT simples na tabela de eventos do banco de dados correspondente. Apenas as linhas do primeiro tenant são retornadas.

Separação compute-compute

As três abordagens descritas acima também podem ser isoladas ainda mais com o uso de Warehouses. Os dados são compartilhados por meio de um armazenamento de objetos comum, mas cada tenant pode ter seu próprio serviço de compute graças à separação compute-compute, com diferentes proporções de CPU e memória. O gerenciamento de usuários é semelhante ao das abordagens descritas anteriormente, já que todos os serviços em um warehouse compartilham controles de acesso. Observe que o número de serviços filhos em um warehouse é limitado. Consulte Limitações do warehouse.

Serviço em nuvem separado

A abordagem mais radical é usar um serviço ClickHouse diferente para cada tenant.
Esse método, menos comum, pode ser uma solução quando os dados dos tenants precisam ser armazenados em diferentes regiões, por motivos legais, de segurança ou de proximidade.
Uma conta de usuário deve ser criada em cada serviço ao qual o usuário terá acesso aos dados do respectivo tenant. Essa abordagem é mais difícil de gerenciar e adiciona sobrecarga a cada serviço, já que cada um deles exige sua própria infraestrutura para operar. Os serviços podem ser gerenciados por meio da ClickHouse Cloud API, e a orquestração também pode ser feita com o provider oficial do Terraform.

Exemplo

Este é um exemplo de implementação de um modelo de multitenancy com serviços separados. Observe que o exemplo mostra a criação de tabelas e usuários em um serviço ClickHouse; isso precisará ser replicado em todos os serviços. Primeiro, vamos criar a tabela events
Vamos inserir dados fictícios.
Em seguida, vamos criar dois usuários user_1
Em seguida, conceda o privilégio SELECT na tabela correspondente.
Agora você pode se conectar como user_1 ao serviço do tenant 1 e executar um SELECT simples. Apenas as linhas do primeiro tenant são retornadas.
Última modificação em 2 de julho de 2026