DMS를 사용한 RDS to OpenSearch CDC 복제 진행하기 (1) - RDS 인스턴스 생성과 EC2 연동
작성 일자 : 2024년 03월 20일
본 포스팅이 다루는 내용
- MySQL 기반의 RDS 인스턴스 생성하기
- RDS 인스턴스에 접근하기 위한 EC2 인스턴스 생성하기
- RDS의 VPC 보안 그룹에서 EC2의 VPC 보안 그룹으로부터의 인바운드 트래픽 허용하기
- EC2 인스턴스에서 RDS 인스턴스로 접근하기
- OpenSearch로 복제할 데이터베이스 생성하기
RDS 인스턴스 생성하기
이진 로깅 활성화를 위한 Parameter Group 생성하기
MySQL 데이터베이스에서 CDC를 사용하려면 이진 로깅을 활성화해야합니다. 아래의 과정을 통해 이진 로깅을 활성화할 수 있는 Parameter Group을 생성해보겠습니다.
이진 로깅이란?
이진 로깅을 활성화함으로써 생긴 binary log
파일은 테이블 생성 작업이나 데이터 변경과 같은 데이터베이스 변경 사항을 기록하는 "이벤트"를 포함하고 있습니다. binary log
파일은 다음과 같이 두 가지 목적으로 사용됩니다.
- 복제 : 복제의 경우, Source 데이터베이스의
binary log
에 기록된 변경 사항을 Target 데이터베이스로 보내고, Target 데이터베이스는 해당 트렌잭션을 복제하여 Source에서 수행한 것과 동일한 데이터 변경을 수행합니다. - 복구 : 복구의 경우, 다음과 같은 상황을 가정해볼 수 있습니다. 만약 X 시점에서 데이터베이스의 백업을 수행하고, 이후 Y 시점에서 데이터베이스가 손상되었다면, X 시점의 백업과 Y 시점의 사이의
binary log
를 사용하여 데이터베이스를 복구할 수 있습니다.
Reference : MySQL - 7.4.4 The Binary Log
Parameter Group 생성하기
1. AWS의 RDS 서비스 좌측 사이드 바에서 Parameter Groups를 클릭합니다.
2. Create parameter group 버튼을 클릭합니다.
3. 아래와 같이 Parameter Group을 생성합니다.
- Parameter group Family :
mysql8.0
- Type :
DB Parameter Group
- Group Name :
mysql8-binary-log
- Description :
MySQL DB parameter group for enabling binary logging
4. 생성된 Parameter Group에서 Edit 버튼을 클릭합니다.
5. 아래와 같이 Parameter를 수정합니다.
- binlog_format :
ROW
- expire_logs_days :
1 이상
(저는 Default 값인 2592000 그대로 두었습니다.) - binlog_checksum :
NONE
- binlog_row_image :
FULL
Reference : AWS - Using a self-managed MySQL-compatible database as a source for AWS DMS
RDS 인스턴스 생성하기
1. AWS의 RDS 서비스에서 Databases를 클릭합니다.
2. Create database 버튼을 클릭합니다.
3. 아래와 같이 RDS 인스턴스를 설정합니다.
- Choose a database creation method :
Standard Create
- Engine options
- Engine type :
MySQL
- Edition :
MySQL Community
- Engine version :
MySQL 8.0.35
- Engine type :
- Templates :
Free tier
- Settings
- DB instance identifier :
YourProjectName-rds
- Master username :
YourUsername
- Credentials management :
Self managed
- Auto generate password 또는 Master password 입력(중요! Auto generate password를 선택한 경우, Create Database 버튼을 클릭한 후에 상단에 표시되는 View credential details를 클릭하여 비밀번호를 확인하세요.)
- DB instance identifier :
- Instance configuration
- DB instance class :
db.t3.micro
- DB instance class :
- Storage
- Storage type :
General Purpose SSD (gp2)
- Allocated storage :
20GB
- Enable storage autoscaling :
빈 칸
- Storage type :
- Connectivity
- Compute resource :
Don't connect to an EC2 compute resource
- Network type :
IPv4
- Virtual Private Cloud (VPC) :
Default VPC
- DB subnet group :
defaut-vpc-xxxxxx
- Public access :
No
- VPC security group :
Create new
- New VPC security group name :
YourProjectName-rds-security
- Availability zone :
No preference
- Create and RDS Proxy :
빈 칸
- Certificate authority :
Default
- Database port :
3306
- Compute resource :
- Database authentication
- Database authentication options :
Password authentication
- Database authentication options :
- Monitoring
- Enable enhanced monitoring :
빈 칸
- Enable enhanced monitoring :
- Additional configuration
- Initial database name :
빈 칸
(데이터베이스는 이후에 생성합니다.) - DB parameter group (중요!) :
mysql8-binary-log
(이전에 생성한 Parameter Group을 선택합니다.) - Option group :
default:mysql-8-0
- Enable automatic backups (중요!) :
체크
(CDC를 위해 이진 로깅을 활성화하려면 백업을 활성화해야합니다. 참고 1, 참고 2) - Backup retention period :
1 day
(일수는 1일 이상으로 설정해야 하며, 저는 1일로 설정했습니다.) - Backup window :
No preference
- Copy tags to snapshots :
체크
- Enable replication in another AWS Region :
빈 칸
- Enable encryption :
체크
- AWS KMS key :
aws/rds
- Log exports :
빈 칸
- Enable automatic minor version upgrade :
체크
- Maintenance window :
No preference
- Enable Delete Protection :
빈 칸
- Initial database name :
4. Create database 버튼을 눌러 RDS 인스턴스를 생성합니다.
5. Auto generate password 방식으로 Master password를 생성한 경우, 상단에 표시되는 View credential details를 클릭하여 비밀번호를 확인합니다.
EC2 인스턴스 생성하기
RDS 인스턴스의 Public access를 No로 설정했기 때문에, RDS 인스턴스에 접속하기 위해서는 EC2 인스턴스를 생성하여 RDS 인스턴스에 접속해야 합니다. 아래의 과정을 따라 EC2 인스턴스를 생성합니다.
1. AWS의 EC2 서비스에서 Instances를 클릭합니다.
2. Launch instances 버튼을 클릭합니다.
3. 아래와 같이 EC2 인스턴스를 설정합니다.
- Name and tags
- Name :
YourProjectName-ec2
- Name :
- Application and OS Images
- Amazon Machine Image (AMI) :
Amazon Linux 2023 AMI
- Amazon Machine Image (AMI) :
- Instance type
- Instance type :
t2.micro
- Instance type :
- Key pair
- Key pair name :
Create a new key pair
- Key pair name :
4. 아래의 사진과 같이 Create key pair를 클릭하여 새로운 키페어를 생성하여 저장합니다.
- Network settings - 우측 상단의 Edit 버튼을 눌러서 수정
- VPC :
Default VPC
- Subnet :
No preference
- Auto-assign Public IP (중요!) :
Enable
- Firewall (security groups) :
Create security group
- Security group name :
YourProjectName-ec2-security
- Description :
YourProjectName-ec2-security created...
- Inbound Security Group Rules
- Type :
ssh
- Protocol :
TCP
- Port Range :
22
- Source Type :
My IP
(현재 사용중인 IP로 설정합니다.)
- Type :
- VPC :
- Configure storage :
1 x 30 GiB gp3 Root volume
- Advanced details : 기본 값
5. Launch instance 버튼을 클릭하여 EC2 인스턴스를 생성합니다.
RDS의 VPC 보안 그룹 설정하기
EC2 인스턴스에서 RDS 인스턴스에 접근하기 위해서는 RDS의 VPC 보안 그룹의 인바운드 규칙에서 EC2의 VPC 보안 그룹의 트래픽을 허용해야 합니다. 아래의 과정을 따라 RDS의 VPC 보안 그룹을 설정합니다.
1. AWS의 EC2 Dashboard에서 Security groups를 클릭합니다.
2. Security group name이 YourProjectName-ec2-security
인 Security group ID를 복사합니다. (EC2 인스턴스의 VPC 보안 그룹)
3. Security group name이 YourProjectName-rds-security
인 보안 그룹을 클릭합니다. (RDS 인스턴스의 VPC 보안 그룹)
4. Inbound rules 탭에서 Edit inbound rules 버튼을 클릭합니다.
5. Add rule 버튼을 클릭하여 아래와 같이 인바운드 규칙을 추가하고, Save rules 버튼을 클릭합니다.
- Type :
MySQL/Aurora
- Protocol :
TCP
- Port range :
3306
- Source :
Custom
(위에서 복사해놓았던 EC2 인스턴스의 Security group ID를 입력합니다.) - Description :
YourProjectName-ec2-security
EC2 인스턴스에서 RDS 인스턴스에 접속하기
SSH를 통해 EC2 인스턴스에 먼저 접속하고, mysql-client를 통해 RDS 인스턴스에 접근해보겠습니다.
1. AWS의 EC2 Dashboard에서 Instances를 클릭합니다.
2. 위에서 생성한 YourProjectName-ec2
인스턴스의 Insrance ID를 클릭하여 인스턴스의 상세 정보를 확인합니다.
3. 우측 상단의 Connect 버튼을 클릭합니다.
4. 우선, 이전의 EC2 인스턴스 생성 과정에서 다운받은 키 페어에 소유자 읽기 권한을 추가하겠습니다. SSH client 탭에서 chmod 400 YourProjectName-keypair.pem
명령어를 복사해서 터미널에 입력합니다. (터미널 위치는 키 페어가 저장된 위치로 이동한 후에 명령어를 입력해야 합니다.)
5. SSH client 탭에서 Example 부분의 ssh 접속 명령어를 복사하여 터미널에 입력합니다. Are you sure you want to continue connecting (yes/no/[fingerprint])?
라는 메시지가 나오면 yes
를 입력합니다.
6. 다음으로는 접속한 EC2 인스턴스에서 MySQL 클라이언트를 설치해보겠습니다. 아래의 명령어를 순차적으로 입력합니다.
# RPM 파일 다운로드
sudo wget https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
# RPM 파일 설치
sudo dnf install mysql80-community-release-el9-1.noarch.rpm -y
# Public Key 등록
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
# MySQL 클라이언트 설치
sudo dnf install mysql-community-client -y
7. MySQL 클라이언트를 통해 RDS 인스턴스에 접속해보겠습니다. 아래의 명령어를 입력하고, 비밀번호를 입력합니다. (RDS의 엔드포인트는 RDS 인스턴스의 상세 정보에서 확인할 수 있으며, Master username과 비밀번호는 RDS 인스턴스 생성 시 입력한 값입니다.)
mysql -h {RDS의 엔드포인트} -P 3306 -u {RDS의 Master username} -p
# 예시
# mysql -h gerrymandering-rds.abcdefg123.ap-northeast-2.rds.amazonaws.com -P 3306 -u gerrymandering -p
(중요!) MySQL 데이터베이스 이진 로그 보존 시간 늘리기
저희는 위에서 mysql8-binary-log
parameter group을 생성하고 RDS 인스턴스에 해당 parameter group을 적용함으로써 이진 로깅을 활성화하였습니다. 그러나, AWS에서 관리하는 MySQL 데이터베이스는 기본적으로 이진 로그를 가급적 빨리 삭제하도록 설정되어 있습니다. 때문에 CDC를 사용하기 위해서는 이진 로그의 보존 시간을 늘려주어야 합니다.
아래의 명령어를 MySQL 클라이언트에서 입력하여 이진 로그의 보존 시간을 늘립니다.
SET SQL_SAFE_UPDATES = 0;
call mysql.rds_set_configuration('binlog retention hours', 24);
SET SQL_SAFE_UPDATES = 1;
OpenSearch로 복제할 데이터베이스 생성하기
마지막으로 OpenSearch로 CDC 복제를 진행할 데이터베이스와 테이블을 생성하고, Dummy 데이터를 삽입해보겠습니다. MySQL 클라이언트에서 아래의 명령어를 순차적으로 입력합니다.
test
데이터베이스 생성
CREATE DATABASE test;
test
데이터베이스 선택
USE test;
songs
테이블 생성
CREATE TABLE songs (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
artist VARCHAR(255) NOT NULL,
genre VARCHAR(100),
duration INT,
description TEXT
);
songs
테이블에 Dummy 데이터 삽입
INSERT INTO songs (title, artist, genre, duration, description) VALUES ('Song of the Wind', 'The Breezers', 'Ambient', 215, 'A soothing ambient track that mimics the sound of the wind.');
INSERT INTO songs (title, artist, genre, duration, description) VALUES ('Dance of the Fireflies', 'Night Glow', 'Electronic', 180, 'An upbeat electronic song inspired by the light of fireflies.');
INSERT INTO songs (title, artist, genre, duration, description) VALUES ('Echoes of the Forest', 'Green Harmony', 'Nature', 240, 'A nature-inspired song featuring sounds of the forest and wildlife.');
INSERT INTO songs (title, artist, genre, duration, description) VALUES ('Riverside Journey', 'Flowing Waters', 'Ambient', 300, 'An ambient composition that captures the essence of a journey along a river.');
INSERT INTO songs (title, artist, genre, duration, description) VALUES ('The Urban Symphony', 'Cityscape', 'Jazz', 195, 'A jazz piece that reflects the bustling life and vibrancy of the city.');
INSERT INTO songs (title, artist, genre, duration, description) VALUES ('Midnight Blues', 'Luna Guitarist', 'Blues', 245, 'A deep and soulful blues track perfect for late-night listening.');
INSERT INTO songs (title, artist, genre, duration, description) VALUES ('Sunrise Serenade', 'Morning Birds', 'Classical', 210, 'A classical piece inspired by the calmness and beauty of a sunrise.');
INSERT INTO songs (title, artist, genre, duration, description) VALUES ('Cosmic Dance', 'Star Voyagers', 'Electronic', 180, 'An electronic track that takes you on a journey through the cosmos.');
INSERT INTO songs (title, artist, genre, duration, description) VALUES ('Desert Mirage', 'Sandy Echoes', 'World', 300, 'A world music track that captures the vastness and mystery of the desert.');
INSERT INTO songs (title, artist, genre, duration, description) VALUES ('Through the Storm', 'Thunder Duo', 'Rock', 275, 'A powerful rock song that embodies the spirit of overcoming challenges.');
songs
테이블의 데이터 확인
SELECT * FROM songs;
다음 글: DMS를 사용한 RDS to OpenSearch CDC 복제 진행하기 (2) - OpenSearch 도메인 생성 및 DMS를 통한 CDC 복제