...
RDS 실전 사용 세팅하기
이번 강의에서는 전반적인 RDS 생성 및 사용 방법과, 멀티 AZ와 Read Replica를 지원하는 RDS를 만들어보고, 만일 Primary를 강제로 내리면 Stanby가 fail over 되는 동작을 실전으로 구축할 예정이다.
만일 RDS에 대해 이론이 부족하다면 다음 포스팅을 참고하길 바란다.
RDS 생성하기 [Multi AZ]
1. 데이터베이스 선택
2. 템플릿 선택
만일 무료 버젼을 이용하고 싶으면 프리티어 항목을 선택하면 된다.
다만, 이번 강의에선 멀티 AZ를 구축할 예정이기에, 프로덕션을 선택해 준다.
3. 인스턴스 클래스 선택
인스턴스 클래스는 표준, 메모리 최적화, 버스트 성능의 3종류가 있다.
용도 | 인스턴스 클래스 | 내용 |
표준 | db.m5 등 | 범용적인 인스턴스 클래스이다. |
메모리 최적화 |
db.x1e | 메모리를 많이 사용하는 애플리케이션에 최적화된 인스턴스 클래스로, 일부 리전에서만 제공된다. 한국 리전에서는 이용할 수 있다. |
db.x1 | 메모리를 많이 사용하는 애플리케이션에 최적화된 인스턴스 클래스이다. 메모리 최대치가 db.x1e의 절반이다. | |
db.r5 등 | 네트워크와 EBS의 성능을 강화한다. AWS Nitro System을 사용한다. | |
버스트 성능 |
db.t3 등 | CPU의 최대 사용률까지 버스트 성능으로 사용할 수 있다. |
만일 위 RDS 템플릿에서 프리티어로 골랐다면 인스턴스 클래스는 db.t2.micro 로 고정되어 있을 것이다.
버스터블 t클래스의 적당한걸 골라 쓰자.
4. EBS 선택
RDS 인스턴스도 일종의 EC2 이기 때문에 EBS 스토리지가 필요하다. 그래야 데이터베이스의 데이터 내용들을 저장할수 있기 때문이다.
선택할 수 있는 스토리지 유형은 다음과 같다.
- 범용(SSD) 스토리지
- 프로비저닝된 IOPS(SSD) 스토리지
- 마그네틱
만일 범용(SSD) 스토리지를 선택할 경우, 스토리지 자동 조정 옵션을 설정할수 있는데,
스토리지 자동 조정 기능은 처리량이 급증하여 DB 여유공간이 부족할 때, 자동으로 스토리지를 확장하는 기능이다.
EC2의 Auto scaling 서비스의 RDS 버젼이라고 보면 된다.
최대 스토리지 임계값은 해당 DB 인스턴스가 자동으로 확장할 수 있는 제한 값이다.
이번 시간은 구축 연습이니 가장 값싼 마그네틱을 선택해준다.
참고로 프리티어의 스토리지 최대 할당량은 20GB이다.
5. 멀티 AZ 예비 인스턴스 생성
다중 AZ 배포를 설정하면, DB 인스턴스에 고가용성과 장애 조치 기능을 지원하게 설정할수 있다.
6. VPC 전반 설정
RDS 인스턴스도 일종의 EC2 인스턴스이다.
EC2를 만들때 VPC에 위치시켜준 것처럼 RDS도 세팅하는 것으로 이해하면 된다.
- VPC / 서브넷그룹 : VPC가 구성되어 있다면 선택해주고, Default를 사용해도 무방하다.
EC2 인스턴스와 연동할 경우 동일한 곳에 설치하는 것이 일반적이다. - 퍼블릭 액세스 가능 : 데이터베이스 인스턴스에 공인 IP 주소를 할당할지 여부를 나타낸다.
외부에서 MySQL 워크벤치에 적속할 예정이므로 활성화를 한다. - VPC 보안 그룹 : 퍼블릭 엑세시 가능을 설정하게 되면, 인/아웃바운드 규칙이 정의된 보안 그룹을 설정해야한다.
- 포트 : MySQL 기본 포트인 3306을 사용
7. 데이터베이스 암호화 형식 설정
전시간에서 배운 RDS 암호화 인증 방식 3가지중 고를 수 있다.
가장 무난한 아이디/패스워드 식 암호 인증을 선택해준다.
8. 추가 구성 설정하기
추가 구성은 그냥 넘어가도 되지만 하는것을 권장한다.
그 이유는 초기 데이터베이스 이름을 지정해야 하기 때문이다.
그외 백업 옵션 같은 나머지는 디폴트로 두고 넘어간다. 나중에 수정이 가능하다.
9. RDS 요금 미리보기
멀티 AZ 인프라 구성을 구축했기에, 예비 Stanby 인스턴스가 지속적으로 돌아가게되어 인스턴스 요금이 2배로 청구되는걸 볼 수 있다.
설정이 완료되었으면 데이터베이스 생성 버튼을 누른다.
데이터베이스가 만들어지는데 꽤 시간이 걸리니 느긋하게 기다려 주자.
10. 생성한 데이터베이스 암호 보기
우측 상단의 자격 증명 세부 정보 보기를 누르면, 마스터 암호가 나오게 된다.
마스터 사용자 이름과 마스터 암호를 이용해서 데이터베이스에 접속할수 있게 된다.
RDS 파라미터 그룹 설정
파라미터 그룹은 데이터베이스의 전반적인 환경 설정 (character-set 과 time-zone 설정 등)을 할 수 있는 기능이다.
RDS 인스턴스에 직접 접속해서 데이터베이스 환경 설정을 할수 없으니, 이 파라미터 그룹을 통해서 환경 설정을 세팅하고 그룹을 데이터베이스 인스턴스에 적용하는 식으로 데이터베이스 설정을 변경하는 것이다.
RDS 인스턴스를 처음 생성하면 다음 몇 가지 설정을 필수로 해야 한다.
- time_zone (시간 설정)
- Character Set (문자 인코딩 설정)
- Collation (해당 문자셋을 어떻게 정렬할지를 결정하는 알고리즘)
1. 파라미터 그룹 생성하기
RDS 인스턴스를 생성하면서 기본으로 생성된 디폴트 파라미터 그룹은 수정이 불가능하다.
그래서 파라미터 그룹을 새로 만들어 데이터베이스 인스턴스에 적용해야 한다.
[파라미터 그룹 생성] 버튼을 누른다.
2. 데이터베이스 타임존 설정
검색창에 time_zone을 검색하여 time_zone 파라미터를 Asia/Seoul로 변경해준다.
3. 데이터베이스 문자셋 설정
한글 데이터가 깨지지 않고 잘 출력시키게 하기 위해서 utf-8 인코더를 설정해줘야 한다.
char 검색 후 나오는 모든 부분의 값을 utf8mb4로 설정한다.
- character_set_client : utf8mb4
- character_set_connection : utf8mb4
- character_set_database : utf8mb4
- character_set_results : utf8mb4
- character_set_server : utf8mb4
utf8과 utf8mb4 모두 한글이 깨지지 않게 인코딩해주지만 차이가 있다.
utf8은 이모지를 저장할 수 없지만, utf8mb4는 이모지를 저장할 수 있다.
utf8은 가변 3바이트를 사용하는데 반해서, utf8mb4는 내부적으로 한 문자를 표현하는데 4바이트를 사용한다.
따라서 3바이트만 사용하는 utf8은 이모지를 저장할 수 없다.
4. collation 변경
이번에는 collation을 검색하여 collation부분을 모두 utf8mb4_general_ci로 바꿔준다.
- collation_connection : utf8_general_ci
- collation_server : utf8_general_ci
5. RDS 인스턴스에 파라미터 그룹 변경하기
[추가 구성] 화면에서 DB 파라미터 그룹을 방금 생성한 신규 파라미터 그룹으로 변경한다.
6. 설정 변경 즉시 적용하기
최하단의 [계속] 버튼을 누르면 다음과 같이 수정 사항이 요약된 것을 볼 수 있다.
여기서 반영 시점을 [즉시 적용]으로 한다.
만일 예약된 다음 유지 시간으로 하면 지금 하지 않고, 새벽 시간대에 진행하게 된다.
이 수정사항이 반영되는 동안 데이터베이스가 작동하지 않을 수 있으므로 예약 시간을 걸어두라는 의미지만, 지금은 서비스가 오픈되지 않았기 때문에 즉시 적용을 해준다.
외부에서 RDS 접속하기
워크벤치에서 RDS 접속하기
우선 방금 생성한 데이터베이스에 들어가서 연결 & 보안 탭에 엔드포인트 DNS 주소를 복사해둔다.
이 엔드포인트를 통해서, 워크벤치에서 AWS로 데이터베이스를 연결하여 마치 원격 조작을 행할 수 있다.
한글이 잘나오는지 테스트하기 위해, 해당 쿼리로 테이블을 만들고 한글 문자 데이터를 넣고 조회해보자
use testDB;
create table test (
id bigint(20) NOT NULL auto_increment,
content varchar(255) default NULL,
primary key(id)
) engine = innoDB;
insert into test(content) values('한글 테스트');
select * from test;
EC2에서 RDS 접근하기
EC2 CLI에 접속해서 mysql 접속 명령어를 입력하면 RDS에 접속할수 있게 된다.
MySQL CLI 명령어 사용법에 대해서는 다음 포스팅을 참고하길 바란다.
$ sudo -s
$ yum -y install mysql # mysql 설치
$ mysql -u {마스터 사용자 이름} -p -h {RDS 인스턴스 엔드포인트} # mysql cli 접속하기
RDS fail-over 테스트
멀티 AZ 환경에서 Primary 데이터베이스 인스턴스가 죽을 경우, fail over(장애복구)가 잘 되는지 테스트 해보자.
우선 같은 VPC내 EC2 인스턴스에 접속해보자.
그리고 다음 명령어를 쳐보자
생성한 RDS 인스턴스의 mydb.cauufra5lcmt.ap-northeast-2.rds.amazonaws.com 엔드포인트가 어떤 인스턴스를 가리키고 있는지 1초마다 인스턴스 DNS를 무한 반복으로 출력하는 명령어 이다.
이를 통해 DNS가 어떤 RDS 인스턴스를 가리키고 있는지 알수 있다.
# while true; do host <데이터베이스 엔드포인트> | grep alias; sleep 1; done
$ while true; do host mydb.cauufra5lcmt.ap-northeast-2.rds.amazonaws.com | grep alias; sleep 1; done
위 사진에서 보듯이, ec2-3-34-214-137 이라는 인스턴스 DNS를 가리키고 있다는 걸 알 수 있다.
그럼 데이터베이스 인스턴스를 재부팅 해보자.
직접 데이터베이스 서버를 죽일수 없으니, 마치 장애 때문에 Primary 인스턴스가 떨어져 나가는 시나리오를 재부팅을 통해 진행할수 있다.
재부팅을 하고 좀 기다려주면, 터미널에 다음과 같이 ec2 아이디가 ec2-3-36-142-48로 바뀜을 확인 할 수 있다.
이것이 fail over를 통해 RDS 인스턴스의 DNS를 Stanby 인스턴스에게 자동으로 연결됨을 보여주는 것이다.
RDS Read Replica 생성하기
복제 본 생성 소요 시간은 약 3 분 가량 소요된다. (복제본 생성과 동시에 원본 스냅샷을 가지고 동일한 스펙으로 생성)
완벽하게 완료되기까지는 10분 의 시간이 소요된다. (slave 에서 의 작업)
read replica 생성 과정
- 복제본 생성시 RDS의 원본 DB인스턴스의 스냅샷을 캡처하여 복제시작
- DB 스냅샷 캡처기간동안 원본 DB 인스턴스에서 짧은 I/O발생(1분 저도) → 그래서 서비스에 차질이 생길 수 있다.
- 위의 경우를 방지하고자 원본 DB인스턴스를 다중 AZ로 미리 설정한다→ 보조 인스턴스에서 스냅샷을 생성하기에 원본 데이터베이스는 무리없이 서비스
- 다수의 복제본이 하나의 원본을 가지고 병렬 작업시 → 첫번째 생성시에만 스냅샷캡처
RDS Read Replica 복제 테스트
master(primary) 인스턴스 데이터베이스에 접속해서 데이터를 집어넣으면, read replica 복제본에도 데이터가 바로 자동으로 적용되는지 확인하는 과정을 살펴보자.
- 워크벤치에서 master 인스턴스에 접속하기
- EC2 CLI에서 slave 인스턴스에 접속해서 쿼리 조회하기
- 워크벤치에서 데이터 insert하기
- slave 인스턴스에도 데이터가 조회되는지 확인하기
multi-AZ : 동기식 복제.
active의 db의 정보의 일어난 작업 이후 뒷 단 slave쪽 까지 동기화 작업이 이루어진 후 정합성 이 완료 되는 방식 → 고가용성, 데이터 일관성
read Replica : 비동기 식 복제.
master의 정보 만 가지고 read db 정보까지는 작업을 처리 하지 않는 상태 → 분산 하여 master의 정보를 읽어 들이는 역할. 데이터 일관성이 없음
0. slave 비밀번호 재설정
만일 비밀번호를 까먹었으면 재설정 할수 있다.
아이디는 admin 고정이다.
1. slave 인스턴스에 접속해서 데이터 조회 하기
# while true; do mysql -h {Slave RDS 엔드포인트} -u admin --password={비밀번호} {데이터베이스명} -e "select * from test;"; sleep 1; done
$ while true; do mysql -h mydb-replica-1.cauufra5lcmt.ap-northeast-2.rds.amazonaws.com -u admin --password=123123123123 testDB -e "select * from test;"; sleep 1; done
2. master 인스턴스에 접속해서 데이터 insert 하기
use testDB;
insert into test(content) values('데이터 1');
insert into test(content) values('데이터 2');
insert into test(content) values('데이터 3');
3. slave 인스턴스에 집어넣은 데이터 조회되는지 확인
RDS 로그 보기
데이터베이스의 에러 로그도 볼수도 있다.
설정에 따라서 다른 로그도 볼수있기도 하다.
RDS 옵션 그룹 설정
RDS 인스턴스 구성 메뉴를 보면 파라미터 그룹과 옵션 그룹이 존재한다.
파라미터 그룹은 위에서 배웠듯이 전반적인 데이터베이스 엔진 환경 설정을 세팅하는 그룹이라 하면, 옵션 그룹은 RDS 인스턴스의 환경 구성을 세팅하는 그룹이다.
RDS 스냅샷 설정
RDS 스냅샷 생성하기
RDS 스냅샷 복원하기
만약 특정 시간의 DB 상태로 되돌아가고 싶다면, 스냅샷 복원을 통해 돌아갈 수 있다.
단, 유의할점이 기존 RDS에서 되돌아가는게 아닌 새로운 RDS를 생성해서 스냅샷을 기반으로 과거의 데이터로 되돌아 가는 원리임을 알자.
RDS 인스턴스 삭제
기본적으로 RDS 인스턴스는 삭제 방지 기능이 적용되어 있기 때문에 그냥 삭제가 되지 않는다.
RDS를 삭제하고 싶다면, 인스턴스 수정 메뉴에서 삭제 방지 기능을 체크 해제 해주어야 한다.
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.