Todos os produtos
Search
Central de documentação

PolarDB:Multitenância

Última atualização: Jun 28, 2026

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

polar_max_tenants

Número máximo de tenants. Valores válidos: 0–65536.

32

Requer reinicialização

polar_resource_manager.enable_resource_manager

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

polar_resource_manager.database_name

Banco de dados que armazena os metadados do tenant.

polardb_admin

Requer reinicialização

polar_resource_manager.stat_interval

Intervalo de coleta de dados de recursos, em milissegundos. Valores válidos: 10–10000.

500 ms

Após pg_reload_conf()

polar_resource_manager.total_mem_request_rate

Limiar de remoção ativa (porcentagem da memória total). Valores válidos: 50%–100%.

80%

Após pg_reload_conf()

polar_resource_manager.total_mem_limit_rate

Limiar de remoção forçada (porcentagem da memória total). Valores válidos: 50%–100%.

95%

Após pg_reload_conf()

polar_resource_manager.total_mem_limit_remain_size

Tamanho da memória reservada, em KB. Valores válidos: 131072–INT_MAX.

256000 KB

Após pg_reload_conf()

polar_resource_manager.enable_log

Ativa o registro de log do gerenciador de recursos.

ON

Após pg_reload_conf()

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

cpu_rate_limit

Núcleos de CPU (float)

2 = 2 núcleos completos; 0.5 = meio núcleo

mem_limit

Bytes (float)

4294967296 = 4 GB

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

name

Renomeia o tenant

resource_config

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

tenantname

NAME

Nome do tenant

resource_config_name

NAME

Nome da configuração de recursos

num_processes

INTEGER

Número total de processos

num_idle_processes

INTEGER

Número de processos ociosos

num_active_processes

INTEGER

Número de processos ativos

cpu_rate_limit

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)

per_process_cpu_rate_limit

DOUBLE PRESISION

Máximo de núcleos de CPU por processo

mem_limit

DOUBLE PRESISION

Memória máxima alocada ao tenant

mem_usage

DOUBLE PRESISION

Uso atual de memória

idle_processes_mem_usage

DOUBLE PRESISION

Memória usada por processos ociosos

active_processes_mem_usage

DOUBLE PRESISION

Memória usada por processos ativos

cpu_usage_rate

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

0.3

Até 30% de um núcleo

0.5

Até 50% de um núcleo

2

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 total_mem_request_rate (padrão: 80%) e o uso do tenant excede seu mem_limit

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 total_mem_limit_rate (padrão: 95%)

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.