안녕, 세상!

3. AWS RDS 구축 (MySQL) 본문

It공부/Server

3. AWS RDS 구축 (MySQL)

dev_Lumin 2021. 2. 8. 00:03

(1) 데이터 베이스의 분리

앞서 AWS EC2를 구축했을 때 EC2 안에 데이터 베이스 MySQL을 설치하고,

EC2에서 데이터베이스를 사용하였습니다.

물론 EC2의 서버에 데이터 베이스를 구축해도 당장에는 문제가 없어 보이지만,

서비스를 운영하다 보면 많은 데이터의 저장이 요구되며, 만약 EC2에 문제가 생기면 데이터 베이스에도 접근하지 못한다는 문제가 발생합니다.

그러므로 보통 기본 서버와 데이터 베이스 서버를 분리해서 관리를 해줍니다.

이렇게 데이터 베이스를 분리함으로써 얻는 이점은 다음과 같습니다.

  • N : 1의 확장성 

  • 보안에 좋음

  • 편리성

아마존에서는 이렇게 데이터 베이스를 분리해서 관리할 수 있도록 RDS라는 서버를 제공해줍니다.

RDS 인스턴스를 구축해보겠습니다.

 

(2) RDS 인스턴스 생성

AWS에 들어가서 우선 RDS 서비스를 선택하고 데이터 베이스를 생성합니다.

 

 

필자는 표준 생성으로 MySQL 8.0.20 버전을 이용하였습니다.

 

우선 프리 티어로 선택을 합니다. ( 이미 rds가 있다면 두 번째 인스턴스부터는 프리 티어 설정 못함)

 

DB 인스턴스 식별자를 자유롭게 정해주고, 데이터베이스 마스터 사용자 계정을 생성합니다.

 

 

 

프리티어는 버스터블 클래스밖에 선택하지 못합니다.

AWS의 RDS는 표준, 메모리 최적화 및 버스트 성능의 3가지 인스턴스 클래스 유형을 지원합니다.

( 버스트 : 특정 기준에 따라 한 단위로서 취급되는 연속된 신호나 데이터의 모임 )

그중 db.t2

CPU 사용률을 최대로 버스트할 수 있는 기능을 통해 기준 성능 수준을 제공하는 현재 세대 인스턴스 클래스입니다.

 

다른 클래스에 대한 설명 링크는 다음과 같습니다.

docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/Concepts.DBInstanceClass.html     

 

 

프리티어의 스토리지 최대 할당량은 20GB라고 합니다.

 

외부에서 데이터베이스에 접속할 수 있도록 퍼블릭 액세스 가능을 '예'로 설정합니다.

필자는 'luminVpC'라는 VPC 보안 그룹을 새로 만들었습니다.

 

 

필자는 데이터 베이스 인증을 암호 인증으로 선택했습니다.

 

추가 구성을 꼭 하는것을 권장합니다.

그 이유는 초기 데이터베이스 이름을 지정해야 하기 때문입니다.

 

 

이제 데이터 베이스 생성을 누르고 생성되는 동안 기다립니다.

생성되는데 약간의 시간이 걸립니다.

 

다음과 같이 사용가능 표시가 나오면 데이터 베이스 구축이 완료된 것입니다.

 

 

 

(3) RDS 운영 환경에 맞는 파라미터 설정

RDS를 구축했으므로 필요한 설정을 하겠습니다.

 

① EC2와 연결

ec2에서 rds로 접근 가능하게 하기 위해서 포트를 열어주는 과정이 필요합니다.

앞서 생성한 보안 그룹을 클릭해서 접근합니다.

RDS의 보안그룹

인바운드 규칙을 다음과 같이 편집해줍니다.

우선 위와 같이 기본적으로 RDS 서버를 관리할 호스트 컴퓨터의 ip만 접속할 수 있도록 설정되어 있습니다.

하지만 EC2역시 RDS의 MySQL에 접근할 수 있게 해야 하므로 

MySQL를 선택하고 소스 부분에서 EC2의 보안그룹 코드를 설정해주고 저장해줍니다.

이제 EC2가 RDS에 접근 가능하도록 설정이 되었습니다.

 

EC2에서 RDS의 접근은 나중에 하겠습니다.

 

 

외부에서 rds 접근 확인

외부에서 데이터 베이스로 접속할 수 있는 Datagrip을 사용하였습니다.

다음과 같이 사용자는 RDS를 생성할 때 생성한 master 계정으로 로그인을 하였습니다.

host에는 RDS의 엔드포인트 넣으면 됩니다.

위와 같이 RDS에 접속이 잘 되는것을 확인할 수 있습니다.

 

접속이 잘 되었으므로 다음 명령어를 입력하여 SQL을 작동시켜봅니다.

show variables like 'c%';

이를 통해 DB 문자형 관련 설정을 확인할 수 있습니다.

아직 utf8 설정이 안된 부분이 있으므로 인코더 설정을 해줘야 합니다.

우선 타임존 설정을 해주고 인코더 설정을 해주겠습니다.

 

② 타임존 설정

RDS의 시간을 서울 시간으로 수정을 해줍니다.

 

설정하기 위해서 AWS RDS의 [파라미터 그룹]으로 이동합니다.

기본적으로 default 파라미터가 존재하지만,

default 파라미터 그룹은 수정이 불가능하기 때문에 새로운 그룹생성힙니다.

필자는 'lumin-db-group1'이라고 생성하였습니다.

 

생성한 파라미터 그룹을 클릭하여 들어가서 

time_zone 이라고 검색합니다. 

파라미터 편집 버튼을 누르고 Asia/Seoul로 설정해주고 변경 사항 저장을 합니다.

 

 

③ Characater set utf-8 설정

한글 데이터가 깨지지 않고 잘 출력시키게 하기 위해서 utf-8 인코더를 설정해줘야 합니다.

character_set

타임존 설정했던 과정과 마찬가지며 검색 키워드를

character_set으로 하고 해당 요소들을 모두 utf8mb4로 설정해줍니다.

(utf8로 설정해도 상관없음)

밑에 character_set 더 있음 바꿀 수 있는 것들 모두 utf8mb4로 수정

 

utf8과 utf8mb4 모두 한글이 깨지지 않게 인코딩해주지만 차이가 있습니다.

utf8은 이모지를 저장할 수 없지만, utf8mb4는 이모지를 저장할 수 있습니다.

utf8은 가변 3바이트를 사용하는데 반해서,

utf8mb4는 내부적으로 한 문자를 표현하는데 4바이트를 사용합니다.

3바이트만 사용하는 utf8은 이모지를 저장할 수 없습니다.

 

( 참조 : stackoverflow.com/questions/30074492/what-is-the-difference-between-utf8mb4-and-utf8-charsets-in-mysql )

 

 

collation

이번에는 collation을 검색하여 collation부분을 모두 utf8mb4_general_ci로 바꿔줍니다.

- collation_connection : utf8_general_ci

- collation_server : utf8_general_ci

 

 

선택적으로 max connections을 설정 가능

최대 동시 데이터베이스 연결 수는 DB 엔진 유형과 DB 인스턴스 클래스의 메모리 할당에 따라 다릅니다.

( docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/CHAP_Limits.html )

 

 

위의 파라미터 그룹 설정을 새로 만든 파라미터 그룹에 설정을 한 것입니다.

하지만 RDS의 파라미터 그룹은 default가 기본으로 설정되어 있을 것입니다.

RDS의 파라미터 그룹을 'lumin-db-group1'으로 설정이 필요합니다.

 

데이터 베이스 선택 화면으로 가서 데이터 베이스를 선택해주고,

 

수정 버튼을 누릅니다.

 

데이터베이스 옵션 부분에서 DB 파라미터 그룹을 default에서 수정해줍니다.

 

계속 버튼을 누르고 수정사항을 즉시 적용시켜줍니다.

수정되는데 약간의 시간이 걸릴 수 있습니다.

 

수정이 완료되었다면 수정사항을 적용시키기 위해서 재부팅을 시켜줍니다.

재부팅을 하는데 시간이 어느 정도 걸립니다.

재부팅시킨 후 datagrip을 다시 확인해봅니다.

 

앞서 변경한 time_zone을 확인해봅니다.

서울 시간(현 시간)으로 잘 나오는 것을 확인할 수 있습니다.

 

일부 설정은 변경이 적용되었지만, 

character_set_database와 collation_connection 2가지 항목의 변화가 없습니다.

이를 위해서 다음 명령어로 강제로 변환시켜줍니다.

ALTER DATABASE DB이름
CHARACTER SET = 'utf8mb4'
COLLATE = 'utf8mb4_general_ci';

 

character_set_database는 바뀌었지만 collation_connection은 바뀌지 않았습니다.

일단 utf8mb4로 되어 있으니 넘어갑니다. 

 

파라미터 그룹의 수정이 생겼으므로 다시 재부팅을 해줍니다.

 

 

RDS 한글 테스트

한글이 잘 출력되는지 확인하기 위해서 다음과 같이 test라는 table을 생성합니다.

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;

한글이 깨지지 않고 잘 나오는 것을 확인할 수 있습니다.

 

 

MySQL Storager Engine은 물리적 저장장치에서 데이터를 어떤 식으로 구성하고 읽어올지 결정하는 역할을 합니다.

기본적으로 8가지의 스토리지 엔진이 탑재되어 있으며 CREATE TABLE문을 사용하여 테이블을 생성할 때 엔진 이름을 추가함으로써 설정할 수 있습니다.

그중 가장 많이 쓰이는 엔진은 MyISAM, InnoDB, Archive 3가지입니다.

우선 위에서 사용한 InnoDB에 대해서 간단하게 알아보겠습니다.

 

(참조 : jobc.tistory.com/196 )

InnoDB란?

InnoDB는 MySQL의 데이터베이스 엔진입니다.

MySQL의 모든 바이너리에 내장이 되어 있으며, 트랜잭션을 제공합니다.

 

트랜잭션(transcation) : 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위

데이터 베이스의 상태를 변화시킨다는 것은 SQL을 이용하여 데이터 베이스를 접근한다는 의미입니다.

트랜잭션의 자세한 설명은 다음 글을 참조합니다.

( 참조 : coding-factory.tistory.com/226  )

 

 

 

(4 ) EC2에서 RDS 접속

EC2 인스턴스 서버에 putty로 들어갑니다. 

필자는 이미 전의 실습에서 mysql를 설치했으므로 MySQL을 설치할 필요가 없습니다.

RDS의 MySQL에 접속하기 위해서  

다음과 같이 명령어 입력해서 접근합니다.

$ mysql -u 사용자명 -p -h Host주소

Host주소에는 RDS의 앤드포인트 넣으면 됩니다.

master 사용자로 로그인을 하면 잘 접속이 되는 것을 확인할 수 있습니다.

앞서 한글이 잘 나왔는지 테스트해본 test table이 잘 있는지 확인해보겠습니다.

mysql> show databases;
mysql> use luminDB;
mysql> show tables;
mysql> select * from test;

 

 

 

 

 

참조 : velog.io/@swchoi0329/AWS-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95 

 

udud0510.tistory.com/category/Spring%20Web%20Project

 

designdevelop.tistory.com/68

 

 

Comments