Este tópico descreve o recurso de configuração de recursos multitenant do PolarDB for PostgreSQL.
Conceitos
Tenant: Na multitenância, um tenant é uma entidade lógica que representa uma unidade específica de alocação de dados e recursos. A hierarquia do tenant situa-se abaixo do cluster e acima dos usuários e bancos de dados. A relação entre eles é de muitos para um: várias contas ou bancos de dados correspondem a um único tenant. Um tenant não equivale a um usuário ou a um banco de dados. Os tenants dividem-se em duas categorias:
System tenant: Entidade especial de gerenciamento, geralmente única. O system tenant tem acesso prioritário aos recursos e pode ocupar os recursos dos tenants regulares. Ao conectar-se a um banco de dados como usuário do system tenant, se esse usuário possuir as permissões de acesso ao cluster correspondentes, ele poderá acessar o cluster em todos os tenants.
Regular tenant: Os recursos de cada regular tenant são completamente isolados, e os tenants não podem acessar uns aos outros. Crie um regular tenant no contexto do system tenant.
Configuração de recursos: A configuração de recursos envolve a alocação de recursos específicos (como CPU e memória) para um tenant específico. Esse método permite que contas privilegiadas especifiquem limites de recursos para cada tenant conforme os requisitos de negócios.
O recurso de configuração de recursos do tenant visa limitar a quantidade de recursos utilizados por um ou mais processos. No PolarDB for PostgreSQL, uma sessão corresponde a um processo, e uma sessão pode ser iniciada em apenas um banco de dados por um único usuário. Portanto, processos, usuários e bancos de dados constituem os elementos básicos de um processo. O sistema permite mapear qualquer processo, usuário ou banco de dados para um tenant especificado, mas um processo pode pertencer a apenas um tenant, evitando assim estatísticas duplicadas de uso de recursos. Os processos filhos de uma consulta paralela em segundo plano pertencem ao tenant do processo que iniciou a consulta. Assim, com base nos atributos dos processos, os limites de recursos dividem-se em três dimensões:
Processo: Refere-se aos processos de conexão de conta (processos de sessão) iniciados ativamente pelos usuários, incluindo os processos de consulta paralela relacionados, mas excluindo os processos auxiliares do sistema.
Usuário: Abrange todos os processos de conexão de usuário (processos de sessão) iniciados pelo mesmo usuário, incluindo os processos de consulta paralela relacionados, mas excluindo os processos auxiliares do sistema.
Banco de dados: Corresponde a todos os processos de conexão de usuário (processos de sessão) que acessam o mesmo banco de dados, incluindo os processos de consulta paralela relacionados, mas excluindo os processos auxiliares do sistema.
Devido à função específica dos processos do sistema, o uso de recursos por eles não é limitado por padrão.
Escopo de aplicação
As versões suportadas do PolarDB for PostgreSQL são as seguintes: PostgreSQL 14, e a versão secundária do mecanismo deve ser 2.0.14.12.24.0 ou posterior.
Você pode visualizar a versão secundária do mecanismo no console ou executando a instrução SHOW polardb_version;. Se a versão secundária do mecanismo não atender aos requisitos, atualize a versão secundária do mecanismo.
Descrição dos parâmetros
Parâmetro | Descrição | Método de efetivação |
polar_max_tenants | Número máximo de tenants. Valores válidos: 0 a 65.536. Valor padrão: 32. | Entra em vigor após reinicialização. |
polar_resource_manager.enable_resource_manager | Especifica se o processo Resource Manager deve ser ativado para limitação de memória e prevenção de OOM. Valor padrão: on. | Entra em vigor após reinicialização. |
polar_resource_manager.database_name | Nome do banco de dados que armazena os metadados do tenant. Valor padrão: | Entra em vigor após reinicialização. |
polar_resource_manager.stat_interval | Intervalo de coleta de dados, em milissegundos. Valores válidos: 10 a 10.000. Valor padrão: 500 ms. | Entra em vigor após RELOAD. |
polar_resource_manager.total_mem_request_rate | Limiar de evicção ativa. Valores válidos: 50% a 100%. Valor padrão: 80%. | Entra em vigor após RELOAD. |
polar_resource_manager.total_mem_limit_rate | Limiar de evicção forçada. Valores válidos: 50% a 100%. Valor padrão: 95%. | Entra em vigor após RELOAD. |
polar_resource_manager.total_mem_limit_remain_size | Tamanho da memória reservada. Valores válidos: 131.072 a INT_MAX (valor máximo do tipo de dados inteiro), em KB. Valor padrão: 256.000 KB. | Entra em vigor após RELOAD. |
polar_resource_manager.enable_log | Especifica se o registro de logs deve ser ativado. Valores válidos:
| Entra em vigor após RELOAD. |
Notas de uso
Ao utilizar a multitenância, instale a extensão polar_resource_manager no banco de dados especificado pelo parâmetro polar_resource_manager.database_name.
Se você alterar o nome do banco de dados especificado por polar_resource_manager.database_name para armazenamento dos metadados do tenant, as informações de multitenância configuradas anteriormente tornar-se-ão inválidas.
CREATE EXTENSION polar_resource_manager;
Criar uma configuração de recursos
Use a função polar_create_resource_config para criar uma configuração de recursos.
SELECT polar_resource_manager.polar_create_resource_config('resource_config_name');
O parâmetro resource_config_name deve obedecer às restrições de nomenclatura de objetos de banco de dados. Apenas nomes com até 64 bytes são suportados. Nomes superiores a 64 bytes são truncados automaticamente.
Excluir uma configuração de recursos
Use a função polar_drop_resource_config para excluir uma configuração de recursos.
SELECT polar_resource_manager.polar_drop_resource_config('resource_config_name');
Modificar uma configuração de recursos
Use a função polar_alter_resource_config para modificar as definições de recursos de uma configuração.
SELECT polar_resource_manager.polar_alter_resource_config('resource_config_name', 'config_name', value);
Os tipos de config_name suportados são:
cpu_rate_limit: Valor limite de CPU, em número de núcleos.mem_limit: Valor limite de memória, em bytes.
Criar um tenant
Use a função polar_create_tenant para criar um tenant.
SELECT polar_resource_manager.polar_create_tenant('tenant_name', 'resource_config_name');
Onde:
O parâmetro
tenant_namedeve obedecer às restrições de nomenclatura de objetos de banco de dados. Apenas nomes com até 64 bytes são suportados. Nomes superiores a 64 bytes são truncados automaticamente.Crie previamente a configuração de recursos
resource_config_name. Caso contrário, o tenant não poderá ser criado.
Excluir um tenant
Use a função polar_drop_tenant para excluir um tenant. A exclusão de um tenant não remove a configuração de recursos associada.
SELECT polar_resource_manager.polar_drop_tenant('tenant_name');
Modificar um tenant
Use a função polar_alter_tenant para modificar um tenant.
SELECT polar_resource_manager.polar_alter_tenant('tenant_name', 'config_name', 'value');
Os tipos de config_name suportados são:
name: Nome do tenant.resource_config: Configuração de recursos.
Atribuir um banco de dados a um tenant
Use a função polar_tenant_add_database para atribuir um banco de dados a um tenant. Um banco de dados pode ser atribuído a apenas um tenant. Caso contrário, a atribuição falhará.
SELECT polar_resource_manager.polar_tenant_add_database('tenant_name', 'database_name');
Visualize bancos de dados e tenants
Use a view polar_tenants_dbs para visualizar os bancos de dados e os tenants aos quais pertencem.
SELECT dbsname, tenantname FROM polar_resource_manager.polar_tenants_dbs;
Atribuir um usuário a um tenant
Use a função polar_tenant_add_user para atribuir um usuário a um tenant. Um usuário pode ser atribuído a apenas um tenant. Caso contrário, a atribuição falhará.
SELECT polar_resource_manager.polar_tenant_add_user('tenant_name', 'user_name');
Visualize usuários e tenants
Use a view polar_tenants_users para visualizar os usuários e os tenants aos quais pertencem.
SELECT username, tenantname FROM polar_resource_manager.polar_tenants_users;
Atribuir um processo a um tenant
Use a função polar_tenant_add_process para atribuir um processo a um tenant. Um processo pode ser atribuído a apenas um tenant. Quando um processo é atribuído a múltiplos tenants, a última atribuição prevalece.
SELECT polar_resource_manager.polar_tenant_add_process('tenant_name', pid);
Visualize o status de recursos do tenant
Use a view polar_all_resource_configs_detail para visualizar o status de recursos do tenant.
SELECT * FROM polar_resource_manager.polar_all_resource_configs_detail;
As informações da view são as seguintes:
|
Nome da coluna |
Tipo da coluna |
Descrição |
|
tenantname |
NAME |
Nome do tenant. |
|
resource_config_name |
NAME |
Nome da configuração de recursos. |
|
num_processes |
INTEGER |
Quantidade de processos. |
|
num_idle_processes |
INTEGER |
Quantidade de processos ociosos. |
|
num_active_processes |
INTEGER |
Quantidade de processos ativos. |
|
cpu_rate_limit |
DOUBLE PRESISION |
Valor limite de recursos de CPU do tenant. |
|
per_process_cpu_rate_limit |
DOUBLE PRESISION |
Valor limite de CPU por processo. |
|
mem_limit |
DOUBLE PRESISION |
Valor limite de memória. |
|
mem_usage |
DOUBLE PRESISION |
Uso de memória. |
|
idle_processes_mem_usage |
DOUBLE PRESISION |
Uso de memória pelos processos ociosos. |
|
active_processes_mem_usage |
DOUBLE PRESISION |
Uso de memória pelos processos ativos. |
|
cpu_usage_rate |
DOUBLE PRESISION |
Uso de CPU. |
Gerenciamento de recursos de CPU
Após adicionar processos, usuários ou bancos de dados ao tenant correspondente, defina os valores limite relacionados à CPU na configuração de recursos do tenant. Se houver processos filhos de backend alocáveis, estes serão adicionados ao tenant da conexão de sessão que emite a consulta paralela, permitindo que os processos filhos e o processo de sessão compartilhem os recursos limitados pelo tenant. Quando a execução da consulta paralela da sessão termina, os processos filhos são removidos do tenant. Trata-se de um processo dinâmico de adição e remoção de limites de recursos.
Limite de uso de CPU
Limita o uso máximo de CPU dos objetos dentro de um tenant. Quando o uso de CPU de um objeto dentro de um tenant é excessivo, o cluster impõe restrições e reduz o uso para abaixo do valor limite.
Use polar_resource_manager.polar_alter_resource_config para definir cpu_rate_limit. O valor do parâmetro é do tipo float.
O valor do parâmetro representa o uso da CPU (a razão do tempo de uso da CPU durante um período). Por exemplo, 0,3 representa o uso de 30% de um núcleo, e 2 representa o uso da capacidade de dois núcleos. Como o limite refere-se ao uso máximo, a soma dos valores cpu_limit de todas as configurações de recursos dos tenants pode ser maior que a cota de especificação T, ou seja, cpu_limit_A + cpu_limit_B + cpu_limit_C + ... >= T.
Gerenciamento de recursos de memória
Como os recursos de memória são recursos rígidos (swap off), eles não podem ser limitados dinamicamente como a CPU. Se os recursos de memória excederem o limite rígido, a liberação de recursos geralmente ocorre mediante a interrupção de processos. O gerenciamento de memória do tenant assemelha-se à estratégia de tratamento de OOM de um sistema operacional. Em comparação com o tratamento de OOM no nível de banco de dados do sistema, este é apenas um tratamento de OOM no nível de tenant.
Limite de uso de memória
Use polar_resource_manager.polar_alter_resource_config para definir mem_limit. O valor do parâmetro é do tipo float. Assim como o limite de uso de CPU, serve para limitar o valor máximo de uso de memória. O valor total do limite pode ser maior ou igual à cota de especificação. Estão incluídas as duas estratégias a seguir:
Gerenciamento ativo de excesso de recursos: Quando o uso total de memória supera o limiar de evicção ativa (
total_mem_request_rate, valor padrão 80%), se o uso de memória de um tenant for maior que o limite de memória da configuração de recursos desse tenant, os recursos da sessão correspondente são liberados e um erro de excesso de memória é retornado ao usuário. Isso continua até que o uso de memória fique abaixo do limiar de evicção ativa.Gerenciamento forçado de excesso de recursos: Para evitar que o uso excessivo de memória do cluster cause OOM no cluster, quando o uso total de memória supera o limiar de evicção forçada (
total_mem_limit_rate, valor padrão 95%), todos os processos são percorridos, os recursos das sessões correspondentes são liberados e um erro de excesso de memória é retornado ao usuário.
Quando os limites de memória executam a evicção, as sessões do usuário são interrompidas e os recursos do processo são liberados. Isso pode ser implementado enviando SIGUSR2 para retornar o erro OOM especificado ao usuário. Se a memória de um processo em segundo plano de uma consulta paralela exceder o limite, o processo de usuário correspondente será interrompido. Atualmente, apenas os processos de usuário são limitados. Os processos em segundo plano do sistema pertencem atualmente ao system tenant e não são interrompidos ativamente para liberar recursos.