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. 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.
user_1 e user_2.
user_1 e user_2 a acessar apenas os dados de seus respectivos tenants.
GRANT SELECT na tabela compartilhada usando uma role comum.
user_1 e executar um SELECT simples. Apenas as linhas do primeiro tenant são retornadas.
Tabelas separadas
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. 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.
user_1 e user_2.
GRANT SELECT na tabela correspondente.
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
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. 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.
user_1 e user_2.
GRANT SELECT sobre a tabela correspondente.
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
Serviço em nuvem separado
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. 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
user_1
SELECT na tabela correspondente.
user_1 ao serviço do tenant 1 e executar um SELECT simples. Apenas as linhas do primeiro tenant são retornadas.