Last Updated on 2월 23, 2023 by Jade(정현호)
안녕하세요
이번 포스팅에서는 Amazon AWS 에서 새롭게 출시한 Java의 MySQL 접속 드라이버인 AWS JDBC Driver 에 대해서 확인 해보려고 합니다.
Contents
드라이버의 특징
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 정보가 완전히 확인되는 데 시간이 필요하기 때문입니다.
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
연관된 다른 글





Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io
안녕하세요. 해당 라이브러리를 찾아보다가 혹시 아시는 부분이 있으실까 하여 질문 남깁니다.
해당 라이브러리로 변경 후에 사이즈가 큰 mideumtext를 가져올 때 아래와 같은 에러가 발생했는데요. 해당 라이브러리는 안정성이 부족한 점이 있을까요? (max_allowed_packet 는 그 이상으로 설정한 상태입니다)
Packet for query is too large (102,945 > 65,535). You can change this value on the server by setting the 'max_allowed_packet' variable.
안녕하세요
저도 해당 드라이버의 실사용에 대한 deep dive 나 문의 주신 부분 에러는 만나보지 못해서 쉽게 무엇이라고 말씀드리기가 어려울것 같긴 합니다.
혹시 AWS Aurora Driver 를 사용하기 전에 어떤 Driver 를 사용하였나요?
아 네 답변 감사드립니다!
Driver 는 com.mysql.cj.jdbc.Driver 를 사용하고, "mysql:mysql-connector-java:8.0.14" 라이브러리를 사용했었습니다.
AWS Aurora Driver 를 사용하는 라이브러리를 직접 들어가서 확인해보지는 않았는데 고정적으로 길이를 제한하고 있지는 않을까 생각했었습니다. 파라미터 그룹으로 max_allowed_packet 설정도 변경하며 진행했지만 65,535는 고정으로 나왔었어서요.
안녕하세요
1. max_allowed_packet 는 클러스터 파라미터가 아니라 인스턴스 파라미터로 DB인스턴스 파라미터를 수정하시면 증가 됩니다.
-- 변경전
show variables like 'max_allowed_packet';
+--------------------+------------+
| Variable_name | Value |
+--------------------+------------+
| max_allowed_packet | 67108864 |
+--------------------+------------+
-- 변경후
show variables like 'max_allowed_packet';
+--------------------+------------+
| Variable_name | Value |
+--------------------+------------+
| max_allowed_packet | 1073741824 |
+--------------------+------------+
2. 다만 github 의 이슈에 이미 동일(또는 거의 유사한) 내용이 수일전에 등록된 것을 확인 하였습니다.
다음 버전에서 fix 될지는 모르겠네요
https://github.com/awslabs/aws-mysql-jdbc/issues/191
이슈에서는 서버의 max_allowed_packet 를 변경 하였으나 동일한 이유가 발생되어 아래와 같이 connection string 레벨에서 아래와 같이 지정해서 문제를 회피하였다고 합니다.
jdbc\:mysql:aws\://${DB_URL}/${DB_NAME}?&failOverReadOnly\=false&maxAllowedPacket\=4194304
랑크를 드린 이슈를 살펴보셔야 할것 같네요
감사합니다.
그리고 추가로 댓글을 주실때는 수신가능한 이메일 주소를 기재해주시거나 또는 기재하시기 어렵다면 이메일 주소란을 비우시고 댓글 작성을 부탁드립니다.
상세한 답변 감사드립니다!!
1. 변경 후 인스턴스에서도 show variables like 'max_allowed_packet'; 로 변경된 부분 확인해보았었습니다!
2. github 까지 살펴보지 않았었는데 감사합니다!! 이후에는 github도 함께 확인해보겠습니다. 상세한 확인 정말 감사드립니다!
추가로 말씀주신대로 이메일은 수정하였습니다!
안녕하세요
중요한 부분에 대해서 확인해주셔서 감사합니다
저도 이 이슈가 fix되는지 자주 지켜보도록 할게요
좋은 하루 되세요
감사합니다
안녕하세요.
감사합니다! 좋은 하루 되세요!
안녕하세요
이전에 이슈로 확인한 내용에 대해서는 수정 될 예정이며, 수정 내용이 포함된 릴리즈가 곧 업데이트 될 것이라고 하였습니다.
https://github.com/awslabs/aws-mysql-jdbc/issues/191
The fix for this issue has been merged in. We will be closing this issue and we will be providing an updated release soon. Please reopen this issue if it persists.
감사합니다.
안녕하세요.
최근에 확인은 못했었는데 공유 감사드립니다!!
DB 설정 후 failover 를 위해 찾아보았던 라이브러리였었는데 아래와 같은 이슈를 동일하게 겪어서 이부분 참고차 공유드려봅니다!
https://github.com/awslabs/aws-mysql-jdbc/issues/214
감사합니다.
안녕하세요
바쁘신 와중에 또다른 피드백 주셔서 매우 감사합니다.
저도 도입을 검토중이고 조만간 상세하게 테스트를 진행할 예정이었는데요
먼저 좋은 정보 주셔서 매우 감사합니다.
말씀 주신 이슈는 얼만큼 빈번하게 있을까요? 자주 그럴까요?
감사합니다.
안녕하세요
2022년 6월29일에 릴리즈 된 1.1.0 버전이 릴리즈되었고 확인 해주신 Issue 191 이 fix 에 포함된 것으로 확인 됩니다.
https://github.com/awslabs/aws-mysql-jdbc/releases
1.1.0 버전에서는 fix 4개 포함 + AWS Secrets Manager 기능 지원이 포함되어 있습니다.
감사합니다.