RDS Proxy 개념 및 용어
RDS 프록시를 사용하여 Amazon Aurora DB 클러스터에 대한 연결 관리를 간소화할 수 있습니다.
RDS Proxy는 클라이언트 애플리케이션과 데이터베이스 사이의 네트워크 트래픽을 처리합니다. 데이터베이스 프로토콜을 이해하여 능동적으로 수행합니다. 그런 다음 애플리케이션의 SQL 작업과 데이터베이스의 결과 집합을 기반으로 동작을 조정합니다.
RDS Proxy는 데이터베이스의 연결 관리를 위한 메모리 및 CPU 오버헤드를 줄입니다. 애플리케이션이 많은 연결을 동시에 열 때 데이터베이스에 필요한 메모리 및 CPU 리소스가 더 적습니다. 또한 오랫동안 유휴 상태를 유지하는 연결을 닫았다가 다시 여는 데 애플리케이션의 논리가 필요하지 않습니다. 마찬가지로, 데이터베이스 문제의 경우 연결을 다시 설정하는 데 더 적은 애플리케이션 논리가 필요합니다.
RDS Proxy의 인프라는 고가용성이고 여러 가용 영역(AZ)에 배포됩니다. RDS 프록시의 계산, 메모리 및 스토리지는 Aurora DB 클러스터와 별개입니다. 이러한 분리는 데이터베이스 서버의 오버헤드를 줄여 데이터베이스 워크로드를 처리하는 데 리소스가 투입될 수 있습니다. RDS Proxy 계산 리소스는 서버리스로 데이터베이스 워크로드에 따라 자동으로 조정됩니다.
RDS Proxy 개념 개요
RDS Proxy는 연결 풀링 및 다음 섹션에 설명된 다른 기능을 수행하기 위해 인프라를 처리합니다. RDS 콘솔의 프록시 페이지에서 표시된 프록시를 볼 수 있습니다.
각 프록시는 단일 Aurora DB 클러스터에 대한 연결을 처리합니다. Aurora 프로비저닝된 클러스터의 경우 프록시가 현재 라이터 인스턴스를 자동으로 결정합니다.
프록시가 열린 상태를 유지하고 데이터베이스 애플리케이션이 사용할 수 있는 연결이 연결 풀을 구성합니다.
기본적으로 RDS Proxy는 세션에서 각 트랜잭션 후에 연결을 재사용할 수 있습니다. 이 트랜잭션 수준 재사용을 멀티플렉싱이라고 합니다. RDS Proxy가 일시적으로 연결 풀에서 연결을 제거하여 재사용할 경우 해당 작업을 연결 대여라고 합니다. 그렇게 하는 것이 안전하면 RDS Proxy는 연결 풀에 해당 연결을 반환합니다.
경우에 따라 RDS Proxy는 현재 세션 외부에서 데이터베이스 연결을 재사용하는 것이 안전한지 확신할 수 없습니다. 이러한 경우 세션이 끝날 때까지 동일한 연결에서 세션을 유지합니다. 이 대체 동작을 고정이라고 합니다.
프록시에는 기본 엔드포인트가 있습니다. Amazon Aurora DB 클러스터로 작업할 때 이 엔드포인트에 연결합니다. 클러스터에 직접 연결하는 읽기/쓰기 엔드포인트에 연결하는 대신 이 작업을 수행합니다. Aurora 클러스터에 대한 특수 용도 엔드포인트는 계속 사용할 수 있습니다. Aurora DB 클러스터의 경우, 추가 읽기/쓰기 및 읽기 전용 엔드포인트를 생성할 수도 있습니다. 자세한 내용은 프록시 엔드포인트 개요 단원을 참조하십시오.
예를 들어 연결 풀링 없이 읽기/쓰기 연결을 위해 클러스터 엔드포인트에 계속 연결할 수 있습니다. 로드 밸런싱된 읽기 전용 연결을 위해 리더 엔드포인트에 계속 연결할 수 있습니다. 클러스터의 특정 DB 인스턴스에 대한 진단 및 문제 해결을 위해 인스턴스 엔드포인트에 계속 연결할 수 있습니다. AWS Lambda 같은 다른 AWS 서비스를 사용하여 RDS 데이터베이스에 연결하는 경우 프록시 엔드포인트를 사용하도록 연결 설정을 변경합니다. 예를 들어 RDS Proxy 기능을 활용하면서 Lambda 함수가 데이터베이스에 액세스할 수 있도록 프록시 엔드포인트을 지정합니다.
각 프록시는 대상 그룹을 포함합니다. 이 대상 그룹은 프록시가 연결할 수 있는 Aurora DB 클러스터를 구현합니다. Aurora 클러스터의 경우 기본적으로 대상 그룹은 해당 클러스터의 모든 DB 인스턴스와 연결됩니다. 이렇게 하면 프록시가 클러스터에서 라이터 인스턴스로 승격되는 Aurora DB 인스턴스에 연결할 수 있습니다. 프록시와 연결된 Aurora DB 클러스터를 해당 프록시의 대상이라고 합니다. 편의를 위해 콘솔을 통해 프록시를 생성하면 RDS Proxy는 해당 대상 그룹을 생성하고 연결된 대상을 자동으로 등록합니다.
엔진 패밀리는 동일한 DB 프로토콜을 사용하는 관련 데이터베이스 엔진 집합입니다. 생성하는 각 프록시에 대해 엔진 패밀리를 선택합니다.
연결 풀링
각 프록시는 연결된 Aurora DB의 라이터 인스턴스에 대한 연결 풀링을 수행합니다. 연결 풀링은 연결을 열고 닫으며 많은 연결을 동시에 열린 상태로 유지하는 데 관련된 오버헤드를 줄이는 최적화 기능입니다. 이 오버헤드에는 각각의 새로운 연결을 처리하는 데 필요한 메모리가 포함됩니다. 또한 각 연결을 닫고 새 연결을 여는 데는 CPU 오버헤드가 수반됩니다. 예를 들어 Transport Layer Security/Secure Sockets Layer(TLS/SSL) 핸드셰이킹, 인증, 협상 기능 등이 포함됩니다. 연결 풀링은 애플리케이션 논리를 단순화합니다. 동시 연결 수를 최소화하기 위해 애플리케이션 코드를 작성할 필요가 없습니다.
또한 각 프록시는 연결 재사용이라고도 하는 연결 멀티플렉싱을 수행합니다. 멀티플렉싱을 사용하면 RDS 프록시가 하나의 기본 데이터베이스 연결을 사용하여 한 트랜잭션에 대한 모든 작업을 수행합니다. 그런 다음 RDS 는 다음 트랜잭션에 대해 다른 연결을 사용할 수 있습니다. 사용자는 프록시에 대해 많은 동시 연결을 열 수 있고, 프록시는 DB 인스턴스 또는 클러스터에 대해 더 적은 수의 연결을 열린 상태로 유지합니다. 이렇게 하면 데이터베이스 서버에서 연결에 대한 메모리 오버헤드가 최소화됩니다. 이 기술은 또한 “연결이 너무 많음” 오류의 가능성을 줄입니다.
RDS Proxy 보안
RDS Proxy는 TLS/SSL 및 AWS Identity and Access Management(IAM)와 같은 기존 RDS 보안 메커니즘을 사용합니다. 이러한 보안 기능에 대한 일반적인 내용은 Amazon Aurora의 보안 단원을 참조하십시오. 또한 Aurora가 인증, 권한 부여 및 기타 보안 영역에서 작동하는 방식을 숙지해야 합니다.
RDS Proxy는 클라이언트 애플리케이션과 기본 데이터베이스 간의 추가 보안 계층의 역할을 할 수 있습니다. 예를 들어 기본 DB 인스턴스가 이전 버전의 TLS를 지원하더라도 TLS 1.3을 사용하여 프록시에 연결할 수 있습니다. IAM 역할을 사용하여 프록시에 연결할 수 있습니다. 프록시가 기본 사용자 및 암호 인증 방법을 사용하여 데이터베이스에 연결하더라도 마찬가지입니다. 이 기술을 사용하면 많은 비용을 들여 DB 인스턴스 자체를 마이그레이션하지 않아도 데이터베이스 애플리케이션에 강력한 인증 요구 사항을 적용할 수 있습니다.
RDS Proxy가 사용하는 데이터베이스 자격 증명을 AWS Secrets Manager에 저장합니다. 프록시가 액세스하는 Aurora DB 클러스터의 각 데이터베이스 사용자는 Secrets Manager에 해당하는 보안 암호가 있어야 합니다. RDS Proxy의 사용자에 대한 IAM 인증을 설정할 수도 있습니다. 이렇게 하면 데이터베이스가 여전히 기본 암호 인증을 사용하는 경우에도 데이터베이스 액세스에 IAM 인증을 적용할 수 있습니다. 애플리케이션 코드에 데이터베이스 자격 증명을 포함하는 대신 이러한 보안 기능을 사용하는 것이 좋습니다.
RDS Proxy에서 TLS/SSL 사용
TLS/SSL 프로토콜을 사용하여 RDS Proxy에 연결할 수 있습니다.
참고
RDS Proxy는 AWS Certificate Manager(ACM)의 인증서를 사용합니다. RDS Proxy을 사용하는 경우 Amazon RDS 인증서를 다운로드하거나 RDS Proxy 연결을 사용하는 애플리케이션을 업데이트할 필요가 없습니다.
프록시와 데이터베이스 간의 모든 연결에 TLS를 적용하려면 AWS Management Console에서 프록시를 생성하거나 수정할 때 전송 계층 보안 필요 설정을 지정할 수 있습니다.
RDS Proxy를 사용하면 세션에서 클라이언트와 RDS Proxy 엔드포인트 간에 TLS/SSL을 사용하도록 할 수 있습니다. RDS Proxy가 그렇게 하도록 하려면 클라이언트 측에서 요구 사항을 지정합니다. SSL 세션 변수는 RDS Proxy를 사용하는 데이터베이스에 대한 SSL 연결에 대해 설정되지 않습니다.
-
Aurora MySQL의 경우
mysql
명령을 실행할 때--ssl-mode
파라미터를 사용하여 클라이언트 측에서 요구 사항을 지정합니다. -
Aurora PostgreSQL의 경우
psql
명령을 실행할 때conninfo
문자열의 일부로sslmode=require
를 지정합니다.
RDS Proxy는 TLS 프로토콜 버전 1.0, 1.1, 1.2 및 1.3을 지원합니다. 기본 데이터베이스에서 사용하는 것보다 더 높은 버전의 TLS를 사용하여 프록시에 연결할 수 있습니다.
기본적으로 클라이언트 프로그램은 RDS Proxy와의 암호화된 연결을 설정하며, --ssl-mode
옵션을 통해 추가 제어 기능도 제공합니다. 클라이언트 측에서 RDS Proxy는 모든 SSL 모드를 지원합니다.
클라이언트의 경우, SSL 모드는 다음과 같습니다.
- PREFERRED
-
SSL이 최우선 선택 사항이지만 필수는 아닙니다.
- 비활성화됨
-
SSL이 허용되지 않습니다.
- 필수
-
SSL을 설정합니다.
- VERIFY_CA
-
SSL을 설정하고 인증 기관(CA)을 확인합니다.
- VERIFY_IDENTITY
-
SSL을 설정하고 CA 및 CA 호스트 이름을 확인합니다.
--ssl-mode
, VERIFY_CA
또는 VERIFY_IDENTITY
과 함께 클라이언트를 사용하는 경우 --ssl-ca
형식의 CA를 가리키는 .pem
옵션을 지정합니다. 사용할 .pem
파일의 경우 Amazon Trust Services.pem
파일에 배치하세요.
RDS 프록시에서는 도메인과 하위 도메인 모두에 적용되는 와일드카드 인증서를 사용합니다. mysql
클라이언트를 사용하여 SSL 모드 VERIFY_IDENTITY
로 연결하는 경우 현재는 MySQL 8.0 호환 mysql
명령을 사용해야 합니다.
장애 조치
장애 조치는 원래 인스턴스를 사용할 수 없게 될 때 데이터베이스 인스턴스를 다른 인스턴스로 대체하는 고가용성 기능입니다. 장애 조치는 데이터베이스 인스턴스 문제로 인해 발생할 수 있습니다. 또한 데이터베이스 업그레이드를 수행하는 경우와 같이 일반적인 유지 관리 절차의 일부로 발생할 수 있습니다. 장애 조치는 라이터 인스턴스 이외에 하나 이상의 리더 인스턴스가 있는 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 연결에 특히 중요합니다.
트랜잭션
단일 트랜잭션 내의 모든 명령문은 항상 동일한 기본 데이터베이스 연결을 사용합니다. 트랜잭션이 종료하면 다른 세션에서 연결을 사용할 수 있게 됩니다. 트랜잭션을 세분화 단위로 사용하면 다음과 같은 결과가 발생합니다.
-
Aurora MySQL
autocommit
설정을 활성화하면 개별 문 종료 후 연결 재사용이 발생할 수 있습니다. -
반대로,
autocommit
설정을 비활성화하면 세션에서 실행하는 첫 번째 문이 새 트랜잭션을 시작합니다. 예를 들어,SELECT
,INSERT
,UPDATE
및 기타 데이터 조작 언어(DML) 문의 시퀀스를 입력한다고 가정합시다. 이 경우,COMMIT
,ROLLBACK
을 실행하거나 기타 방법으로 트랜잭션을 종료할 때까지 연결을 재사용할 수 없습니다. -
DDL(데이터 정의 언어) 문을 입력하면 해당 문이 완료된 후 트랜잭션이 종료합니다.
RDS Proxy는 데이터베이스 클라이언트 애플리케이션에서 사용하는 네트워크 프로토콜을 통해 트랜잭션이 종료하는 시점을 감지합니다. 트랜잭션 감지는 SQL 문의 텍스트에 나타나는 COMMIT
또는 ROLLBACK
같은 키워드에 의존하지 않습니다.
경우에 따라 RDS Proxy에서 세션을 다른 연결로 이동하는 것이 비현실적인 데이터베이스 요청을 감지할 수 있습니다. 이러한 경우 세션의 나머지 부분에서 해당 연결에 대한 멀티플렉싱을 해제합니다. RDS Proxy가 세션에서 멀티플렉싱이 실용적이라는 것을 확신할 수 없는 경우에도 동일한 규칙이 적용됩니다. 이 작업을 고정이라고 합니다. 고정을 탐지하고 최소화하는 방법은 RDS 프록시 고정 방지 단원을 참조하십시오.