RDS Proxy 개념 및 용어 - Amazon Relational Database Service

RDS Proxy 개념 및 용어

RDS Proxy를 사용하여 Amazon RDS DB 인스턴스와 Amazon Aurora DB 클러스터에 대한 연결 관리를 간소화할 수 있습니다.

RDS Proxy는 클라이언트 애플리케이션과 데이터베이스 사이의 네트워크 트래픽을 처리합니다. 데이터베이스 프로토콜을 이해하여 능동적으로 수행합니다. 그런 다음 애플리케이션의 SQL 작업과 데이터베이스의 결과 집합을 기반으로 동작을 조정합니다.

RDS Proxy는 데이터베이스의 연결 관리를 위한 메모리 및 CPU 오버헤드를 줄입니다. 애플리케이션이 많은 연결을 동시에 열 때 데이터베이스에 필요한 메모리 및 CPU 리소스가 더 적습니다. 또한 오랫동안 유휴 상태를 유지하는 연결을 닫았다가 다시 여는 데 애플리케이션의 논리가 필요하지 않습니다. 마찬가지로, 데이터베이스 문제의 경우 연결을 다시 설정하는 데 더 적은 애플리케이션 논리가 필요합니다.

RDS Proxy의 인프라는 고가용성이고 여러 가용 영역(AZ)에 배포됩니다. RDS Proxy의 계산, 메모리 및 스토리지는 RDS DB 인스턴스 및 Aurora DB 클러스터와 독립적입니다. 이러한 분리는 데이터베이스 서버의 오버헤드를 줄여 데이터베이스 워크로드를 처리하는 데 리소스가 투입될 수 있습니다. RDS Proxy 계산 리소스는 서버리스로 데이터베이스 워크로드에 따라 자동으로 조정됩니다.

RDS Proxy 개념 개요

RDS Proxy는 연결 풀링 및 다음에 설명된 다른 기능을 수행하기 위해 인프라를 처리합니다. RDS 콘솔의 프록시 페이지에서 표시된 프록시를 볼 수 있습니다.

각 프록시는 단일 RDS DB 인스턴스 또는 Aurora DB 클러스터에 대한 연결을 처리합니다. RDS 다중 AZ DB 인스턴스 및 Aurora 프로비저닝된 클러스터의 경우 프록시가 현재 라이터 인스턴스를 결정합니다. Aurora 멀티 마스터 클러스터의 경우 프록시는 라이터 인스턴스 중 하나에 연결하고 다른 라이터 인스턴스를 핫 대기 대상으로 사용합니다.

프록시가 열린 상태를 유지하고 데이터베이스 애플리케이션이 사용할 수 있는 연결이 연결 풀을 구성합니다.

기본적으로 RDS Proxy는 세션에서 각 트랜잭션 후에 연결을 재사용할 수 있습니다. 이 트랜잭션 수준 재사용을 멀티플렉싱이라고 합니다. RDS Proxy가 일시적으로 연결 풀에서 연결을 제거하여 재사용할 경우 해당 작업을 연결 대여라고 합니다. 그렇게 하는 것이 안전하면 RDS Proxy는 연결 풀에 해당 연결을 반환합니다.

경우에 따라 RDS Proxy는 현재 세션 외부에서 데이터베이스 연결을 재사용하는 것이 안전한지 확신할 수 없습니다. 이러한 경우 세션이 끝날 때까지 동일한 연결에서 세션을 유지합니다. 이 대체 동작을 고정이라고 합니다.

프록시에는 기본 엔드포인트가 있습니다. RDS DB 인스턴스 또는 Aurora DB 클러스터로 작업할 때 인스턴스 또는 클러스터에 직접 연결하는 읽기/쓰기 엔드포인트에 연결하는 대신 이 엔드포인트에 연결합니다. Aurora 클러스터에 대한 특수 용도 엔드포인트는 계속 사용할 수 있습니다. Aurora DB 클러스터의 경우, 추가 읽기/쓰기 및 읽기 전용 엔드포인트를 생성할 수도 있습니다. 자세한 내용은 프록시 엔드포인트 개요 섹션을 참조하세요.

예를 들어 연결 풀링 없이 읽기/쓰기 연결을 위해 클러스터 엔드포인트에 계속 연결할 수 있습니다. 로드 밸런싱된 읽기 전용 연결을 위해 리더 엔드포인트에 계속 연결할 수 있습니다. Aurora 클러스터의 특정 DB 인스턴스에 대한 진단 및 문제 해결을 위해 인스턴스 엔드포인트에 계속 연결할 수 있습니다. AWS 같은 다른 AWS Lambda 서비스를 사용하여 RDS 데이터베이스에 연결하는 경우 프록시 엔드포인트를 사용하도록 연결 설정을 변경합니다. 예를 들어 RDS Proxy 기능을 활용하면서 Lambda 함수가 데이터베이스에 액세스할 수 있도록 프록시 엔드포인트을 지정합니다.

각 프록시는 대상 그룹을 포함합니다. 이 대상 그룹은 프록시가 연결할 수 있는 RDS DB 인스턴스 또는 Aurora DB 클러스터를 구현합니다. Aurora 클러스터의 경우 기본적으로 대상 그룹은 해당 클러스터의 모든 DB 인스턴스와 연결됩니다. 이렇게 하면 프록시가 클러스터에서 라이터 인스턴스로 승격되는 Aurora DB 인스턴스에 연결할 수 있습니다. 프록시와 연결된 RDS DB 인스턴스 또는 Aurora DB 클러스터 및 인스턴스를 해당 프록시의 대상이라고 합니다. 편의를 위해 콘솔을 통해 프록시를 생성하면 RDS Proxy는 해당 대상 그룹을 생성하고 연결된 대상을 자동으로 등록합니다.

엔진 패밀리는 동일한 DB 프로토콜을 사용하는 관련 데이터베이스 엔진 집합입니다. 생성하는 각 프록시에 대해 엔진 패밀리를 선택합니다.

연결 풀링

각 프록시는 연결된 RDS 또는 Aurora 데이터베이스의 라이터 인스턴스에 대한 연결 풀링을 수행합니다. 연결 풀링은 연결을 열고 닫으며 많은 연결을 동시에 열린 상태로 유지하는 데 관련된 오버헤드를 줄이는 최적화 기능입니다. 이 오버헤드에는 각각의 새로운 연결을 처리하는 데 필요한 메모리가 포함됩니다. 또한 각 연결을 닫고 Transport Layer Security/Secure Sockets Layer(TLS/SSL) 핸드셰이킹, 인증, 협상 기능 등과 같은 새 연결을 여는 CPU 오버헤드가 포함됩니다. 연결 풀링은 애플리케이션 논리를 단순화합니다. 동시 연결 수를 최소화하기 위해 애플리케이션 코드를 작성할 필요가 없습니다.

또한 각 프록시는 연결 재사용이라고도 하는 연결 멀티플렉싱을 수행합니다. 멀티플렉싱을 사용하면 RDS Proxy가 하나의 기본 데이터베이스 연결을 사용하여 한 트랜잭션에 대한 모든 작업을 수행한 후 다음 트랜잭션에 대해 다른 연결을 사용할 수 있습니다. 사용자는 프록시에 대해 많은 동시 연결을 열 수 있고, 프록시는 DB 인스턴스 또는 클러스터에 대해 더 적은 수의 연결을 열린 상태로 유지합니다. 이렇게 하면 데이터베이스 서버에서 연결에 대한 메모리 오버헤드가 최소화됩니다. 이 기술은 또한 “연결이 너무 많음” 오류의 가능성을 줄입니다.

RDS Proxy 보안

RDS Proxy는 TLS/SSL 및 AWS Identity and Access Management(IAM)와 같은 기존 RDS 보안 메커니즘을 사용합니다. 이러한 보안 기능에 대한 일반적인 내용은 Amazon RDS의 보안 단원을 참조하십시오. RDS 및 Aurora가 인증, 권한 부여 및 기타 보안 영역에서 작동하는 방식을 잘 모르는 경우 먼저 RDS 및 Aurora이 해당 영역에서 작동하는 방식을 숙지해야 합니다.

RDS Proxy는 클라이언트 애플리케이션과 기본 데이터베이스 간의 추가 보안 계층의 역할을 할 수 있습니다. 예를 들어 기본 DB 인스턴스가 TLS 1.0 또는 1.1만 지원하더라도 TLS 1.2를 사용하여 프록시에 연결할 수 있습니다. 프록시가 기본 사용자 및 암호 인증 방법을 사용하여 데이터베이스에 연결하더라도 IAM 역할을 사용하여 프록시에 연결할 수 있습니다. 이 기술을 사용하면 많은 비용을 들여 DB 인스턴스 자체를 마이그레이션하지 않아도 데이터베이스 애플리케이션에 강력한 인증 요구 사항을 적용할 수 있습니다.

RDS Proxy가 사용하는 데이터베이스 자격 증명을 AWS Secrets Manager에 저장합니다. 프록시가 액세스하는 RDS DB 인스턴스 또는 Aurora DB 클러스터의 각 데이터베이스 사용자는 Secrets Manager에 해당하는 암호가 있어야 합니다. RDS Proxy의 사용자에 대한 IAM 인증을 설정할 수도 있습니다. 이렇게 하면 데이터베이스가 여전히 기본 암호 인증을 사용하는 경우에도 데이터베이스 액세스에 IAM 인증을 적용할 수 있습니다. 애플리케이션 코드에 데이터베이스 자격 증명을 포함하는 대신 이러한 보안 기능을 사용하는 것이 좋습니다.

RDS Proxy에서 TLS/SSL 사용

TLS/SSL 프로토콜을 사용하여 RDS Proxy에 연결할 수 있습니다.

참고

RDS Proxy는 AWS Certificate Manager(ACM)의 인증서를 사용합니다. RDS Proxy를 사용하는 경우 TLS/SSL 인증서를 교체할 때 RDS Proxy 연결을 사용하는 애플리케이션을 업데이트할 필요가 없습니다.

프록시와 데이터베이스 간의 모든 연결에 TLS를 적용하려면 프록시를 생성하거나 수정할 때 전송 계층 보안 필요 설정을 지정할 수 있습니다.

RDS Proxy를 사용하면 세션에서 클라이언트와 RDS Proxy 엔드포인트 간에 TLS/SSL을 사용하도록 할 수 있습니다. RDS Proxy가 그렇게 하도록 하려면 클라이언트 측에서 요구 사항을 지정합니다. SSL 세션 변수는 RDS Proxy를 사용하는 데이터베이스에 대한 SSL 연결에 대해 설정되지 않습니다.

  • RDS for MySQL 및 Aurora MySQL의 경우 --ssl-mode 명령을 실행할 때 mysql 파라미터를 사용하여 클라이언트 측에서 요구 사항을 지정합니다.

  • Amazon RDS PostgreSQL 및 Aurora PostgreSQL의 경우 sslmode=require 명령을 실행할 때 conninfo 문자열의 일부로 psql를 지정합니다.

RDS Proxy는 TLS 프로토콜 버전 1.0, 1.1 및 1.2를 지원합니다. 기본 데이터베이스에서 사용하는 것보다 더 높은 버전의 TLS를 사용하여 프록시에 연결할 수 있습니다.

기본적으로 클라이언트 프로그램은 RDS Proxy와의 암호화된 연결을 설정하며, --ssl-mode 옵션을 통해 추가 제어 기능도 제공합니다. 클라이언트 측에서 RDS Proxy는 모든 SSL 모드를 지원합니다.

클라이언트의 경우, SSL 모드는 다음과 같습니다.

PREFERRED

SSL이 최우선 선택 사항이지만 필수는 아닙니다.

비활성화됨

SSL이 허용되지 않습니다.

필수

SSL을 설정합니다.

VERIFY_CA

SSL을 설정하고 인증 기관(CA)을 확인합니다.

VERIFY_IDENTITY

SSL을 설정하고 CA 및 CA 호스트 이름을 확인합니다.

참고

기본 프록시 엔드포인트에 연결할 때 SSL 모드 VERIFY_IDENTITY를 사용할 수 있습니다. 생성한 프록시 엔드포인트에 연결할 때는 해당 SSL 모드를 사용할 수 없습니다.

--ssl-mode, VERIFY_CA 또는 VERIFY_IDENTITY과 함께 클라이언트를 사용하는 경우 --ssl-ca 형식의 CA를 가리키는 .pem 옵션을 지정합니다. 사용할 수 있는 .pem 파일을 보려면 Amazon Trust Services에서 Amazon 루트 CA 1 트러스트 스토어를 다운로드하세요.

RDS Proxy에서는 도메인과 하위 도메인 모두에 적용되는 와일드카드 인증서를 사용합니다. mysql 클라이언트를 사용하여 SSL 모드 VERIFY_IDENTITY로 연결하는 경우 현재는 MySQL 8.0 호환 mysql 명령을 사용해야 합니다.

Failover

장애 조치는 원래 인스턴스를 사용할 수 없게 될 때 데이터베이스 인스턴스를 다른 인스턴스로 대체하는 고가용성 기능입니다. 장애 조치는 데이터베이스 인스턴스 문제로 인해 발생할 수 있습니다. 또한 데이터베이스 업그레이드를 수행하는 경우와 같이 일반적인 유지 관리 절차의 일부로 발생할 수 있습니다. 장애 조치는 다중 AZ 구성의 RDS DB 인스턴스와 라이터 인스턴스 이외에 하나 이상의 리더 인스턴스가 있는 Aurora DB 클러스터에 적용됩니다.

프록시를 통해 연결하면 애플리케이션이 데이터베이스 장애 조치를 보다 효율적으로 수행할 수 있습니다. 원래 DB 인스턴스를 사용할 수 없게 되면 RDS Proxy가 유휴 애플리케이션 연결을 끊지 않고 대기 데이터베이스에 연결합니다. 이렇게 하면 장애 조치 프로세스를 단축하고 간소화할 수 있습니다. 그 결과 일반적인 재부팅 또는 데이터베이스 문제보다 애플리케이션 중단을 줄일 수 있는 빠른 장애 조치가 가능합니다.

RDS Proxy를 사용하지 않으면 장애 조치에 잠시 중단이 필요합니다. 중단 중에는 해당 데이터베이스에 대해 쓰기 작업을 수행할 수 없습니다. 모든 기존 데이터베이스 연결이 중단되고 애플리케이션이 해당 연결을 다시 열어야 합니다. 읽기 전용 DB 인스턴스를 사용할 수 없는 인스턴스 대신 사용할 수 있도록 승격하면 새 연결 및 쓰기 작업에 데이터베이스를 사용할 수 있게 됩니다.

DB 장애 조치 중에 RDS Proxy는 계속해서 동일한 IP 주소에서 연결을 수락하고 자동으로 연결을 새 기본 DB 인스턴스로 전달합니다. RDS Proxy를 통해 연결하는 클라이언트는 다음 사항에 영향을 받지 않습니다.

  • 장애 조치 시 Domain Name System(DNS) 전파가 지연됩니다.

  • 로컬 DNS 캐싱.

  • 연결 시간 초과.

  • 현재 라이터인 DB 인스턴스가 확실하지 않습니다.

  • 연결을 닫지 않은 상태에서 사용할 수 없게 된 이전 라이터의 쿼리 응답을 기다립니다.

자체 연결 풀을 유지 관리하는 애플리케이션의 경우 RDS Proxy를 통해 연결한다는 것은 장애 조치 또는 기타 중단 중에 대부분의 연결이 활성 상태를 유지함을 의미합니다. 트랜잭션 도중 또는 SQL 문의 중간에 있는 연결만 취소됩니다. RDS Proxy는 새 연결을 즉시 수락합니다. 데이터베이스 라이터를 사용할 수 없는 경우 RDS Proxy는 들어오는 요청을 대기열에 넣습니다.

자체 연결 풀을 유지 관리하지 않는 애플리케이션의 경우 RDS Proxy는 더 빠른 연결 속도와 더 많은 열린 연결을 제공합니다. 그러므로 데이터베이스에서 자주 다시 연결하기 위한 비용이 많이 드는 오버헤드가 감소합니다. 이를 위해 RDS Proxy 연결 풀에서 유지 관리되는 데이터베이스 연결을 재사용합니다. 이 접근 방식은 설정 비용이 상당한 TLS 연결에 특히 중요합니다.

Transactions

단일 트랜잭션 내의 모든 명령문은 항상 동일한 기본 데이터베이스 연결을 사용합니다. 트랜잭션이 종료하면 다른 세션에서 연결을 사용할 수 있게 됩니다. 트랜잭션을 세분화 단위로 사용하면 다음과 같은 결과가 발생합니다.

  • RDS for MySQL 또는 Aurora MySQL autocommit 설정을 활성화하면 각 개별 문 종료 후 연결 재사용이 발생할 수 있습니다.

  • 반대로, autocommit 설정을 비활성화하면 세션에서 실행하는 첫 번째 문이 새 트랜잭션을 시작합니다. 따라서 SELECT, INSERT, UPDATE 및 기타 DML(데이터 조작 언어) 문의 시퀀스를 입력하면 COMMIT, ROLLBACK를 실행하거나 기타 방법으로 트랜잭션을 종료할 때까지 연결을 재사용할 수 없습니다.

  • DDL(데이터 정의 언어) 문을 입력하면 해당 문이 완료된 후 트랜잭션이 종료합니다.

RDS Proxy는 데이터베이스 클라이언트 애플리케이션에서 사용하는 네트워크 프로토콜을 통해 트랜잭션이 종료하는 시점을 감지합니다. 트랜잭션 감지는 SQL 문의 텍스트에 나타나는 COMMIT 또는 ROLLBACK 같은 키워드에 의존하지 않습니다.

경우에 따라 RDS Proxy에서 세션을 다른 연결로 이동하는 것이 비현실적인 데이터베이스 요청을 감지할 수 있습니다. 이러한 경우 세션의 나머지 부분에서 해당 연결에 대한 멀티플렉싱을 해제합니다. RDS Proxy가 세션에서 멀티플렉싱이 실용적이라는 것을 확신할 수 없는 경우에도 동일한 규칙이 적용됩니다. 이 작업을 고정이라고 합니다. 고정을 탐지하고 최소화하는 방법은 고정 방지 단원을 참조하십시오.