AWS DMS 기초개념 및 실습

2019-04-12

Data_Engineering_TIL_(20190409)

study program : https://www.fastcampus.co.kr/extension_des

[학습목표]

  • AWS DMS(Database Migration Service) 기초개념 이해 및 실습

[학습기록]

AWS DMS 기초개념

1

  • AWS Database Migration Service(AWS DMS)는 결론적으로 클라우드에 데이터를 모으기 위해 쓰는 툴이다. 위의 파이프라인 아키텍처에서 ‘수집’단계에서 활용하는 툴이라고 할 수 있다. DMS는 원래 데이터베이스에 대한 마이그레이션 툴로 만들어졌기 때문에 DMS를 사용해서 외부에서 RDS나 S3로 데이터를 보낼 수 있다.

  • DMS는 관계형데이터베이스, 데이터웨어하우스, NoSQL 데이터베이스 및 그밖의 데이터스토어 유형을 쉽게 마이그레이션 하도록 해주는 클라우드 서비스이다. 다시말해 관계형 RDBMS거나 DW 관련된 데이터, NOSQL로 되어있는 데이터를 분석을 하고자 하는 Redshift나 이런쪽으로 한꺼번에 모을때 보통 사용한다. DMS를 쓰면 쉽게 이런 작업을 할 수 있다.

  • DMS를 사용하여 AWS 클라우드로, 온프레미스 인스턴스간에(AWS 클라우드 설정을 통해) 또는 클라우드와 온프레미스가 결합된 설정간에 데이터를 마이그레이션 할 수 있다. 다시말해 온프로미스에 있는 데이터를 어떤 필요에 의해서 클라우드에서 분석을 하고 싶을때 온프로미스에 있는 데이터를 가져오는 경우도 있는데 이때도 DMS를 쓸 수 있다.

  • DMS의 퍼포먼스는 상당히 좋은 편이다.

2

  • DMS의 구성과 프로세스는 잘 알아둬야 한다. 위의 그림처럼 소스 DB의 데이터를 타겟 DB로 옮기는 프로세스이다. 조금 더 세부적으로 살펴보면 소스 DB에 있는 데이터를 소스 endpoint로 내리고 그 내린 데이터를 타겟 endpoint로 옮긴 다음에 타겟 DB에 넣어주는 프로세스이다.

  • 레플리케이션 인스턴스는 레플리케이션 테스크를 수행하면서 데이터를 소스에서 타켓으로 옮겨주는 역할을 한다.

  • 참고로 소스 DB에서 데이터를 보낼때 높은 퍼포먼스를 내기 위해 파일로 변환해서 소스 엔드포인트 쪽으로 내리게 된다. 이때 가장 문제가 되는것이 특수문자 같은게 포함되어 있으면 파일이 깨지는 문제가 발생할 수 있는데 이런 문제 때문에 가운데에 레플리카 인스턴스가 있다. 소스데이터 베이스 등록을 하고, 그 데이터 베이스의 데이터를 레플리카 인스턴스가 받았다가 타겟 데이터 베이스에 넣어주게 된다.

  • 주의해야 할점은 레플리카 인스턴스를 누군가가 사용하고 있다면 다른 사람은 그것을 사용할 수 없다. 왜냐하면 소스에서 데이터를 내리는 과정동안에는 하드웨어 자원을 지속적으로 계속 쓰고 있기 때문이다.

3

  • 온프로미스에서 클라우드로 데이터를 보낼때는 위의 그림과 같다. 소스DB에 있는 데이터를 아마존 컨넥트라는 서비스를 이용해서 직접 다이렉트로 연결되는 네트워크 백본망을 구성해서 이 백본망을 이용해서 DMS 서비스를 통해 데이터를 보내주게 된다.

4

  • 아니면 위의 그림처럼 클라우드 내에서 특정 리전에서 쓰던 DB를 다른 리전의 DB와 싱크를 맞추기 위해서 또는 데이터를 옮기기 위해서 쓸 수 있다.

5

  • 위의 그림과 같이 같은 리전 안에서도 다른 디비에 옮길때도 쓸 수 있다.

AWS DMS 실습

[실습 프리뷰]

DMS를 이용해서 소스디비에서 내가 생성한 타겟 디비(RDS)로 데이터 보내기

  1. Replication Instance 생성

  2. Data를 넣을 타겟DB 생성(Data를 가져올 소스 디비는 강사님이 생성하신 것 사용)

  3. 소스DB, 다시말해 RDS에서 jnkwondees의 Endpoint를 확인하고 복사하기 그리고 client(SQL 워크밴치)를 통해 접속해보기

  4. 자신이 직접 만든 타겟도 SQL 워크밴치로 접속 테스트해보기

  5. DMS의 소스 Endpoint 생성 및 연결테스트

  6. DMS의 타겟 Endpoint 생성 및 연결테스트

이번엔 똑같은 소스디비에서 내가 생성한 타겟 디비(RDS)가 아니라 지정된 S3로 데이터를 보내보기

  1. Test target Endpoint, Source -> Target Task1 생성

  2. S3 Target Endpoint 만들기

  3. Source -> Target(S3) Task2 생성

step 1) 먼저 레플리카 인스턴스를 띄워야 한다.

서비스에 dms 검색 후 접속 -> 좌측에 레플리카 인스턴스 클릭 -> 크리에이트 레플리케이션 인스턴스 클릭

6

step 2) 고유한 아이디를 name에 부여해주고, 인스턴스 클래스는 스몰로 해준다. 그 다음에 하단에 크리에이트 클릭

7

step 3) 크리에이트하고 나서 다른 창으로 콘솔을 하나 더 띄운다.

step 4)

Data를 가져올 소스는 강사님이 사전에 생성한 소스디비를 이용할 것이고,

우리가 데이터를 넣을 타겟이 있어야 한다.

그래서 Data를 넣을 타겟DB(오로라)를 생성해야한다.

step 5) rds 서비스 들어가서 크리에이트 디비 클릭

8

step 6) 아래 그림과 같이 설정

9

10

step 7) 넥스트 누르고 또 아래 그림과 같이 설정해준다.

11

step 8)

위에 DB instance identifier 이름과 동일하게 아래에 DB cluster identifier도 이름을 부여해준다.

Database name은 얘가 creation 되었을때 어떤 스키마를 디폴트로 만들건지 물어보는 것이다. 임이의 이름을 부여해준다.

12

step 9)

그리고 인크립션은 아래와 같이 디스에이블로 설정해준다.

copy tags to snapshots은 체크 해제를 해준다. 이 옵션은 실제로 운영할때는 사용해야한다.

13

step 10)

그 다음에 스크롤을 내리면 아래 그림과 같이 enable deletion protection은 체크 해제해준다. 이걸 체크하면 나중에 삭제할때 까다롭다.

아래와 같이 설정을 해주고 크리에이트 데이터베이스 클릭

14

step 11) RDS 대쉬보드에서 내가 부여한 아이디를 검색하면 디비가 생성된 것을 볼 수 있다.

step 12) 그리고 마찬가지로 RDS 대쉬보드에서 강사님 아이디로 검색하면

강사님이 사전에 만들어놓은 Data를 가져올 소스가 아래와 같이 보일 것이다.

이 두개중에 Role에서 writer라고 적혀 있는 것이 강사님이 만들어놓은 소스디비의 endpoint이다.

(내가 방금 생성한 아이디를 검색하면 밑에 그림처럼 두개가 나오는데 마찬가지로 Role에서 writer라고 적혀있는 것이 endpoint이다.)

** 여기서 주의사항 **

참고로 AWS에서 어떤 시스템이든 접속포인트를 전부 endpoint라고 부르는데,

여기서 endpoint라고 말하는 것은 말그대로 접속포인트이고,

DMS의 endpoint는 별개이다. DMS의 endpoint라는게 따로 있다는 것이다!!! 헷갈리면 안된다.

DMS의 endpoint는 레플리카 인스턴스를 만든후에 별개로 또 소스 endpoint와 타겟 endpoint를 만들어줘서 소스디비랑 타겟디비를 연결해줘야 한다.

**

그래서 다시 실습으로 돌아가면 빨간색 박스친 곳을 클릭하면 거기에 접속을 위한 URL이 나와 있는데 그것을 메모장에 카피한다.

포트는 3306이다. 그다음에 소스디비의 계정과 비밀번호 역시 따로 메모장에 복사해둔다.

** 주의사항 **

소스 디비에 대한 접속정보와 타겟 디비의 접속정보를 잘 메모장에 카피를 해두고 있어야한다.

1) 소스/타겟디비 접속주소(URL)

2) 소스/타겟디비 사용자 아이디 (통상 AWS RDS에서는 DB identifier가 사용자 아이디다)

3) 소스/타겟디비 사용자 비번

4) 포트

15

step 13) SQL 워크밴치를 이용해서 강사님이 사전에 만들어 놓은 소스 디비에 접속이 잘 되는지 테스트하는데 절차는 아래와 같다.

1) 가장 상단에 connection name은 그냥 임의의 나의 아이디를 입력해준다.

2) 카피한 endpoint의 URL은 Hostname에 붙여넣는다.

3) 카피한 디비 아이디는 Username에 붙여넣는다.

4) 포트에는 3306 입력

5) 카피한 디비 비번은 store in valult… 클릭 -> 팝업창 뜨면 password에 붙여넣기 -> ok 클릭

6) 하단에 테스트 컨넥션을 해서 정상적으로 접속이 되는지 확인한다.

16

그리고 ok를 누르고 소스디비에 접속을 해보면 dees 라는 스키마 안에 보면 movies와 sample1,2 총 세개의 테이블이 있다.

sample1은 총 500만건이다.

17

step 14) 워크벤치로 위에처럼 소스디비에 접속하는 방법과 동일하게 내가 만든 RDB도 마찬가지로 워크벤치를 이용해서 정상적으로 접속이 되는지 테스트 해본다.

step 15) 위에 소스디비와 타겟 디비가 잘 돌아가는게 확인 되었으면 우리는 DMS를 구성을 할텐데, 레플리카 인스턴스는 만들었으니까 이제는 소스 엔드포인트와 타겟엔드포인트를 만들어서 연결할 차례이다.

그래서 AWS로 돌아와서 DMS 서비스에 접속하고 endpoints클릭 크리에이트 엔드포인트 클릭해준다.

소스 엔드포인트와 타겟 엔드포인트 모두 여기서 다 등록할 수 있다.

18

step 16) 아래 그림과 같이 입력하여 소스 엔드포인트를 등록할 것이다.

1) 타입은 source를 선택해준다.

2) endpoint identifier는 내가 아까 만든 아이디에 뒤에 ‘-source’를 붙여줘서 소스라는 것을 명시해준다.

3) 소스디비의 엔진이 오로라기 때문에 여기서도 소스엔진을 오로라로 선택해준다.

4) server name은 아까 복사해뒀던 소스 디비의 URL 주소를 입력해준다.

5) 포트는 3306으로 입력해준다.

6) User name도 아까 복사해둔 소스디비의 유저 아이디를 입력해준다.

7) password 역시 아까 복사해둔 소스디비 유저의 비번을 입력해준다.

8) create endpoint 클릭

18-2

19

step 17) 생성하면 아래와 같이 생성된 것을 볼 수 있다.

그리고 엔드포인트가 잘 작동이 되는지 테스트를 해야한다.

아래 그림처럼 ‘actions’ 클릭 -> ‘test conncetion’을 클릭

20

테스트 컨넥션을 할때 레플리카 인스턴스를 이용해서 확인하기 때문에 중간에 Replication 인스턴스에서 아까 생성한 레플리카 인스턴스를 선택해준다.

run test를 눌러스 status에 successful이 뜨는지 보면 된다.

successful이 뜨면 ‘소스디비 -> DMS 소스 엔드포인트 -> 레플리카 인스턴스’까지의 연결이 정상적으로 이루어진 것이다.

이렇게 비디와의 연결, dms 엔드포인트와의 연결, 레플리카 인스턴스와의 연결 등을 하나하나씩 다 해줘야한다.

나중에 한번에 확인하면 어디에서 에러가 나는지 너무 헷갈리게 되기 때문이다.

21

step 18) 마찬가지로 위의 방법처럼 타겟 엔드포인트를 생성하는데

다만 입력하는 설정정보는 아까 내가 생성한 RDS 정보를 넣어주면 된다.

그리고 잘 연결이 되었는지 테스트까지 해본다.

여기까지하면

소스디비 -> DMS 소스 엔드포인트 -> 레플리카 인스턴스 -> DMS 타겟 엔드포인트 -> 타겟디비

까지 일련의 연결이 된것이다.

** 참고사항 **

DMS 엔드포인트에 여러 소스디비와 타겟디비를 등록할 수도 있다.

그래서 여러 캐이스에 따라서 다른 타겟을 잡아서 데이터를 보내 줄 수도 있다.

우리는 일단 방금 생성한 타겟 디비 RDS 같이 DBMS에 데이터를 보낼 것인데 실제 현업에서는 생성되는 데이터가 어마어마하게 많기 때문에

DMBS에서는 분석을 한다는 것이 쉽지 않고 통상 그래서 S3로 내려서 분석하게 된다.

**

step 19) 이제 연결이 되어 있으면 레플리카 인스턴스한테 일을 시켜야 한다.

그것을 job이라고 한다. 그 job을 레플리카 인스턴스한테 지시하고자 한다.

DMS 콘솔에서 데이터베이스 마이그레이션 tasks 클릭 -> create task 클릭

22

step 20) 아래 그림과 같이 설정을 해주면된다.

레플리카 인스턴스는 내가 아까 만든 레플리카 인스턴스 선택

소스 디비 엔드포인트와 타겟 디비 엔드포인트 역시 내가 아까 만든 거 선택

23

그리고 스크롤을 내리면 테스크 세팅이라고 있는데 참고로

Target table preparation mode은 무엇을 설정하는가 하면 타겟 디비에 기존에 테이블이 존재한다는 것을 가정한다면

do nothing은 아무것도 안하는 것이고, drop tables on target은 기존에 있는 테이블을 없애고 넣는다. 그리고 Truncate는 데이터만 없애고 넣는 것이다.

LOB는 바이너리 디비를 마이그레이션 할때 사용하는 옵션이다. B-LOB이라는 타입과 C-LOB이라는 바이너리 양식의 타입이 있는데 거기에는 바이너리 파일이 들어가 있는 형태이다. 이 바이너리 파일들이 큰편인데 아래와 같이 sizing 옵션을 줄 수 있다.

24

그 다음에 우리가 어떤테이블을 옮길지 선택해야한다.

그런다음에 위에 그림에는 안보이지만 add new select role를 선택해서 클릭하면 소스 디비에 있는 스키마들이 다 보인다.

그중에서 우리가 가져올 데이터가 있는 ‘dees’ 선택하고, 타겟디비에 테이블 하나씩 가져올 수도 있고, %를 설정해줘서 가져오면 전체다를 가져온다. 특정 컬럼을 excluding해서 가져오거나 including해서 가져오는 기능도 있다. 그래서 특정컬럼을 빼서 가져올 수도 있고, 매핑해서 가져올 수도 있다.

이런 설정을 해주고 create task를 클릭해준다.

그러면 레플리카 인스턴스가 일을 시작하는데 aws dms 콘솔을 통해 현재 상태나 진행상황을 모니터링 할 수 있다.

step 21) 마이그레이션이 완료되면 워크 밴치를 통해 target 디비로 접속해서 데이터가 잘 들어왔는지 확인해본다.

위에서 언급한 것처럼 실제 현업에서는 생성되는 데이터가 어마어마하게 많기 때문에

DMBS에서는 분석을 한다는 것이 쉽지 않고 통상 그래서 S3로 내리는 실습도 해보자.

S3도 위의 방법과 비슷하게 RDS랑 같다고 생각하고 스텝을 진행하면 된다.

그리고 S3 버켓이 데이터베이스라고 생각하면 된다.

step 1) DMS 서비스가서 create endpoint를 클릭한다.

step 2) 아래의 그림처럼 설정

Endpoint type에서 target endpoint 클릭

Endpoint identifier에 내 고유아이디 입력

타겟엔진은 S3를 선택한다.

또한 DMS라는 아마존 서비스에서 s3라는 아마존 서비스로 접근하기 때문에 권한이 필요하다.

이 권한을 설정해주는란이 service access role ARN이고 이것은 사전에 강사님이 만들어놓은 것으로 설정한다.

타겟버켓은 미리 강사님이 만들어놓은 s3로 할 것이고 버킷이름이 dees2-class이다.

버킷폴더는 dees2-class 밑에 어떤 폴더로 데이터를 떨굴지 설정하는 것이다.

25

위의 그림에서 스크롤을 내리면

이 endpoint도 연결 테스트를 할 수있는 란이 있다.

아까처럼 내가 생성한 레플리케이션 인스턴스 선택하고 run test 클릭해주면 된다.

그 다음에 create endpoint 클릭해준다.

step 3) DMS 콘솔에서 데이터베이스 마이그레이션 tasks 클릭 -> create task 클릭

step 4) 테스크 생성은 아까 위에서 테스크 생성한 것처럼 하면 되는데 다른점은 타겟 엔드포인트만 방금생성한 엔드포인트로 잡아주면 된다.

그 다음에 어떤 테이블을 가져올지 선택해주면 되는데 ‘add new select role’에서 스키마에 ‘movies’선택

그 다음에 create task 클릭

step 5) 그러면 task가 실행하면 DMS가 소스디비에서 타겟디비에 우리가 지정한 데이터를 부어주게 된다.

타겟디비에 쌓이는 데이터 파일 형식은 csv형식으로 쌓일것이다.

만약에 옮기고자 하는 테이블이 여러개가 있었다면 s3 버켓안에도 테이블 만큼 폴더들이 생기고 그 밑으로 해당 데이터를 옮겨줄 것이다.