Quando várias unidades de negócios ou clientes compartilham um único cluster do PolarDB for PostgreSQL, a carga de trabalho descontrolada de uma equipe pode esgotar a CPU ou a memória e degradar o serviço para os demais. A multitenância resolve esse problema ao dividir o cluster em tenants isolados, cada um com limites próprios de CPU e memória aplicados no nível de processo. Assim, uma consulta fora de controle em um tenant não priva os outros de recursos.
Como funciona
Tenants e configurações de recursos
Um tenant é a unidade de alocação de recursos dentro de um cluster. Vários bancos de dados e usuários podem pertencer ao mesmo tenant, mas cada banco de dados ou usuário pode pertencer a apenas um tenant por vez.
Existem dois tipos de tenant:
|
Tipo de tenant |
Descrição |
|
Tenant do sistema |
Tenant administrativo especial, limitado a um por cluster. O tenant do sistema pode ocupar os recursos de todos os tenants comuns. Usuários no tenant do sistema podem se conectar a qualquer cluster, desde que tenham as permissões necessárias. |
|
Tenant comum |
Tenant regular com recursos totalmente isolados. O tenant do sistema deve criar os tenants comuns. |
Uma configuração de recursos é um conjunto nomeado de limites de CPU e memória associado a um tenant.
Dimensões de aplicação de recursos
O rastreamento e a aplicação de recursos ocorrem em três dimensões:
|
Dimensão |
Escopo |
|
Processo |
Uma única conexão (processo de sessão), incluindo seus processos filho de consulta paralela |
|
Usuário |
Todos os processos de sessão iniciados por um único usuário |
|
Banco de dados |
Todos os processos de sessão conectados a um único banco de dados |
Por padrão, os processos auxiliares do sistema ficam isentos dos limites de recursos do tenant.
Durante a execução de uma consulta paralela, seus processos filho em segundo plano são atribuídos ao mesmo tenant da sessão que iniciou a consulta. Após a conclusão da consulta, esses processos filho são removidos do tenant.
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster do PolarDB for PostgreSQL executando o PostgreSQL 14 (versão de revisão 14.12.24.0 ou posterior)
Execute a seguinte instrução para verificar a versão secundária do seu cluster:
SELECT version();
Parâmetros
Os parâmetros a seguir controlam o comportamento da multitenância. Os parâmetros marcados como "requer reinicialização" só entram em vigor após a reinicialização do cluster. Os demais entram em vigor após a execução de SELECT pg_reload_conf();.
|
Parâmetro |
Descrição |
Padrão |
Momento de efeito |
|
|
Número máximo de tenants. Valores válidos: 0–65536. |
32 |
Requer reinicialização |
|
|
Ativa o processo do gerenciador de recursos para limites de memória e prevenção de falta de memória (OOM). |
on |
Requer reinicialização |
|
|
Banco de dados que armazena os metadados do tenant. |
|
Requer reinicialização |
|
|
Intervalo de coleta de dados de recursos, em milissegundos. Valores válidos: 10–10000. |
500 ms |
Após |
|
|
Limiar de remoção ativa (porcentagem da memória total). Valores válidos: 50%–100%. |
80% |
Após |
|
|
Limiar de remoção forçada (porcentagem da memória total). Valores válidos: 50%–100%. |
95% |
Após |
|
|
Tamanho da memória reservada, em KB. Valores válidos: 131072–INT_MAX. |
256000 KB |
Após |
|
|
Ativa o registro de log do gerenciador de recursos. |
ON |
Após |
Gerencie configurações de recursos
Crie uma configuração de recursos
SELECT polar_resource_manager.polar_create_resource_config('resource_config_name');
O resource_config_name segue as mesmas regras de comprimento dos nomes de bancos de dados: até 64 caracteres. Nomes mais longos são truncados automaticamente.
Atualize uma configuração de recursos
SELECT polar_resource_manager.polar_alter_resource_config('resource_config_name', 'config_name', value);
Valores válidos para config_name:
|
Nome da configuração |
Unidade |
Exemplo |
|
|
Núcleos de CPU (float) |
|
|
|
Bytes (float) |
|
Os limites de CPU funcionam como um teto de uso ao longo do tempo. A soma de todos os valores de cpu_rate_limit entre os tenants pode exceder a contagem total de CPUs do cluster, pois o sistema limita qualquer tenant que ultrapasse seu limite.
Os limites de memória funcionam da mesma forma: a soma de todos os valores de mem_limit pode exceder a memória total do cluster. Consulte Gerenciamento de recursos de memória para saber o que acontece quando o limite é atingido.
Exclua uma configuração de recursos
SELECT polar_resource_manager.polar_drop_resource_config('resource_config_name');
Gerencie tenants
Crie um tenant
SELECT polar_resource_manager.polar_create_tenant('tenant_name', 'resource_config_name');
tenant_name: até 64 caracteres; truncado automaticamente se for mais longo.resource_config_name: deve referenciar uma configuração de recursos existente; caso contrário, a criação do tenant falha.
Atualize um tenant
SELECT polar_resource_manager.polar_alter_tenant('tenant_name', 'config_name', 'value');
Valores válidos para config_name:
|
Nome da configuração |
Descrição |
|
|
Renomeia o tenant |
|
|
Alterna o tenant para uma configuração de recursos diferente |
Exclua um tenant
SELECT polar_resource_manager.polar_drop_tenant('tenant_name');
A exclusão de um tenant não remove sua configuração de recursos associada.
Atribuir recursos a um tenant
Atribuir um banco de dados
Um banco de dados pode pertencer a apenas um tenant.
SELECT polar_resource_manager.polar_tenant_add_database('tenant_name', 'database_name');
Para visualizar todas as atribuições de bancos de dados a tenants:
SELECT dbsname, tenantname FROM polar_resource_manager.polar_tenants_dbs;
Atribuir um usuário
Um usuário pode pertencer a apenas um tenant.
SELECT polar_resource_manager.polar_tenant_add_user('tenant_name', 'user_name');
Para visualizar todas as atribuições de usuários a tenants:
SELECT username, tenantname FROM polar_resource_manager.polar_tenants_users;
Atribuir um processo
SELECT polar_resource_manager.polar_tenant_add_process('tenant_name', pid);
Um processo pode pertencer a apenas um tenant. Se você atribuir o mesmo processo a vários tenants, somente a última atribuição terá efeito.
Monitorar o uso de recursos do tenant
A view polar_all_resource_configs_detail mostra o uso de recursos em tempo real para todos os tenants:
SELECT * FROM polar_resource_manager.polar_all_resource_configs_detail;
|
Coluna |
Tipo |
Descrição |
|
|
NAME |
Nome do tenant |
|
|
NAME |
Nome da configuração de recursos |
|
|
INTEGER |
Número total de processos |
|
|
INTEGER |
Número de processos ociosos |
|
|
INTEGER |
Número de processos ativos |
|
|
DOUBLE PRESISION |
Máximo de núcleos de CPU alocados ao tenant |
|
per_process_dirty_rate_limit |
DOUBLE PRESISION |
Valor do limite de recursos de I/O por processo. (Não suportado na versão atual) |
|
dirty_rate_limit |
DOUBLE PRESISION |
Valor do limite de recursos de I/O. (Não suportado na versão atual) |
|
|
DOUBLE PRESISION |
Máximo de núcleos de CPU por processo |
|
|
DOUBLE PRESISION |
Memória máxima alocada ao tenant |
|
|
DOUBLE PRESISION |
Uso atual de memória |
|
|
DOUBLE PRESISION |
Memória usada por processos ociosos |
|
|
DOUBLE PRESISION |
Memória usada por processos ativos |
|
|
DOUBLE PRESISION |
Utilização da CPU (%) |
Gerenciamento de recursos de CPU
Defina cpu_rate_limit para limitar quantos núcleos de CPU um tenant pode usar. O valor é um float que representa núcleos de CPU:
|
Valor |
Significado |
|
|
Até 30% de um núcleo |
|
|
Até 50% de um núcleo |
|
|
Até 2 núcleos completos |
Quando um tenant excede seu limite, o cluster limita seus processos para manter a utilização dentro do teto estabelecido. A soma dos valores de cpu_rate_limit em todos os tenants pode exceder a contagem total de CPUs do cluster.
Gerenciamento de recursos de memória
A memória é um recurso rígido. Diferentemente da CPU, a memória não pode ser limitada dinamicamente. Quando um tenant excede seu limite, o sistema encerra sessões para liberar memória. Esse comportamento é semelhante à forma como um sistema operacional lida com condições de OOM, mas aplicado por tenant.
Defina mem_limit como o máximo de bytes que um tenant pode consumir (por exemplo, 4294967296 = 4 GB). A soma dos valores de mem_limit entre os tenants pode exceder a memória total do cluster.
Duas políticas de remoção protegem o cluster:
|
Política |
Gatilho |
Comportamento |
|
Remoção ativa |
O uso de memória excede |
Encerra a sessão que excedeu o limite. Retorna um erro de estouro de memória. Repete até que o uso caia abaixo do limiar. |
|
Remoção forçada |
O uso de memória excede |
Percorre todos os processos, encerra as sessões que excedem seu limite e retorna um erro de estouro de memória. Evita OOM em todo o cluster. |
Ao encerrar uma sessão, o sistema envia um sinal SIGUSR2 para o processo da sessão e retorna um erro de estouro de memória. Apenas processos de usuário podem ser encerrados dessa maneira. Os processos em segundo plano do sistema pertencem ao tenant do sistema e estão isentos de encerramento forçado.
Se um processo em segundo plano de uma consulta paralela exceder o limite de memória, a sessão de usuário correspondente será encerrada, e não o próprio processo em segundo plano.