AWS RDS에는 Aurora라는 서비스가 있다. 엔진을 MySQL 혹은 PostgresSQL로으로 지정해서 사용할 수 있고, 해당 RDB와 호환된다고 나와있다. 그리고 웹페이지에서 RDB 클러스트를 구성할 수 있는 편리한 부가 기능을 제공한다.

DB를 현업에서 사용하기 위해서는 시스템 구축시 구성부터 서버 튜닝 포인터나 관리적인 이슈가 발생한다. 그래서 보통 전담 엔지니어나 DBA를 두는 경우가 많이 존재한다. 하지만 Aurora는 많은 부분을 자동 및 몇번에 클릭만으로 처리를 해주고 있다. 말 그대로 AWS가 강조하는 현존 RDB를 활용한 Managed Service 인 것이다. 이에 Aurora를 사용하면서 엔지니어나 DBA의 필요성을 많이 못느낄 정도로 편리하다.

예를 들어 여러대의 서버를 데이터 복제 구성 운영하려고 하면 시스템의 이해도도 있어야 하고 해당 RDB가 사용하고 있는 데이터 복제 기술에 대한 이해도가 있어야야 한다. 하지만 Aurora는 그것이 필요 없다. 데이터 복제 기능을 몇번의 클릭만으로 생성 및 관리할 수 있다.

이글에서는 이런 편리한 Aurora를 사용하면서 겪었던 개인적이고 이해할 수 없는 작은 두 가지 이슈에 대해서 적으려고 한다. 작성자가 Aurora에 대한 이해도가 낮아서 발생했었수도 있는 문제이다. 하지만 알고 나면 아무것도 아니지만 모르면 많은 시간을 버릴 수 있는 이슈로 참고 바란다.

Java Connect String

작성자는 자바를 개발 주력 언어로 사용한다. 자바 JDBC로 개발을 진행할대 Contect String이라는 기능 사용하여 DB 연결 설정을 할 경우가 많다. 접속 시 필요한 정보를 URI형태로 만들어서 URI만으로 DB에서 접속하는 방법이다. 본인은 설정 파일을 단순하게 만들 수 있고 개발코드도 간단하게 만들 수 있어서 자주 사용하는 편이다.
MySQL에서는 이런 Connect String을 폭넓게 지원한다. 인증정보는 기본이고, 문자셋이나 시간대 설정 등 다양하게 지원한다.

1
jdbc:mysql://127.0.0.1:3306/db_name?characterEncoding=UTF-8&serverTimezone=Asia/Seoul&useLegacyDatetimeCode=false&allowMultiQueries=true

이런 Connect String을 설정함으로써 DB서버 전역으로 설정을 변경하지 않고 현재 접속하고 있는 MySQL 세션의 설정만 변경하여 기능을 구현하는 경우가 많았다.

이번 경우에도 하나의 인스턴트에 여러 개의 DB가 존재하여 TimeZone을 전역으로 바꾸기가 힘들어서 해당 연결 디비만 변경해서 사용하려고 했다. 하지만 정상적으로 동작하지 않았다.
당시 MyBatis로 구현된 프로젝트를 실서버로 이관 도중에 문제가 발행하여 해결책을 찾지 못해서 MyBatis 실행 쿼리마다 아래와 같이 바보 같은 짓을 하게 되었다.

1
2
3
4
SET time_zone='Asia/Seoul';
SELECT
...
...

서비스 런칭이 우선이고 트래픽이 많지 않아서 우선 진행하고 해결책을 찾으려고 했다.
별짓을 다하다가 결국은 DB 전체 TimeZone을 바꾸고 말았다. 다행히 UTC를 사용해야 하는 DB가 없어서 문제가 없었다.
지금 생각하면 TimeZone 설정이 문제가 아니고 Connect String 자체가 인식이 안 되는 문제인 것 같다.

Server Char Charset

두 번째로 격은 황당한 문제는 AWS Glue를 사용하면서 생긴 문제이다.
내부에 수집한 데이터를 ETL작업을 진행해서 최종적으로 RDS에 적재해야 하는 작업이 있어서 별로 어럽지 않게 진행하였다.
ETL작업은 트리거와 Spark 작업으로 진행하였고 RDS는 Glue 기능 중에 데이터베이스 연결로 미리 RDS 연결 설정을 하여 작업하였다.
데이터 적재 자체에는 문제가 없었다. 하지만 한글로 된 데이터를 적재 시 문자셋이 깨져서 적재되는 문제가 발생하였다.
당시 RDS DB의 문자셋을 UTF8로 되어 있었고, 적재 데이터로 UTF8 문자셋인지라 왜 데이터가 깨지는지 알 수가 없었다. Glue 데이터베이스 연결 설정 시에 JDBC로 타입을 정하고 Connect String을 지정해도 동일한 문제가 발생했다.
결국은 RDS DB 클러스터 파라미터 그룹 서버 charset를 UTF8로 변경하니 정상적으로 적재가 되었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> status

--------------
bin/mysql Ver 14.14 Distrib 5.7.28, for el7 (x86_64) using EditLine wrapper

Connection id: xxxxxxx
Current database: mysql
...
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.7.12 MySQL Community Server (GPL)
...
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
...
--------------

분명히 클라이언트로 데이터베이스 문자셋을 조회하면 UTF8로 나오지만 실제 적재 시에는 서버 문자셋으로 적재되고 있었나 봅니다.

마치며

Aurora RDS는 MySQL/PostgreSQL 호환을 표방하고 있다. 호환은 호환일 뿐이다. 문제가 발생 시 기존 RDB의 해결책으로 접근하면 안 되는 경우도 있다는 것을 알게 되었다. 꼭 한 번은 RDS 서버스 자체 버그 일 수도 있다는 의심을 해보자.