AWS JDBC Driver for Amazon Aurora MySQL

Share

Last Updated on 2월 23, 2023 by Jade(정현호)

안녕하세요 
이번 포스팅에서는 Amazon AWS 에서 새롭게 출시한 Java의 MySQL 접속 드라이버인 AWS JDBC Driver 에 대해서 확인 해보려고 합니다. 

드라이버의 특징

AWS JDBC Driver 는 MySQL 8.0.28 community driver 를 기반으로 기능을 추가한 JDBC Driver 입니다.
22년 3월 1일에 정식 버전(1.0.0)이 릴리즈 되었습니다.

포스팅 업데이트 기준으로 현재 가장 최신 버전은  1.1.4 버전 입니다.



MySQL JDBC Connector 를 기반으로 제작 되었기 때문에 호환성 가지고 있습니다.

AWS JDBC Driver 는 MySQL 과 호환되는 Amazon Aurora for MySQL 의 빠른 장애조치(failover) 를 지원 합니다.

Amazon Aurora DB 클러스터는 기본 DB 인스턴스를 사용할 수 없게 되면 failover 를 사용하여 DB 클러스터 상태를 자동으로 복구합니다.

장애 조치 중에 Aurora는 복제본(Read Replica)을 새로운 기본(Primary) DB 인스턴스로 승격하여 DB 클러스터가 기본 읽기-쓰기 DB 인스턴스에 최대 가용성을 제공할 수 있도록 합니다.

MySQL용 AWS JDBC Driver는 DB 인스턴스 오류 발생 시 다운타임을 최소화하기 위해 이 동작을 조정하도록 설계 되었다고 합니다.

포스팅 업데이트 : 2023/03/23
         

AWS JDBC 드라이버 장애 조치 프로세스

Amazon Aurora 는 장애 조치를 통해 고가용성을 제공할 수 있지만 기존 클라이언트 드라이버는 현재 이 기능을 완전히 활용하지 못합니다.

이는 연결을 다시 맺기 위해 새 기본(Primary) DB 인스턴스의 DNS 정보가 완전히 확인되는 데 시간이 필요하기 때문입니다.

[github.com/awslabs]

MySQL용 AWS JDBC Driver는 Aurora 클러스터 토폴로지의 캐시(Topology Cache) 와 각 DB 인스턴스의 역할(Aurora replicas or primary DB instance)을 유지함으로써 장애 조치 동작을 완전히 활용합니다.

이 토폴로지(Topology Cache)는 Aurora 데이터베이스에 대한 직접 쿼리(AWS JDBC 드라이버에 의해)을 통해 제공 되고, 기본적으로 DNS 확인에 대한 지연을 우회하는 지름길을 제공하게 됩니다.

AWS JDBC Driver for MySQL은 새로운 기본 DB 인스턴스에 대해서 최대한 빨리 연결을 설정할 수 있도록 Aurora DB 클러스터 상태를 보다 면밀히 모니터링할 수 있으며,그로 인하여 데이터베이스 장애 조치 시간을 줄이면서 전체 응용 프로그램 가용성이 증가할 수 있습니다.
           

드라이버 다운로드 및 테스트 결과

드라이버는 아래와 같이 wget 등으로 직접 다운로드 받을 수 있으며 또는 github 에서 다운로드 받을 수 있습니다.

wget https://github.com/awslabs/aws-mysql-jdbc/releases/download/1.0.0/aws-mysql-jdbc-1.0.0.jar


• gitbub 주소


사용에 관해서는 다음 두 가지 방법으로 MySQL용 AWS JDBC 드라이버를 설치할 수 있음을 설명하고 있습니다.


1. .jar 파일 직접 사용
2. Maven 또는 Gradle과 같은 패키지 관리자를 통해


테스트 결과

아래는 AWS 에서 자체적으로 테스트 한 결과 로 장애를 감지하고 다시 쿼리가 수행되기 까지의 시간에 대해서 측정한 결과 입니다.

Aurora for 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 Driver for MySQL

12:55:29.799 connected-to:test-aurora-mysql-jade Writer:instance-1 Reader:instance-2
12:55:30.810 connected-to:test-aurora-mysql-jade Writer:instance-1 Reader:instance-2
<---
12:55:32.823 connected-to:instance-2 Writer:instance-2 Reader:
12:55:33.833 connected-to:instance-2 Writer:instance-2 Reader:
12:55:34.842 connected-to:instance-2 Writer:instance-2 Reader:
<--- 인스턴스 2개가 모두 확인 되는데 까지 약 4-5초
12:55:35.851 connected-to:instance-2 Writer:instance-2 Reader:instance-1
12:55:36.863 connected-to:instance-2 Writer:instance-2 Reader:instance-1


•MariaDB JDBC Connector

11:52:44.117 connected-to:test-aurora-mysql-jade Writer:instance-1 Reader:instance-2
11:52:45.207 connected-to:test-aurora-mysql-jade Writer:instance-1 Reader:instance-2
11:52:46.217 connected-to:test-aurora-mysql-jade Writer:instance-1 Reader:instance-2
<------------- 쿼리가 다시 수행되기 까지 약 30초가 걸림
11:53:17.444 connected-to:test-aurora-mysql-jade Writer:instance-2 Reader:instance-1
11:53:18.454 connected-to:test-aurora-mysql-jade Writer:instance-2 Reader:instance-1
11:53:11.467 connected-to:test-aurora-mysql-jade Writer:instance-2 Reader:instance-1


Aurora for MySQL 3.01 에서 테스트 하였으며 장애조치(failover) 시 중간에 쿼리가 멈춘 다음에 다시 쿼리가 수행되기 까지의 시간기준으로 확인 하였을 때 다시 쿼리가 수행되기 까지 AWS JDBC Driver 가 약 4~5초, MariaDB JDBC Connector 가 약 30초 가량 소요되는 것을 확인할 수 있었습니다,


조금 더 빠른 Failover 나 예정된 작업에 의한 Takeover 시 조금 더 빠른 세션 처리를 위해서는 AWS JDBC Driver 사용에 대해서 고려해보는 것도 한가지 방법이 될 것 같습니다.


추가적으로 AWS MySQL JDBC 드라이버는 MySQL JDBC connector 기반(호환)으로 제작된 점으로 확인 하였을 때 아직까지는 MariaDB JDBC Driver 의 특장점인 실행한 쿼리에 따른 Write/Read 인스턴스 Split 기능에 대해서는 확인 되지 않고 있으며, 공식적으로도 아직 지원이 되지 않고 있다는 점이 명시되어 있습니다.

Read-Write Splitting
The driver does not support read-write splitting yet.


다만 프로젝트의 github 에서 확인 해보면 관련된 기능에 대해 PR 이 계속적으로 진행 중임으로 향후에 지금의 MariaDB Connector/J 2.x 버전에서 지원하는 Writer Reader Split 관련 기능은 지원이 될 수 도 있지 않을까 하는 개인적으로 예상은 해보고 있습니다.

(https://github.com/awslabs/aws-mysql-jdbc/pull/228)
        

AWS JDBC 드라이버 와 MariaDB Connector/J

이 부분에서는 AWS JDBC Driver 와 MariaDB Connector/J Driver 의 변화된 정책이나 방향성 그리고 향후 드라이버 선택 그리고 고려 사항등에 대해서 확인해보려고 합니다.
     

Driver 별 변경 내용 과 변경된 방향성

먼저 AWS JDBC Driver 가 출시된 이후 AWS Aurora MySQL 에서 MariaDB Connector/J 를 사용한 빠른 페일오버 등에 관한 기존의 블로그 글에 업데이트 된 내용이 있습니다.

 

March 2022 update: The latest version of the MariaDB JDBC Driver (Connector/J) no longer supports Amazon Aurora. We recommend using the AWS JDBC Driver for MySQL which is based on and can be used as a drop-in compatible for the MySQL Connector/J driver, and is compatible with all MySQL deployments.


번역하면 다음과 같은 내용이 됩니다.

최신 버전의 MariaDB JDBC 드라이버(Connector/J)는 더 이상 Amazon Aurora를 지원하지 않습니다. MySQL용 AWS JDBC 드라이버를 사용하는 것이 좋습니다.

이 드라이버는 MySQL Connector/J 드라이버를 기반으로 하고 드롭인 호환(drop-in compatible)으로 사용할 수 있으며 모든 MySQL deployments와 호환됩니다.

그래서 MariaDB Connector/J 사이트를 보면 동일한 내용이 기재되어 있습니다.

 

Failover and Load-Balancing Modes : aurora
This mode has been available since MariaDB Connector/J 1.2.0 and not supported anymore since 3.0 version


driver 3.0 is a complete rewrite of the connector. Specific support for aurora has not been implemented in 3.0, since it relies on pipelining. Aurora is not compatible with pipelining. Issues for Aurora were piling up without the community proposing any PR for them and without access for us to test those modifications. (2.x version has a 5 years support).

위의 내용을 해석해보면 아래와 같은 의미가 되게 됩니다.

드라이버 3.0은 커넥터의 완전한 재작성입니다.
드라이버 3.0은 파이프라이닝에 의존하기 때문에 Aurora 에 대한 특별한 지원은 3.0에서 구현하지 않았습니다.
Aurora는 파이프라이닝과 호환되지 않습니다.

위의 문장에서도 그렇고, 3.0 버전의 릴리즈 노트에서 나온 내용 다음의 내용에서는 3.0에서 지원하지 않는 이유에 대해서 설명하는 것 같습니다.

Issues for Aurora were piling up without the community proposing any PR for them and without access for us to test those modifications. (2.x version has a 5 years support).

Specific support for aurora has been removed, since Issues were piling up without the community proposing any PR for them and without access for us to test those modifications.

내용을 보면 수정 사항을 테스트할 수 있는 액세스 권한도 없이 Aurora에 대한 문제가 쌓여가고 있다 라고 하고 있습니다.
그래서 MariaDB 측에서 드라이버 3.0 부터는 Aurora 의 지원을 하지 않는 것으로 생각 됩니다.

내용에서 처럼 드라이버 2.x 의 경우 5년 지원이라고 명시 되어 있어서 당분간은 계속 버전 업데이트와 Bug Fix 등이 이루어질 것 입니다.

MariaDB의 Engineering policies 문서를 확인 해보면 아래와 같은 Connector/J 에 대한 버전 별 지원기간 정보를 확인 할 수 있습니다.

그래서 5년 지원이라는 부분이 지금으로 부터가 아닌 2025년일 것으로 예측됩니다.(개인 의견임)

참고1) 2.x 버전은 2.x는 Drizzle-JDBC(BSD 라이선스)의 포크 드라이버 라는 정보가 기재되어 있으며, 3.0은 커넥터에 대해서 완전한 재작성을 하였다고 소개 하고 있습니다.(complete rewrite of the connector)

참고2) MariaDB Connector/J 3.0 의 GA 버전은 3.0.3 으로 2022년 1월 25일날 출시 되었습니다.


Failover and High availability with MariaDB Connector/J 라는 문서가 3.0 용 버전과 2.x 버전이 별도로 존재 하며 아래와 같이 문서 내용과 같이 3.0 에서 mode 에서 aurora 가 없는 것을 확인 할 수 있습니다.

[MariaDB Connector/J for 2.x driver]

 

[MariaDB Connector/J for 3.0 driver]

         

Driver 선택 과 변경 관련

그럼 AWS JDBC Driver 를 선택하는 것에 대해서도 고민을 해봐야 하는 부분이 안정성과 성능일 것 입니다.

테스트 해본 바로는 설명에 나온 것처럼 MariaDB Connector/J 보다는 빠르게 페일오버가 동작하는 것을 확인 하였습니다.

다만 MySQL Connector/J 8.0.28 버전의 업스트림(또는 포크) 이지만, 드라이버에서 추가된 고유의 기능이 다소 있기도 해서 드라이버에 대해서 어느정도 안정화(Bug fix)에 대한 부분도 기다려봐야 할 수도 있습니다.
또한 드라이버 자체의 성능(SELECT 나 DML) 적인 차이도 확인 해볼 필요가 있습니다.


포스팅의 코멘트에도 확인 해주신 Issue 191 도 그렇고 github 의 이슈에 등록되는 추가적인 문제점 부분에 대해서도 확인을 해봐야 하는 부분 입니다.
[업데이트] Issue 191 은 릴리즈 된 1.1.0 버전에서 fix가 되었습니다.


MariaDB Connector/J 드라이버 사용하는 환경에서 사용하기 어려운 AWS Secrets Manager 에 대해서 AWS JDBC Driver 에서는 얼마전에 릴리즈 된 1.1.0 버전 부터 지원하기 시작 하였습니다.

AWS Secrets Manager 를 통해서 Application 로그인 기능을 사용하셨던 환경에서는 AWS JDBC Driver 로의 선택이 조금 더 고민할 수 있는 요건이 생기게 되었습니다.

Aurora MySQL 을 사용하면서 아직 MySQL Connector/J 를 사용중이면서 당장 사용이 급하다면 MariaDB Connector/J 를 사용하는 것도 고려해보거나, 포스팅을 업데이트 하는 시점에서 약 3개월이 지났기 때문에 빠른 시일안으로 업데이트 버전이 릴리즈 될 것으로 예상되며 업데이트 된 버전을 검토해보는 것도 여러가지 방안중에 하나가 될 것 입니다.(22/06/29 에 업데이트 릴리즈됨)


기존의 MariaDB Connector/J 를 사용할 경우 아직 지원 기간이 남아 있기 때문에 계속 사용하면서 AWS JDBC 드라이버가 업데이트 되면서 안정화되는 부분을 계속 트래킹 해보시면서 향후 드라이버 전환에 대한 부분도 고민 해볼 수 있을 것 같습니다.

MySQL Connector/J 와 MariaDB Connector/J 를 변경했을때, 또는 MariaDB Connector/J 에서 AWS JDBC Driver 로 변경하였을 때 애플리케이션의 호환성 부분도 확인을 해봐야 할 것 입니다.

대표적으로 많이 알려진 케이스가 MySQL 과 MariaDB Connector/J 둘간의 특이사항중에서 Mybatis를 사용하며, datetime의 컬럼 값을 String으로 받는 케이스에서 2개의 드라이버 할당된 형식이 달라지는 케이스가 있습니다.

mysql-connector는 내부적으로 String.format을 사용하여 YYYY-MM-dd HH:mm:ss 형태를 만들어주는 것으로 보이며 mariadb-connector는 Timestamp.toString()을 사용하게 되면서 차이가 발생되는 것이라고 알려져 있습니다.

자세한 내용은 아래 블로그 원문을 참조하시면 도움이 되실 것입니다.


그래서 향후 드라이버의 사용 그리고 변경에 대해서 계속적인 고민이 필요할 것으로 생각되며, 확인 되는 추가 사항은 계속 업데이트 하도록 하겠습니다.
                 

Reference

Reference URL
github.com/awlabs

amazon.com/improve-application-aurora-mysql
amazon.com/mysql-jdbc-driver-preview
amazon.com/mariadb-jdbc-with-aurora
heowc.dev/aurora-cluster-failover

mariadb.com/about-mariadb-connector-j
mariadb.com/connector-j-303-release-notes
mariadb.com/aurora-endpoints-and-discovery
mariadb.com/failover-for-2x-driver


연관된 다른 글

 

 

 

              

11
0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x