Amazon RDS for MySQL 또는 Amazon RDS for PostgreSQL 인스턴스의 최대 연결을 늘리려면 어떻게 해야 합니까?

6분 분량
0

Amazon Relational Database Service(RDS) for MySQL 또는 Amazon RDS for PostgreSQL DB 인스턴스의 최대 연결을 늘리고 싶습니다.

해결 방법

현재 max_connections 값 보기

Amazon RDS for MySQL에서 max_connections 지표는 설정된 최대 (허용) 동시 클라이언트 연결 수를 모니터링합니다.

기본적으로 max_connections 파라미터는 (DBInstanceClassMemory 값에서 계산된) Amazon RDS for MySQL의 다음 공식을 기반으로 합니다.

max_connections = DBInstanceClassMemory/12582880

max_connections의 현재 값을 확인하려면 Amazon RDS for MySQL 인스턴스에 연결한 후 다음 명령을 실행합니다.

SHOW GLOBAL VARIABLES LIKE 'max_connections';

Amazon RDS for PostgreSQL에서 max_connections 지표는 설정된 최대 동시 연결 수를 모니터링합니다. 기본적으로 max_connections 파라미터는 (DBInstanceClassMemory 값에서 계산된) Amazon RDS for PostgreSQL의 다음 공식을 기반으로 합니다.

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

max_connections의 현재 값을 확인하려면 Amazon RDS for PostgreSQL 인스턴스에 연결한 후 다음 명령을 실행합니다.

postgres=> show max_connections;

RDS for MySQL 또는 RDS for PostgreSQL 모두에 대한 max_connections의 기본값은 Amazon RDS 인스턴스에서 사용하는 인스턴스 클래스에 따라 달라집니다. 사용 가능한 메모리가 더 많은 DB 인스턴스 클래스는 더 많은 수의 데이터베이스 연결도 지원합니다.

수식을 사용하여 계산한 max_connections의 기본 수는 이전 명령에서 반환한 기본 연결 수와 약간 다를 수 있습니다. 이는 전체 DBInstanceClassMemory 중 일부 메모리가 기본 OS 작업을 위해 예약되어 있기 때문입니다. 위 명령은 기본 호스트 OS가 아닌 PostgreSQL 엔진용으로 예약된 메모리만 고려합니다.

연결이 너무 많은 이유 검토

클라이언트 연결 수가 max_connections 값을 초과하면 다음과 유사한 오류가 발생합니다.

다음 요인으로 인해 데이터베이스 연결이 max_connections 값을 초과할 수 있습니다.

DB 인스턴스에 대한 클라이언트 또는 애플리케이션 연결 수가 증가: 워크로드 또는 테이블/행 수준 잠금이 증가했기 때문입니다.

작업 종료 후 클라이언트 또는 애플리케이션 연결이 부적절하게 끝나는 경우: 서버 연결이 제대로 종료되지 않으면, 클라이언트 애플리케이션이 신규 연결을 엽니다. 시간이 지남에 따라 이러한 새 서버 연결로 인해 인스턴스가 max_connections 값을 초과할 수 있습니다. RDS for MySQL DB 인스턴스의 모든 활성 연결을 나열하려면 다음 명령을 실행합니다.

SHOW FULL PROCESSLIST

RDS for PostgreSQL 인스턴스에 대한 각 데이터베이스의 연결을 보려면 다음 명령을 실행합니다.

SELECT datname, numbackends FROM pg_stat_database;

휴면 연결: 휴면 연결은 비활성 열린 연결이라고도 하며, MySQL에서 더 높은 연결 시간 초과 파라미터(예: wait_timeout 또는 interactive_timeout)로 인해 발생합니다. 연결 제한을 너무 높이 구성하면 연결이 사용되지 않더라도 메모리 사용량이 높아질 수 있습니다. 따라서 애플리케이션 서버가 데이터베이스에 대한 모든 클라이언트 연결을 열려고 하면 해당 연결이 거부될 수 있습니다. RDS for MySQL DB 인스턴스에서 휴면 연결을 종료하려면 다음 명령을 실행합니다.

CALL mysql.rds_kill(example-pid);

유휴 연결: 다음 쿼리를 실행하여 RDS for PostgreSQL 인스턴스의 유휴 연결을 볼 수 있습니다. 이 쿼리는 15분 이상 '유휴', '트랜잭션 유휴', '트랜잭션 유휴(중단됨)’ 및 '비활성화됨' 상태 중 하나인 백엔드 프로세스에 대한 정보를 표시합니다.

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;

RDS for PostgreSQL 인스턴스에서 유휴 연결을 종료하려면 다음 명령을 실행합니다.

SELECT pg_terminate_backend(example-pid)

팁: 애플리케이션 성능에 필요한 활성 연결만 구성하는 것이 좋습니다. 더 큰 Amazon RDS DB 인스턴스 클래스로 업그레이드하는 것도 고려해 볼 수 있습니다.

max_connections 값 늘리기

다음 방법을 사용하여 RDS for MySQL 또는 RDS for PostgresSQL DB 인스턴스에 대한 최대 연결 수를 늘릴 수 있습니다.

  • 사용자 정의 인스턴스 수준의 파라미터 그룹을 사용하여 max_connections 파라미터에 대해 더 큰 값을 설정합니다. max_connections 파라미터를 늘리면 중단이 발생하지 않습니다. max_connections의 값을 기본값 이상으로 늘릴 수 있지만 최선의 방법은 아닙니다. 워크로드가 증가하고 더 많은 메모리가 필요할 때 인스턴스에 문제가 발생할 수 있기 때문입니다. 연결 수를 늘리면 메모리 사용량이 증가할 수 있습니다. 메모리가 부족한 인스턴스는 충돌할 수 있습니다. 이는 특히 소규모 인스턴스의 경우에 해당됩니다. max_connections 값을 늘리는 경우, 리소스 사용량을 모니터링해야 합니다. 또한 증가에 대해서는 담당 DBA와 상의하십시오. 기본값을 유지하거나, 더 많은 연결이 필요할 때 더 큰 인스턴스 클래스로 스케일 업하는 것이 제일 좋습니다.
  • DB 인스턴스에서 기본 파라미터 그룹을 사용하는 경우 파라미터 그룹을 사용자 지정 파라미터 그룹으로 변경합니다. 사용자 지정 DB 파라미터 그룹을 Amazon RDS 인스턴스와 연결하고 인스턴스를 재부팅해야 합니다. 새 사용자 지정 파라미터 그룹이 DB 인스턴스와 연결되면 max_connections 파라미터 값을 수정할 수 있습니다. 자세한 내용은 Amazon RDS DB 파라미터 그룹의 값을 어떻게 수정합니까?를 참조하세요.
    참고: 파라미터 그룹을 변경하면 중단이 발생할 수 있습니다. 자세한 내용은 DB 파라미터 그룹 작업을 참조하세요.
  • DB 인스턴스를 더 많은 메모리가 있는 DB 인스턴스 클래스로 확장합니다. RDS 인스턴스를 확장하면 계정 청구에 영향을 미칩니다. 자세한 내용은 Amazon RDS에 대한 DB 인스턴스 청구를 참조하세요.
    경고: Amazon RDS DB 인스턴스를 수정할 때 가동 중단이 발생합니다.

max_connections 파라미터 구성에 대한 모범 사례 따르기

DB 인스턴스의 max_connections 파라미터로 작업할 때 다음 모범 사례를 고려해야 합니다.

  • 기본 연결 제한은 버퍼 풀 등의 다른 주요 메모리 소비자의 기본값을 사용하는 시스템에 맞춰 튜닝됩니다. 인스턴스 클래스 값을 변경하는 대신 인스턴스 클래스를 스케일 업하는 것이 가장 좋습니다. 그러나 인스턴스에 사용 가능한 메모리가 많은 경우 이 파라미터를 수동으로 변경할 수 있습니다. DB 인스턴스에 대해 이러한 설정을 변경하기 전에, DB 인스턴스에서 사용 가능한 메모리의 증가 또는 감소를 고려하여 연결 제한을 조정하는 것이 좋습니다.
  • max_connections 값을 설정하여 각 DB 인스턴스에서 열 것으로 예상되는 최대 연결 수보다 약간 더 높게 설정합니다.
  • RDS for MySQL 인스턴스의 경우 성능 스키마를 활성화한 경우 max_connections 파라미터 설정에 주의하십시오. 성능 스키마 메모리 구조는 서버 구성 변수에 따라 자동으로 크기가 조정됩니다. 변수를 높게 설정할수록 성능 스키마가 더 많은 메모리를 사용합니다. 극단적인 경우 이 조건으로 인해 T2와 T3 등의 더 작은 인스턴스 유형에서 메모리 부족 문제가 발생할 수 있습니다. 성능 스키마를 사용하는 경우 max_connections 설정을 기본값으로 두는 것이 좋습니다. max_connections를 기본값보다 훨씬 높은 값으로 늘리려면 성능 스키마를 비활성화하는 것이 좋습니다.
    참고: Amazon RDS for MySQL DB 인스턴스에 대해 성능 개선 도우미를 활성화하면 성능 스키마가 자동으로 활성화됩니다.
  • MySQL용 RDS 인스턴스의 경우 max_connections 파라미터를 조정할 때 다음 MySQL 연결 관련 파라미터를 검토해야 합니다. wait_timeout: 연결이 종료되기 전 서버가 비대화형 TCP/IP 또는 Unix 파일 연결에서 작업을 대기하는 시간(초)
    interactive_timeout: 서버가 연결을 종료하기 전에 해당 연결에 대한 활동을 기다리는 시간(초)
    net_read_timeout: 읽기 작업을 삭제하기 전에 TCP/IP 연결에서 추가 데이터를 기다리는 시간(초)
    net_write_timeout: 쓰기 작업을 삭제하기 전에 블록이 쓰여질 때까지 TCP/IP 연결을 기다리는 시간(초)
    max_execution_time: SELECT 문에 대한 실행 제한 시간(밀리초)
    max_connect_errors: 중단된 연결 수가 이보다 많으면 호스트가 추가 연결에서 차단됨
    max_user_connections: 지정한 MySQL 계정에 허용되는 최대 동시 연결 수
  • RDS for PostgreSQL 인스턴스의 경우 max_connections 파라미터를 조정할 때 다음 PostgreSQL 연결 관련 파라미터도 검토해야 함
    idle_in_transaction_session_timeout: 지정 기간(밀리초)보다 오래 유휴 상태인, 열린 트랜잭션이 있는 세션을 종료합니다. 이렇게 하면 해당 세션에서 보유한 모든 잠금을 해제하고 연결 슬롯을 재사용할 수 있습니다. 또한 이 트랜잭션에만 표시되는 튜플은 진공 상태입니다.
    tcp_keepalives_idle: 운영 체제가 클라이언트에 TCP 연결 유지 메시지를 보낸 다음의 비활성 시간(초)
    tcp_keepalives_interval: 클라이언트가 인정하지 않는 TCP 연결 유지 메시지가 재전송된 다음의 시간(초)
    tcp_keepalives_count: 서버에 대한 클라이언트 연결이 비활성 상태로 간주되기 전에 손실될 수 있는 TCP 연결 유지 수

참고: 이 문서에는 이러한 파라미터에 대한 권장 값이 포함되어 있지 않습니다. 이러한 값은 본인의 사용 사례에 따라 달라지기 때문입니다.