지난 포스팅에서는 온프레미스 환경에서 호스팅 하는 서버에 대해서 AWS로 마이그레이션 에 대한 내용을 다뤘다.
이번에는 온프레미스 환경에서 호스팅 하는 데이터베이스를 AWS RDS로 마이그레이션 해보려고 한다.
AWS DMS(Database Migration Service)
서비스를 이용하여 온프레미스 환경의 데이터베이스를 AWS RDS로 아주 쉽게 마이그레이션 할 수 있다.
심지어 SCT(Schema Conversion Tool)을 사용해 이기종 데이터베이스 간 마이그레이션도 가능하다. 이를 테면, PostgreSQL에서 MySQL로 마이그레이션이 가능하다.
데이터만 알아서 복제해주기 때문에, 데이터베이스의 버전은 크게 상관이 없고, 기존 온프레미스 환경에서 낮은 버전의 데이터베이스를 사용하고 있었다면, 버전도 업그레이드 하여 마이그레이션이 가능하다.
구조를 살펴보면 어려운 건 없고, Source endpoint(온프레미스)와 Target endpoint(AWS RDS)를 지정하고 Replication Task(복제 작업)만 생성해주면 된다.
특징
온프레미스 환경에서 인터넷으로 트래픽 되는 네트워크 구성이 필요
보통은 인터넷으로 트래픽되지 않는 프라이빗 환경에서 데이터베이스를 운영하는 경우가 많아서 온프레미스와 AWS VPC 간의 네트워크를 연결할 수 있는
AWS Direct Connect
혹은AWS Site to Site VPN
등을 구성해야 할 수 있다.실시간 복제 지원
데이터를 실시간으로 복제할 수 있어서, 무중단 마이그레이션이 가능하다.
이번 포스팅은 편의를 위해 모든 데이터베이스를 인터넷 액세스가 가능한 퍼블릭한 네트워크 환경을 구성하여 진행했다.
Source 데이터베이스 확인 및 설정
온프레미스 환경에 있는 Source 데이터베이스에 접속하여 버전, 스키마, 테이블, 데이터를 확인해본다.
> mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 14294
Server version: 5.5.68-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> MariaDB [(none)]> show databases;
+---------------------+
| Database |
+---------------------+
| information_schema |
| README_TO_RECOVER_A |
| dms_test |
| mysql |
| performance_schema |
+---------------------+
5 rows in set (0.00 sec)
MariaDB [(none)]> select version();
+----------------+
| version() |
+----------------+
| 5.5.68-MariaDB |
+----------------+
1 row in set (0.00 sec)
MariaDB [(none)]> use dms_test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [dms_test]> select * from customer;
+------+-----------+------+
| id | name | age |
+------+-----------+------+
| 1 | southouse | 25 |
| 2 | rita | 21 |
| 3 | sony | 32 |
+------+-----------+------+
3 rows in set (0.00 sec)
Source 데이터베이스에 있는 스키마는 dms_test
이고 해당 스키마엔 customer
라고 하는 테이블이 존재한다. 데이터는 총 3개임을 확인했다.
추가로 DMS에서 마이그레이션 하기 위해서는 아래의 설정을 참고하여 데이터베이스 파라미터 설정을 해주어야 한다.
> vim /etc/my.cnf.d/server.cnf
server-id = 1
log-bin=mysql-bin
binlog_format=ROW
expire_logs_days=7
binlog_checksum=NONE
binlog_row_image=full
log_slave_updates=FALSE
> sudo service mariadb stop
Redirecting to /bin/systemctl stop mariadb.service
> sudo service mariadb start
Redirecting to /bin/systemctl start mariadb.service
다른 엔진의 데이터베이스의 경우에도 각 엔진 별로 필요한 파라미터 설정이 있을 수 있는데 해당 링크에서 확인할 수 있다.
Target database 생성
마이그레이션 될 데이터베이스를 AWS RDS에서 생성한다.
대부분 기본 설정으로 구성한다.
AWS RDS > Databases > Create Database 메뉴로 이동한다.
이기종 데이터베이스 마이그레이션은 아니기 때문에 온프레미스 데이터베이스와 동일한 엔진인 MariaDB
를 선택한다.
RDS의 식별자, Master 계정 아이디, 비밀번호, 인스턴스 클래스를 선택한다.
스토리지를 설정한다.
VPC와 서브넷을 설정한다.
위에서 언급했지만 강조하자면, 보통 데이터베이스는 인터넷이 연결되지 않는 프라이빗한 네트워크 환경에 구성해야 하지만, 이번 경우에는 편의성을 위해 퍼블릭 액세스를 허용하도록 했다.
보안 그룹 및 가용 영역, 포트를 설정한다.
비용 확인 후에 Create databases 버튼을 눌러 RDS 인스턴스를 생성한다.
DMS 설정
서브넷 그룹 생성
AWS DMS도 AWS RDS와 동일하게 서브넷 그룹을 따로 생성한다.
AWS DMS > Subnet groups > Cretae subnet group 메뉴로 이동한다.
Source Database
에서 데이터를 가져오고, Target Database
에 데이터를 전달해야 하기 때문에, 해당 서브넷 그룹도 가급적 인터넷 통신이 가능한 퍼블릭 존에 위치 하도록 설정을 한다.
이름, 설명, VPC, 서브넷을 지정하고 Create subnet group 버튼을 클릭하여 서브넷 그룹을 생성한다.
서브넷 그룹이 생성이 완료되면 Complete
상태로 존재한다.
Replication Instance 생성
Replication Task를 진행할 인스턴스를 생성한다. AWS RDS와 크게 다른게 없으니 참고하면 된다.
AWS DMS > Replication Instances > Create replication instance 메뉴를 클릭한다.
이름, 인스턴스 클래스, 엔진 버전, 가용성, 스토리지를 설정한다.
고가용성을 유지해야 하는 상황이라면, Single-AZ
말고 Multi-AZ
옵션이 있으니 해당 옵션으로 설정하면 된다.
VPC와 보안 그룹 등 네트워크 관련된 부분을 설정한다. Replication Instance
도 마찬가지로 퍼블릭 액세스가 가능하게 설정한다.
유지 관리에 대해서 설정하고, Create Replication instance 버튼을 클릭하여 인스턴스를 생성한다.
Replication Instance
가 생성된 모습이다.
Source Endpoint 지정
온프레미스에 있는 데이터베이스를 엔드포인트로 지정해주면 된다.
AWS DMS > Endpoints > Create endpoint 메뉴로 들어간다.
엔드포인트 식별자, 데이터베이스 엔진, 엔드포인트 URL, DB 계정 정보를 넣어준다.
Create endpoint 버튼을 클릭하여 엔드포인트를 생성한다.
Source Endpoint
가 생성된 것을 확인한다.
Source Endpoint
에서 Replication Instance
와의 Connection 테스트를 하기 위해 AWS DMS > Endpoints > 생성한 Source Endpoint > Connections > Test connections 메뉴로 들어간다.
Replication Instance
를 선택하고, Run test 버튼을 클릭하여 테스트를 진행하여 성공 여부를 확인한다.
Target Endpoint 지정
최종적으로 마이그레이션 될 AWS RDS 인스턴스를 엔드포인트로 지정해주면 된다.
AWS DMS > Endpoints > Create endpoint 메뉴로 들어가서, Source Endpoint를 생성했던 것과 같이 엔드포인트에 대한 정보를 넣어주고 생성한다.
이제 엔드포인트에 대한 설정은 끝났다.
Migration Task 생성
마지막으로, Source 데이터베이스에서 Target 데이터베이스로 마이그레이션 하기 위한 작업을 생성한다.
AWS DMS > Database migration tasks > Create database migration task 메뉴로 들어간다.
작업에 대한 식별자와 위에서 생성한 Replication Instance
, Source Database Endpoint
, Target Database Endpoint
를 설정하고, Migration Type도 지정한다.
Migration Type에 대한 내용은 다음과 같다.
- Migrate existing data: 기존에 있는 데이터만 일회성 마이그레이션
- Migrate existing data and replicate ongoing changes: 데이터 마이그레이션 이후에 지속적으로 데이터 복제
- Replicate data changes only: 변경 사항만 복제
이번에는 데이터 마이그레이션 후에 지속적으로 데이터 복제까지 확인해보기 위해서 Migrate existing data and replicate ongoing changes
옵션을 선택했다.
이제 작업에 대한 설정을 진행한다.
생소한 옵션들이 많기 때문에 하나씩 확인해보려고 한다.
Target table preparation mode는 Target Database에서 테이블을 어떻게 관리할건지 설정한다.
- Do nothing: 테이블에 아무런 영향을 주지 않고, Target Database에 테이블이 없으면 생성해준다.
- Drop tables on target: 마이그레이션 작업을 하면서 Source Database 테이블을 Drop하고 Target Database에 테이블이 생성된다.
- Truncate: Source Database에 테이블만 남겨두고 데이터만 이동한다.
마이그레이션 측면에서 Source Database
와 Target Database
모두에 데이터를 유지하는 옵션인 Do nothing
옵션을 선택했다.
Stop task after full load completes 옵션은 지속적으로 데이터를 복제하는 경우에만 생기는 옵션이고, 전체 데이터의 마이그레이션 이후에 작업을 중단에 대한 설정을 제어하는 것 같다.
관련 내용을 좀 찾아봤지만, 정확하게 이해가 되지 않아 기본 설정인
Don't stop
을 설정했다. (아시는 분들은 댓글에 적어주시면 감사하겠습니다!)
LOB column settings는 LOB(Large Object)라고 하는 대형 객체에 대해서 어떻게 제어할건지 설정하는 것이다.
- Don't include LOB columns: 대형 객체가 포함된 컬럼을 무시한다.
- Limited LOB mode: 대형 객체를 지정한 크기로 잘라서 마이그레이션 한다.
- Full LOB mode: 전체 대형 객체를 한번에 마이그레이션 한다.
대형 객체를 한번에 마이그레이션 하는 것보다 지정한 크기로 잘라서 마이그레이션 하는게 속도가 더 빠르기 때문에 Limited LOB mode
로 설정하고, LOB 크기는 기본 설정으로 했다.
Validation는 데이터에 대한 유효성 검증에 대한 옵션이다. 마이그레이션 하면서 데이터 유효성 검증은 중요하다. Turn on
옵션을 선택했다.
마지막으로, Task logs는 마이그레이션 작업에 대한 로깅 설정인데, 이 부분은 건너 뛰었다. AWS CloudWatch
로 로깅할 수 있는 옵션이다.
Advanced task settings에 대해서는 기본 옵션으로 선택했다.
마이그레이션이 될 대상 테이블에 대해서 매핑하는 설정이다.
Source name에는 데이터베이스 이름(스키마 이름)을 Source table name에는 테이블 이름을 지정해주면 된다.
'%' 기호는 와일드 카드로 사용된다. (ex.
dms%
로 지정하면 dms로 시작하는 모든 이름을 찾아준다.)
온프레미스 데이터베이스의 데이터에서 dms_test
스키마의 모든 테이블을 마이그레이션 하기 때문에 아래와 같이 설정했다.
Premigration assessment는 마이그레이션 작업 전에 여러 마이그레이션 문제를 탐색하기 위한 평가를 진행한다. 그리고 평가 결과에 대해 S3 버킷에 리포트 할 수 있다. 이번 설정에서는 생략한다.
Migration task startup configuration 옵션은 작업 생성 시에 자동으로 작업을 시작할지 말지에 대한 옵션이다. 작업 생성 후 자동으로 시작하게 끔 Automatically on create
옵션을 선택한다.
이제 Create task 메뉴를 클릭하여 생성한다.
작업을 생성하면 Ready
상태에서 Running
상태로 바뀌게 되고 마이그레이션이 성공적으로 진행되는 것을 확인할 수 있다.
Target Database 데이터 및 실시간 데이터 복제 확인
이제 마지막으로 데이터가 마이그레이션이 잘 됐는지, 설정한 대로 Source Database
에서 데이터가 변경되거나, 추가되면 실시간으로 복제가 되어 반영이 되는지 확인 해보려고 한다.
위에서 생성했던 Target Database
의 엔드포인트를 확인하고, 접속한다.
> mysql -h dms-target-database.cmwuqeiemohi.ap-northeast-1.rds.amazonaws.com -u southouse -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2699
Server version: 10.6.10-MariaDB-log managed by https://aws.amazon.com/rds/
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+---------------------+
| Database |
+---------------------+
| README_TO_RECOVER_A |
| awsdms_control |
| dms_test |
| information_schema |
| innodb |
| mysql |
| performance_schema |
| sys |
+---------------------+
8 rows in set (0.00 sec)
MariaDB [(none)]> use dms_test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [dms_test]> select * from customer;
+------+-----------+------+
| id | name | age |
+------+-----------+------+
| 1 | southouse | 25 |
| 2 | rita | 21 |
| 3 | sony | 32 |
+------+-----------+------+
3 rows in set (0.00 sec)
성공적으로 데이터 마이그레이션이 된 것을 확인했다. 이제, Source Database
에서 데이터를 추가, 변경하고 실시간으로 반영이 되는지 확인해본다.
> mysql -u root -p dms_test
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 14294
Server version: 5.5.68-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [dms_test]> select * from customer;
+------+-----------+------+
| id | name | age |
+------+-----------+------+
| 1 | southouse | 25 |
| 2 | rita | 21 |
| 3 | sony | 32 |
+------+-----------+------+
3 rows in set (0.00 sec)
MariaDB [dms_test]> insert into customer values (4, 'ari', 10);
Query OK, 1 row affected (0.00 sec)
MariaDB [dms_test]> insert into customer values (5, 'minjae', 29);
Query OK, 1 row affected (0.00 sec)
MariaDB [dms_test]> update customer set name = 'southouse2' where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MariaDB [dms_test]> select * from customer;
+------+------------+------+
| id | name | age |
+------+------------+------+
| 1 | southouse2 | 25 |
| 2 | rita | 21 |
| 3 | sony | 32 |
| 4 | ari | 10 |
| 5 | minjae | 29 |
+------+------------+------+
5 rows in set (0.00 sec)
데이터 추가, 변경은 완료했고 이제 Target Database
에서 확인해보도록 한다.
> mysql -h dms-target-database.cmwuqeiemohi.ap-northeast-1.rds.amazonaws.com -u southouse -p dms_test
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2699
Server version: 10.6.10-MariaDB-log managed by https://aws.amazon.com/rds/
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [dms_test]> select * from customer;
+------+------------+------+
| id | name | age |
+------+------------+------+
| 1 | southouse2 | 25 |
| 2 | rita | 21 |
| 3 | sony | 32 |
| 4 | ari | 10 |
| 5 | minjae | 29 |
+------+------------+------+
5 rows in set (0.00 sec)
이렇게 데이터도 실시간으로 복제되는 것을 확인했다.