Como faço para aumentar as conexões máximas da minha instância do Amazon RDS para MySQL ou do Amazon RDS para PostgreSQL?

9 minuto de leitura
0

Quero aumentar as conexões máximas para minha instância de banco de dados Amazon Relational Database Service (Amazon RDS) para MySQL ou Amazon RDS para PostgreSQL.

Resolução

Exibir o valor atual de max_connections

No Amazon RDS para MySQL, a métrica max_connections monitora o número máximo definido de conexões simultâneas (permitidas) de clientes.

Por padrão, o parâmetro max_connections é baseado na seguinte fórmula no Amazon RDS para MySQL (calculado a partir do valor de DBInstanceClassMemory):

max_connections = DBInstanceClassMemory/12582880

Para verificar o valor atual de max_connections, execute o seguinte comando depois de se conectar à sua instância do Amazon RDS para MySQL:

SHOW GLOBAL VARIABLES LIKE 'max_connections';

No Amazon RDS para PostgreSQL, a métrica max_connections monitora o número máximo definido de conexões simultâneas. Por padrão, o parâmetro max_connections é baseado na seguinte fórmula no Amazon RDS para PostgreSQL (calculado a partir do valor de DBInstanceClassMemory):

max_connections = LEAST({DBInstanceClassMemory/9531392}, 5000)

Para verificar o valor atual de max_connections, execute o seguinte comando depois de se conectar à sua instância do Amazon RDS para PostgreSQL:

postgres=> show max_connections;

O valor padrão de max_connections para RDS para MySQL e RDS para PostgreSQL depende da classe de instância usada pela instância do Amazon RDS. Uma classe de instância de banco de dados com mais memória disponível oferece suporte a um número maior de conexões de banco de dados.

Observe que o número padrão de max_connections calculado usando a fórmula pode variar ligeiramente do número de conexões padrão retornadas do comando anterior. Isso ocorre porque parte da memória do total DBInstanceClassMemory é reservada para as operações subjacentes do sistema operacional. O comando anterior considera apenas a memória reservada para o mecanismo PostgreSQL e não para o sistema operacional do host subjacente.

Revise os motivos para ter muitas conexões

Quando o número de conexões do cliente excede o valormax_connections, você obtém erros semelhantes aos seguintes:

Os seguintes fatores podem fazer com que suas conexões de banco de dados excedam o valor de max_connections:

Aumento no número de conexões de clientes ou aplicativos com a instância de banco de dados: Isso é causado por um aumento em workload ou bloqueio no nível da tabela/linha.

Fechamento incorreto de uma conexão de cliente ou aplicativo após o término de uma operação: quando uma conexão com o servidor não é fechada corretamente, o aplicativo cliente abre uma nova conexão. Com o tempo, essas novas conexões de servidor podem fazer com que sua instância exceda o valor de max_connections. Para listar todas as conexões ativas para sua instância de banco de dados do RDS para MySQL, execute o seguinte comando:

SHOW FULL PROCESSLIST

Para visualizar as conexões de cada banco de dados para sua instância do RDS para PostgreSQL, execute o seguinte comando:

SELECT datname, numbackends FROM pg_stat_database;

Conexões inativas: conexões inativas, que também são conhecidas como conexões abertas inativas, acontecem quando você define valores mais altos para parâmetros de tempo limite de conexão, comowait_timeout ouinteractive_timeout no MySQL. Se você configurar um limite de conexão muito alto, poderá acabar com um uso maior de memória, mesmo que essas conexões não sejam usadas. Como resultado, quando o servidor de aplicativos tenta abrir todas as conexões do cliente com o banco de dados, essas conexões podem ser recusadas. Para encerrar uma conexão adormecida em uma instância de banco de dados do RDS para MySQL, execute o seguinte comando:

CALL mysql.rds_kill(example-pid);

Conexões ociosas: você pode visualizar as conexões ociosas em uma instância do RDS para PostgreSQL executando a seguinte consulta. Essa consulta exibe informações sobre processos de back-end com um dos seguintes estados por mais de 15 minutos: 'ocioso', 'ocioso na transação', 'ocioso na transação (abortado) 'e 'desabilitado'.

SELECT * FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled')
AND state_change < current_timestamp - INTERVAL '15' MINUTE;

Para encerrar uma conexão ociosa em uma instância do RDS para PostgreSQL, execute o seguinte comando:

SELECT pg_terminate_backend(example-pid)

Dica: é uma prática recomendada configurar apenas as conexões ativas necessárias para a performance do aplicativo. Você também pode considerar atualizar para uma classe de instância de banco de dados do Amazon RDS maior.

Aumentar o valor de max_connections

Você pode aumentar o número máximo de conexões com sua instância de banco de dados RDS para MySQL ou RDS para PostgresSQL usando os seguintes métodos:

  • Defina um valor maior para o parâmetro max_connections usando um grupo de parâmetros de nível de instância personalizado. Aumentar o parâmetro max_connections não causa nenhuma interrupção. Mesmo que você possa aumentar o valor demax_connections além do valor padrão, essa não é uma prática recomendada. Isso ocorre porque a instância pode ter problemas quando o workload aumenta e mais memória é necessária. Um aumento no número de conexões pode aumentar o uso da memória. Instâncias com pouca memória podem falhar. Isso é verdade especialmente para instâncias menores. Se você aumentar o valor max_connections, certifique-se de monitorar o uso de recursos. Além disso, não deixe de consultar seu DBA sobre o aumento. É uma prática recomendada manter o valor padrão ou aumentar a escala verticalmente para uma classe de instância maior quando forem necessárias mais conexões.
  • Se sua instância de banco de dados estiver usando um grupo de parâmetros padrão, altere o grupo de parâmetros para um grupo de parâmetros personalizado. Associe o grupo de parâmetros de banco de dados personalizado à sua instância do Amazon RDS e reinicialize a instância. Depois que o novo grupo de parâmetros personalizado for associado à sua instância de banco de dados, você poderá modificar o valor do parâmetro max_connections. Para obter mais informações, consulte How do I modify the values of an Amazon RDS DB parameter group? (Como modifico os valores de um grupo de parâmetros de banco de dados do Amazon RDS?)
    Observação: alterar o grupo de parâmetros pode causar uma interrupção. Para obter mais informações, consulte Working with DB parameter groups (Trabalhar com grupos de parâmetros de banco de dados).
  • Dimensione sua instância de banco de dados para uma classe de instância de banco de dados com mais memória. Observe que o aumento de instâncias do RDS afeta o faturamento da conta. Para saber mais, consulte Faturamento de instâncias de banco de dados para o Amazon RDS.
    Aviso: o tempo de inatividade ocorre quando você modifica uma instância de banco de dados do Amazon RDS.

Siga as práticas recomendadas para configurar o parâmetro max_connections

Considere as seguintes práticas recomendadas ao trabalhar com o parâmetro max_connections para sua instância de banco de dados:

  • Os limites de conexão padrão são ajustados para sistemas que usam os valores padrão para outros grandes consumidores de memória, como o grupo de buffer. É uma prática recomendada aumentar a escala verticalmente da classe de instância em vez de alterar o valor da classe da instância. No entanto, se as instâncias tiverem muita memória livre, é possível alterar esse parâmetro manualmente. Antes de alterar as configurações da instância de banco de dados, considere ajustar o limite de conexão para levar em conta o aumento ou a diminuição da memória disponível nas instâncias de banco de dados.
  • Defina o valor max_connections um pouco acima do número máximo de conexões que você espera abrir em cada instância de banco de dados.
  • Para uma instância do RDS para MySQL, se você ativou o Performance Schema, preste muita atenção à configuração do parâmetromax_connections. As estruturas de memória do Performance Schema são dimensionadas automaticamente com base nas variáveis de configuração do servidor. Quanto mais alto você definir a variável, mais memória o Performance Schema usará. Em casos extremos, essa condição pode levar a problemas de falta de memória em tipos de instância menores, como T2 e T3. Se você estiver usando o Performance Schema, é uma prática recomendada deixar a configuração max_connections no valor padrão. Se você planeja aumentar significativamente o valor de max_connections (para mais alto que o valor padrão), considere desativar o Performance Schema.
    Observação: se você habilitar o Performance Insights para uma instância de banco de dados do Amazon RDS para MySQL, o Performance Schema também será habilitado automaticamente.
  • Para uma instância do RDS para MySQL, ao ajustar o parâmetromax_connections, verifique os seguintes parâmetros relacionados à conexão do MySQL:wait_timeout: número de segundos que o servidor aguarda pela atividade em uma conexão de arquivo TCP/IP ou Unix não interativa antes de fechar a conexão
    interactive_timeout: número de segundos que o servidor espera pela atividade em uma conexão interativa antes de fechá-la
    net_read_timeout: número de segundos para esperar por mais dados de uma conexão TCP/IP antes de descartar a atividade de leitura
    net_write_timeout: número de segundos de espera em conexões TCP/IP para que um bloco seja gravado antes de descartar a atividade de gravação
    max_execution_time: tempo limite de execução para instruções SELECT, em milissegundos
    max_connect_errors: um host é bloqueado para outras conexões se houver mais do que este número de conexões interrompidas
    max_user_connections: número máximo de conexões simultâneas permitidas para qualquer conta do MySQL
  • Para uma instância do RDS para PostgreSQL, ao ajustar o parâmetromax_connections, verifique também os seguintes parâmetros relacionados à conexão do PostgreSQL:
    idle_in_transaction_session_timeout: encerra qualquer sessão com uma transação aberta que tenha permanecido ociosa por mais tempo que a duração especificada em milissegundos. Isso permite que todos os bloqueios mantidos por essa sessão sejam liberados e o slot de conexão seja reutilizado. Além disso, as tuplas visíveis somente para essa transação são aspiradas.
    tcp_keepalives_idle: número de segundos de inatividade após o qual o sistema operacional envia a mensagem de manutenção de atividade TCP para o cliente
    tcp_keepalives_interval: número de segundos após os quais uma mensagem de manutenção de atividade TCP que não é confirmada pelo cliente é transmitida novamente
    tcp_keepalives_count: número de manutenções de atividade TCP que podem ser perdidas antes que a conexão do servidor com o cliente seja considerada inativa.

Observação: este artigo não inclui valores recomendados para os parâmetros listados, porque esses valores variam de acordo com o caso de uso.