[AWS MySQL] AWS JDBC Driver for MySQL
- AWS JDBC 드라이버를 사용하여 장애조치 시간 단축하기
l Version : AWS MySQL, Aurora
Amazon Web Service (AWS) JDBC Driver for MySQL을 사용하면 애플리케이션에서 클러스터된 MySQL 데이터베이스의 기능을 활용할 수 있다. AWS JDBC Driver for MySQL 은 오픈소스 MySQL JDBC Connector을 기반으로 제작되었기 때문에 호환 가능하다.
l mysql-connector-j : https://github.com/mysql/mysql-connector-j
l aws-mysql-jdbc : https://github.com/awslabs/aws-mysql-jdbc
MySQL용 AWS JDBC Driver는 MySQL과 호환되는 Amazon Aurora에 대해서도 빠른 장애 조치를 지원한다. Amazon RDS for MySQL 및 온프레미스 MySQL 배포 기능을 포함하여 클러스터형 데이터베이스 추가 기능에 대한 지원이 계획되어 있다.
Amazon Aurora에서 장애 조치는 기본 DB 인스턴스를 사용할 수 없을 때 데이터베이스가 클러스터 상태를 자동으로 복구하는 메커니즘이다. 클러스터가 기본 쓰기-읽기 DB 인스턴스에 최대 가용성을 제공할 수 있도록 데이터베이스 복제본을 새로운 기본 DB 인스턴스로 선택하여 이를 달성한다. 복제본 인스턴스를 기본 DB 인스턴스 역할로 승격하려면 먼저 연결을 올바르게 지정하기 위해 DNS 레코드를 업데이트해야 한다. 이 프로세스는 최대 몇 분이 소요될 수 있다.
MySQL용 AWS JDBC Driver는 가동 중지 시간을 최소화하기 위해 이 동작을 최적화하여 설계되었다. MySQL 클러스터 토폴로지의 캐시와 각 인스턴스의 역할(복제본 또는 기본 DB 인스턴스)을 유지함으로써 이를 달성한다. 이 토폴로지는 MySQL 데이터베이스에 대한 직접 쿼리를 통해 제공되어 DNS 확인으로 인한 지연을 우회하는 지름길을 제공한다. 이를 바탕으로 MySQL용 AWS JDBC Driver는 데이터베이스 클러스터 상태를 보다 면밀히 모니터링하여 새로운 기본 DB 인스턴스에 대한 연결을 최대한 빨리 설정할 수 있다.
MySQL용 AWS JDBC Driver에는 연결 플러그인 관리자도 있다. 플러그인 관리자를 사용하면 개발자는 주요 드라이버 기능을 그대로 유지하면서 유연한 방식으로 드라이버 기능을 확장할 수 있다. 연결 플러그인 관리자는 연결에 대한 초기화, 트리거 및 연결 체인을 정리한다. 연결 플러그인은 해당 연결과 관련된 추가 또는 보완 논리를 실행하는 데 도움이 되도록 각 연결 개체에 연결된 위젯이다. Enhanced Failure Monitoring 기능은 연결 플러그인 중 하나이다. 아래 그림은 연결 플러그인 관리자의 간소화된 워크플로를 보여준다.
드라이버가 JDBC 메소드를 실행할 때마다 연결 플러그인 관리자로 전달된다. Connection Plugin Manager에서 JDBC 메소드가 각 Plugin에 순서대로 전달되어 체인처럼 로드 된다. 이 예제에서는 메서드는 먼저 Custom Plugin A로 전달되고, 다음으로 Custom Plugin B로 전달되고, 마지막으로 Default Plugin으로 전달된다. 이 플러그인은 JDBC 메소드를 실행하고 체인을 통해 결과를 다시 반환한다.
Enhanced Failure Monitoring은 모니터 스레드에 의해 구현된 연결 플러그인으로 MySQL용 AWS JDBC Driver를 향상된 장애 조치를 지원한다. 모니터는 연결된 데이터베이스 노드의 상태를 주기적으로 확인한다. 데이터베이스 노드가 비정상인 것으로 확인되면 새 데이터베이스 노드로 쿼리가 재시도되고 모니터가 다시 시작된다. 기본적으로 Enhanced Failure Monitoring 플러그인이 로드 된다. 그러나 Amazon RDS Proxy를 사용하는 경우에는 향상된 장애 조치가 필요하지 않으며 RDS Proxy드라이버가 처리한다.
아래 표는 Aurora MySQL 5.7(2.10.0)을 사용하여 AWS JDBC Driver for MySQL과 MariaDB Connector/J(Aurora를 인식하도록 구성됨) 간의 장애 조치 시간을 벤치마킹한 결과이다. 데이터베이스에 연결되고 1초마다 테이블에 대해 쿼리를 실행하는 간단한 Java 앱을 실행한다음 Amazon RDS 콘솔을 통해 기본 데이터베이스에 장애 조치 명령이 실행되었다. 두 경우 모두 드라이버가 복제본에 자동으로 다시 연결되었지만 MySQL용 AWS JDBC Driver는 오류를 인식하고 연결하는데 훨씬 빠르게 동작하였다.
벤치 마크 결과를 살펴보면 AWS JDBC Driver for MySQL이 오류 감지에 평균 2초, 복제본에 연결에 평균2초를 수행하여 최종 읽기까지의 중단 시간은 4초가 소요되었다.
MySQL 5.7 | AWS JDBC Driver for MySQL | MariaDB Connector/J Driver |
Average Client Failure Detection | 2 seconds | 19 seconds |
Average Reconnect Time | 2 seconds | 18 seconds |
Total Reconnect Time | 4 seconds | 37 seconds |
AWS JDBC 드라이버를 RDS Proxy와 함께 사용할 때 주의해야할 부분이 있다. Enhanced Failure Monitoring 플러그인이 포함된 MySQL용 AWS JDBC Driver와 함께 RDS Proxy 엔드포인트를 함께 사용할 경우 심각한 문제가 발생하지는 않지만 함께 사용을 권장하지는 않는다. 그 이유는 RDS Proxy가 드라이버 요청을 데이터베이스 인스턴스 중 하나로 투명하게 다시 라우팅하기 때문이다. RDS Proxy는 여러 기준에 따라 어떤 데이터베이스 인스턴스가 사용되는지를 결정한다. 이러한 결정 전환은 인스턴스 상태 모니터링 측면에서 플러그인을 쓸모 없게 만든다. 플러그인은 연결된 실제 인스턴스와 모니터링 중인 인스턴스를 식별할 수 없기 때문에 오류 감지에 대해서 오탐지의 원인이 될 수 있다. 동시에 플러그인은 여전히 RDS Proxy 엔드포인트에 대한 네트워크 연결을 사전에 모니터링하고 중단이 발생할 경우 사용자 애플리케이션에 다시 보고할 수 있기 때문이다. 따라서 Enhanced Failure Monitoring 플러그인을 사용할 때에는 RDS Proxy 엔드포인트를 사용하지 않는 것이 좋다.
[참고자료]
l https://awslabs.github.io/aws-mysql-jdbc/
l https://github.com/awslabs/aws-mysql-jdbc#the-aws-jdbc-driver-failover-process
2022-03-27 / Sungwook Kang / http://sungwookkang.com
AWS JDBC Driver, MySQL Connector, AWS JDBC, MySQL Failover, 장애조치, AWS 장애조치
'AWS' 카테고리의 다른 글
[AWS DMS] AWS DMS를 활용하여 데이터 마이그레이션 과정에서 데이터 마스킹 하기 (0) | 2022.04.03 |
---|---|
[AWS S3] AWS S3 Storage Lens (0) | 2022.03.28 |
[AWS] What is AWS Graviton processor? (0) | 2022.03.26 |
[AWS RDS] RDS Proxy (0) | 2022.03.23 |
[AWS RDS] Modify RDS instance type (0) | 2022.03.23 |