20180726 AWS KRUG - RDS Aurora에 40억건 데이터 입력하기
1. RDS Aurora에 40억건 데이터 입력하기
26. Jul. 2018
hello@hbsmith.io
(AWS KRUG - architecture 소모임)
S3, EMR, Aurora 그리고 자동화
1
2. 발표자 소개
• 한종원
• Python과 Cloud Infra, Lean/Agile 방법론 그리고 애플의 제품을 사랑.
• 2012년 석사 학위를 마치고, startup을 시작 (이때부터 AWS를 production level에서 사용)
• '의미가 있는 일을, 올바르게 하고 싶다.'
• 경력
• (현) DevOps 전문 스타트업 ‘HB Smith’ 대표
• 택시 O2O 서비스 스타트업 ‘Kanizsa Lab’의 backend server / infra devops 담당
• Cloud computing 전문 스타트업 'A2 company' co-founder (‘KINX’에 인수합병)
• NEXON 'MapleStory 국내 Live Team'에서 DBA, SA로 근무 (산업 기능 요원)
2
https://www.linkedin.com/in/addnull/
https://hbsmith.io
“Startup 경력 = AWS 사용 기간”
3. Contents
• 요구사항 정리
• Version 0: S3 -> Aurora (bulk insert)
• Version 1: S3 -> Aurora (scale down and HA)
• Version 2: S3 -> EMR -> S3 -> Aurora
• Wrap Up
3
5. 요구사항 정리
• “40억건 data를 DB에 넣어주세요.”
• “단, 일주일마다 한 번씩 최대한 빨리 넣어주세요.”
• “원본 data는 S3에 있습니다.”
5
6. 요구사항 정리
• data 1건의 구성
• 원본 6개 field
• 마지막 2개의 field 를 조합해서 새로운 값을 계산해서 넣어야함
6
018c32d8 0.000457 0.000178 3 3.3529 1.0002
018c32d8 0.000457 0.000178 3 3.3529 1.0002 A3WFA
8. Version 0: S3 -> Aurora (bulk insert)
• 구글링, 구글링!
• 1.1M writes/sec over 3B Items with 50 nodes (n1-standard-16)
1M writes/sec over 100 million Items with 40 nodes (n1-standard-8)
• 1시간 안에 완료 가능?!?!
8
https://blog.couchbase.com/couchbase-server-hits-1m-
writes-with-3b-items-with-50-nodes-on-google-cloud/
9. Version 0: S3 -> Aurora (bulk insert)
• 문제점
• AWS 에서는 Couchbase를 직접 구성해야함.
• Couchbase 잘모름.
9
10. Version 0: S3 -> Aurora (bulk insert)
• Couchbase 를 선택하면,
지속적으로 유지보수 이슈가
생길 것 같은 슬픈 예감..
10
11. Version 0: S3 -> Aurora (bulk insert)
• Ground rule
• 내가 잘 알고 있고, 잘 아는 사람이 많은 기술을 선택
-> 즉, MySQL 같은 것들.
• AWS에서 기본으로 지원해주는 full-managed service
-> 그래서 결론은 RDS Aurora
11
12. Version 0: S3 -> Aurora (bulk insert)
• RDS Aurora는 S3로부터 bulk insert를 지원
• 즉, S3에 있는 delimiter separated text file을 (예: csv file)
RDB table로 바로 입력 가능함
12
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/
AuroraMySQL.Integrating.LoadFromS3.html
13. Version 0: S3 -> Aurora (bulk insert)
• [TIP] bulk insert의 속도를 빠르게 하기 위해서 index는 나중에 생성
13
14. Version 0: S3 -> Aurora (bulk insert)
14
Aurora 최고 사양 ‘db.r4.16xlarge’으로 실행
15. Version 0: S3 -> Aurora (bulk insert)
• 실행 결과..
• bulk insert에는 8시간
create index는 20시간 정도 걸림 (음?!?!)
15
16. Version 0: S3 -> Aurora (bulk insert)
• bulk insert와 create index를 10개로 나눠서 동시 실행
(EC2 하나에서 multi process 로 실행해도 무방)
16
…
17. Version 0: S3 -> Aurora (bulk insert)
• 실행 결과
• bulk insert: 3시간
create index: 5시간
17
bulk insert가 최대 초당 4M
19. Version 1: S3 -> Aurora (scale down and HA)
• “HA(이중화) 해야할 것 같아요.”
• “그리고 db.r4.16xlarge 너무 비싸요.”
19
20. Version 1: S3 -> Aurora (scale down and HA)
• bulk insert 가 완료되면 ‘db.r4.xlarge’로 scale down 하기로 함
• 앞서 과정에서 동시에 실행되는 10개의 bulk insert 가 모두 끝날 때까지 polling
20
21. Version 1: S3 -> Aurora (scale down and HA)
• 동시에 실행되는 10개의 bulk insert 가 모두 끝나면
scale down 하고 완료되면 HA
• [TIP] Aurora는 기존의 RDS 와 달리
‘create_db_instance_read_replica’가 아니라
‘create_db_instance’를 써야함.
21
23. Version 2: S3 -> EMR -> S3 -> Aurora
• “마지막 2개의 field 를 조합해서
새로운 값을 계산해서 넣어주세요”
23
018c32d8 0.000457 0.000178 3 3.3529 1.0002 A3WFA
018c32d8 0.000457 0.000178 3 3.3529 1.0002
24. Version 2: S3 -> EMR -> S3 -> Aurora
• 복잡한 산술 연산을 RDB 에서 하는 건 부적절
• ‘음... S3 에 있는 원본 data를 bulk insert 하기 전에 전처리가 가능할까?’
24
25. Version 2: S3 -> EMR -> S3 -> Aurora
• EMR steps는 S3에 있는 text file 대상으로 map reduce가 가능
(결과는 다시 S3에 text file로 저장)
25
https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-work-with-steps.html
26. Version 2: S3 -> EMR -> S3 -> Aurora
• mapper : 딱히 할 일이 없음
26
27. Version 2: S3 -> EMR -> S3 -> Aurora
• reducer: 실제 연산 수행
-> 여기서 앞서 말한 10개 bulk insert를
위해서 결과를 10개의 text file로
나눠서 저장
27
28. Version 2: S3 -> EMR -> S3 -> Aurora
• 전체 architecture 요약
28
30. Wrap Up
• 요구사항
• “40억건 data를 DB에 넣어주세요.”
• “단, 일주일마다 한 번씩 최대한 빨리 넣어주세요.”
• “원본 data는 S3에 있습니다.”
• “HA(이중화) 해야할 것 같아요.”
• “그리고 db.r4.16xlarge 너무 비싸요.”
• “마지막 2개의 field 를 조합해서 새로운 값을 계산해서 넣어주세요”
30
31. Wrap Up
• Ground rule
• 내가 잘 알고 있고, 잘 아는 사람이 많은 기술을 선택
• AWS에서 기본으로 지원해주는 full-managed service
31
그래서 S3, EMR, Aurora