AWS Summit 2019 Seoul

AWS Summit 2019 에서 참석했던 세션 요약입니다.


마이크로 서비스 에서 데이터 베이스

  • 데이터 베이스는 여전히 성장 중
    • 오라클 디비를 아마존 DynamoDB로 옮기는 사례 증가
  • 그러나 모노리틱 시대는 끝났다
  • 시대의 변화를 위한 아마존 서비스들
    • 오로라 포스트그리 SQL : 비용및 빠를 구조
    • 다이나모 디비 : 큰용량
    • 아마존 엘라스틱케쉬 : 빠른 응답
  • 반복적인 유지보수 해결책
    • 앱을 작은 조각 - 조각간 통신 개발환경 구축 - 데이터 베이스도 분산
    • 요구사항 ; 글로벌, 페타이상의 크기, 수억 리퀘스트, 다양한 플랫폼(웹, 모바일 등)
  • 데이터 모델에 따른 서비스
    • 기존 관계형 모델은 정확하지만 복잡(파이넨스) : Aurora
    • 키-벨류 모델은 빠르고 확장성(쇼핑몰) : DynamoDB
    • Document모델(문서 관리) : DocumentDB
    • 인메모리 모델은 엄청 빠른 속도 확장성: 엘라스틱 케시
    • 그래프 모델은 복잡하고 방대한 설계 : 아마존 넵튠
    • 타임시리즈 모델 : 아마존 타임스트림
    • Ledger는 절대 변경불가 모델(블럭체인) : 아마존 QLDB
  • 사례
    • AirBnB
      • 검색이력 : 아마존 다이나모 디비
      • 세션 :엘라스틱케시
      • 관계형디비 : 오로라 MySQL
    • 버라이즌
      • 관계형디비 : 포스트그리
      • GDPR대응을 위해 지역 분산: 다이나모 디비
      • 캐시 : 엘라스틱 케시
    • 삼성
      • 수억명의 사용자 정보를 보관 : 카산드라 쓰다가 다이나모 디비로 넘어감
      • 관계형 : 오로라
      • 소셜 관계 : 넵튠
      • 엘라스틱케쉬
    • 롯데
      • 상품 이미지나 메타데이타 : 다이나모 디비
      • 카달로그 : 리스트 빠른 응답 엘라스티 케시
      • S3기반 데이타 레이크 : 레드 시프트
      • 사용자 : 오로라 MySql
  • 마이크로 서비스 구현 사례
    • 마이크로 서비스 데이터 베이스 : 롯데 B2
      • RDB : 전통의 강자, 많은 숙련자, 무결성
      • NoSQL : 자유로운 스키마, 진입이 꺼려짐(무결성x, 개발자 부족 등)
      • 과연 RDB는 좋을까?
        • 정규화 맞추기 어려움 - 튜닝 - 프로시져,펑션으로 대체 - 무한 반복(비용 증가)
        • 익숙할 뿐 편리한 건 아니야
      • RDB(Monorithic)에서 비지니스(MSA)중심으로 전환
        • 오픈소스 들의 관리 어려움, 부담
        • HA구성 어려움
      • 멀티 데이터 스토어 기준
        • 관리형 서비스 중심
        • 목적에 맞게 분리 - 고객용 비고객용 구분
        • 서비스 중심 아키텍처(아키텍처 중심이 아님) - MSA
      • 핫,웜,콜드 데이터 기준 분류
        • 낮은 레이턴시, 잦은 스키마 변경 : 다이나모
        • Data Lake : S3, Redshift
      • 데이터 파이프라인 구축
        • 대고객(Tier-0), 백오피스업무(Tier-1)
        • Glue, ETL, Firehose, S3 를 엮어서?
      • 다이나모 디비
        • RCU, WCU 조절로 성능 설정 좋음
      • 동기 비동기 구분
        • 동기처리는 DDB Stream - Lambda
        • 비동기는 Kinesis Firehose
      • Full text 검색
        • DynamoDB Stream + Lamda로 ElasticSearch에 넣어서 처리
      • 다량의 데이터 인은 DynamoDB- Firehose(버퍼)- RDB 또는 DynamoDB Stream-kinesis client(분산) 으로 처리
      • 비동기는 Glue활용 (크롤러로 카달로그 생성, 카달로그에서 딕셔너리 정보 추출)
      • 배치기능은 지양하고 싶었지만, 아래 방식으로 처리
        • 클라우드 와치 이벤트 활용 - 람다 호출
        • 데이터 레이크의 Athena(Presto Query)로 추출 - 결과는 S3에 적재
        • 비즈니스 로직이 많은 경우엔 람다 적극활용(이벤트가 람다 호출) - 다이나모디비를 메시지 브로커로 하여 멱등성 관리(장애 처리)
      • ETL : 잘 못들음..
      • 결론 : 데이터 “베이스”가 아니라 저장소로 변경
        • 서비스 중심 사고
        • 동기화 개념 ETL은 Data stream process template 적용(ETL지양)
        • 용도에 따른 분리
        • 스트림데이터(줄을 서서 처리가 오래 걸림) 의 병렬처리 고민
        • 키네시스 파이어호스의 500개 인입 제한은 다른 메시지 브로커 사용
        • Athena 빈도 증가 - EMR 등 비용 절감

AWS에서 Kubernetes 실행하기

  • EKS 아키텍처, 글로발 고객 사례(Fidelity, Snapchat, State Street), 데모
  • EKS 아키텍처 : AWS 의 관리형 서비스
    • Tenets : 서비스를 만드는 원칙
      • EKS는 대규모 회사용 작업부하를 실행하는 플랫폼
      • EKS는 순수 쿠버의 업스트림의 경험을 유지(파편화 하지 않겠다?)
      • 다른 AWS와 매끄럽게(복잡하지 않고 쉽게) 연결
      • Kube오픈 소스에 적극적으로 기여
    • 아키텍처 - 잘 아는 그림
      • kubectl - EKS - 워커노드(VPC/EC2)
      • EKS 컨트롤 플레인
        • 고성능 고가용성, 단일 테넌트 인프라
        • 순수 AWS서비스
        • NLB로드 밸런싱
        • 컨트롤 플레인 로그(신서비스 출시)
          • API Server, Audit, Controller manager 등 모니터링
      • 데이터 플레인
        • 다양한 인스턴스(p2, p3.gpu, i3.metal, c5(스냅쳇), 스팟)
        • AI/ML용 EKS AMI 제공
        • EKS AMI 빌드 스크립트
      • 교차계정(cross account) ENI
        • 멀티 VPC로 구축 - 프라이빗 액세스로 VPC간 통신 지원
      • EKS와 함께 구성한 K8S 컴포넌트
        • 사진
        • 칼리코 네트워크 정책
        • 공유하는 스토리지 요구사항 - EFS, EBS
      • 필요한 구성
        • AWS Secret Manager, KMS, IAM을 이용
        • K8S의 RBAC을 연동
      • 네트워크 제어
        • VPC SG과 Subnet NACL과 Pod레벨의 네트워크 세그먼테이션 등과 연계
      • EKS 네트워크 레이어
        • 3개의 IP주소 계층
          • K8S 클러스터 - Pod - AWS VPC
        • VPC의 CNI에서는 AWS IP를 할당
          • ENI가 팟에 할당 - ENI를 CNI 플러긴이 외부와 연결
          • 주의 : 인스턴스 타입별로 붙일 수 있는 ENI갯수가 정해져 있음
      • CICD
        • AWS 코드 시리즈 - Helm과 연계
        • 사진
        • 람다를 통해 배포된 ECR을 EKS에 배포
        • 파라미터 저장소(AWS System Manager)에서 token을 관리
      • 가시화/모니터링
        • CloudWatch의 매트릭스, 로그, 클라우드 트레일과 EKS의 HPA등과 연계
        • EFK(Elastisearch - flunted- kibana)
      • EKS 로드맵을 참고하세요
  • 활용사례
    • 요약
    • 사례1- 스냅챗
      • 엄청난 인기로 초거대한 모노리틱 서비스가 됨
      • 마이크로 서비스를 구현하고자 함 - Kube로 가길 결정 - 관리의 용이성을 위해 관리형 서비스 선택
      • 7500 vCPU 를 쓸정도로 크게 만듦
    • 사례2 - State Street (미국 유명 은행)
      • 무제한의 컨시스턴시와 트랜젝션을 감당하는 데이터베이스를 구축하고자 함
      • EKS의 확장성을 활용 - 1초에 수백만 쿼리 달성
    • 사례3 - Fidelity(금융회사)
      • 수천개의 애플리케이션과 8백개의 DevOps팀
      • 비용대비 효과를 추구
      • 클라우드 파운드리를 해보려 했지만, 결국 컨테이너 기반으로 선택
      • 사진의 동그라미가 데브옵스 조직
        • EKS 어드민(아래) : EKS 관리, 권한, 백업, DR등
        • DevOps(맨 왼쪽) : 어플리케이션을 개발 배포
        • SRE(맨 오른쪽) : 서비스 안정화 - 로그/메트릭/KPI 지표 관리
      • 플렛폼 체계 (자체 운영 기준을 세움)
        • 네임스페이스 로 나누어 관리(관리용, 애플리케이션용)
        • 사진
        • AWS IAM role을 EKS RBAC과 연계
        • 자체적으로 EKS매니저 도구를 만들어서 부트스트랩핑으로 관리 구축
          • ADM그룹, Helm등
      • 모니터링
        • 이벤트를 4가지로 분류
          • 인프라(EC2, Network)
          • 매니지먼트(관리형 서비스의 이벤트)
          • 이벤트 - Kube의 이벤트
          • 애플리케이션
        • 클러스터 구축시 함께 구축(설정)

MongoDB Atlas

  • 고객들이 원하는 데이터베이스
    • 쉽고
    • 플렉시블
    • 빠르고
    • versatile(다양한 쿼리, 데이터 지원)
    • 시장에서 원하는 특징
      • json : 프론트엔드 - 백엔드 - 데이터베이스 간 동일한 포맷(Or mapping이 필요 없음)
      • 데이터가 커지면 테이블을 수정할 수 없음(거의 불가능)
      • 다양한 값을 받다보면 유연하게 바꾸기 힘듦
      • 불필요한 조인과 분리가 없어짐
      • 그러나, json의 경우 인덱싱이 어려움 - 확정적이지 않고 파싱이 어려움
      • 몽고디비는 이 부분에 대해서 선도
    • 데이터를 효과적으로 저장하는 방법
      • 미션 크리티컬 한 것은 - 오라클이 대부분 장악
        • 비싸다, 스케일 아웃이 어렵다(논리적으로 쪼개둔 것을 각각 확대하기가 어려움)
      • 몽고디비는 레플리카로 HA지원
        • 3개 이상의 복제
      • 샤딩이란 아키텍처로 분산 저장 - 스케일러블
      • 동일한 클러스터를 서로 간섭없이 운영/분석 - 워크로드 아이솔레이션
      • 글로벌 비즈니스 시 로컬리티 - 거버넌스(GDPR), 지연(레이턴시) 특성을 고려
  • 해답은 몽고디비 아틀라스
    • 관리형 서비스
    • 타임투 마켓, 비즈니스 모델에 집중 - 매니지드 서비스가 유리 (자체 운영/개발 시 눈에 보이지 않는 비용)
    • 6가지 특성(장점)
      • 사진
      • 셀프 서비스, 엘라스틱 스케일링
      • 고가용성, 높은 보안 인증
      • 엔터프라이즈 지원 - SLA, LDAP
      • 모니터링 도구, 서드파티가 부족한 NoSQL - 100여가지 매트릭을 실시간으로 제공
      • 백업 - 콜드/핫, 시점 두 가지 다 지원 (모든 백업을 클라우드 스냅샷으로 변경예정 - 2019 06)
      • Stitch: 서버리스 플랫폼 서비스, Firebase와 비슷 - 단순한 API를 위한 서버리스I, 일부 보호된 데이터만 프론트로 제공
    • 아마존 호환
      • 16개 리전 지원
    • 글로벌 클러스터
      • 국가, 지역별 정부의 데이터 정책이 다름
      • 리드 클러스터는 다른 지역에 배치하는 등, 글로벌 분산
      • 멀티 리전 레플리케이션 구성(HA 구성 가능) : ex)도쿄는 컨텐츠, 서울은 페이먼트
        • Electable node
          • primary가 될 수 있는 노드
        • Read only node
          • 레이턴시 해결을 위한 노드
        • Analytic node
    • 실시간 모니터링
      • 지금 던진 쿼리의 영향 파악
      • hottest collection
      • slowest operation
    • 파인 그래인드 모니터링 & 경고
      • 100가지 이상의 매트릭
    • 성능 어드바이저
      • 권장사항을 제공해 줌
      • 성능향상, 비용 절감 도움
    • 보안 : 고객전용 VPC
      • VPC peering 제공
  • 고객사례
    • 뱅크샐러드
  • 향후 몽고디비 처럼 Object Storage를 쿼리할 수 있는 서비스 출시 예정
  • AWS DocumentDB보다 나은점?
    • API만 에뮬레이팅 한 것보다 낫다
    • 차이점과 기능은 부스에서…

EKS통한 차량 공유서비스 ‘타다’ 구축기

  • 여러 세션에서 많이 뵌 분… VCNC GitHub.io/ditto
    • 비트윈 개발자
    • 실시간 호출, 예약 서비스 제공
  • 아키텍처 / EKS 사용 경험(kops -> EKS 경험)
  • 기술 선택 배경
    • 빠른 시장 변화
    • 짧은 초기개발 시간(4개월만에 개발)
    • 기존 기술(비트윈)의 반면 교사
      • HBase + Haeinsa
      • RPC/메시징, 로그 수집 : 인하우스 프레임워크(자체개발)
      • 덜 중요한 문제에 시간 낭비, 낡기 쉬움(지속적 개선이 안됨)
    • 흔하고 성숙된 기술을 선택
      • MySQL, Spring Boot, Redis
      • gRPC, Kuber, Kotlin
      • AWS 관리형 서비스: 오로라, 엘라스티서치, 클라우드와치 등
    • 느리고 복잡합 패포 해결
      • 기존 : 많은 서비스, 다양한 기술 스택 -> Ansible + Packer -> 작은 서비스는 묶어서 배포하기 위해 수작업 필요, 서비스간 영향
      • 개선 : 기술 스택 통일, 컨테이너, 컨테이너 오케스트레이션(kuber)
  • 타다의 서비스 구성
    • 클라이언트 : 고객 / 드라이버 2가지 앱
    • 백앤드 : API서버 + 오로라 MySQL
    • 실시간 이벤트 처리 : gRPC 서버 - Redis (publish-subscriber 패턴)
      • 클라이언트 -(이벤트 구독)-> gRPC 서버
      • gRPC서버는 Redis의 토픽 구독
      • API서버나 각종 워커가 Redis로 이벤트 퍼블리시
    • gRPC 특징 - 오픈소스, 다양한 언어지원, HTTP/2 기반, 적은 데이터 전송량, 스트리밍 지원
    • 위치수집 : 드라이버 앱이 주기적으로 위치수집 서버에 GPS정보 전송 - Kinesis Stream에 넣음(Kinesis가 죽지 않는 한 데이터가 저장됨) - 트래커 서버가 읽어 오로라 MySQL기반 DB에 저장 (Kinesis를 중간에 둠으로써 샤딩, Stateful한 데이터를 동일한 컨슈머에 전달하는 특성)
      • 중간에 부정확한 GPS 보정기능을 넣어 효율적인 처리
    • 차량 호출 : API 서버에 요청, API서버는 SQS에 요청을 쌓음(매칭되는 동안 클라이언트에게 응답을 해주기 위해) - 디스패처 서버에서 트래커디비와 메인 디비를 조회해서 매칭
    • 사용자 행동 로그 수집 : 로그백의 Kinesis appender가 Kinesis stream에 넣음 - Firehose가 이를 가져가서 S3에 저장, 아테나? CloudWatch logs insight?(잘 못봄?) 가 분석
    • 이런 서비스 서버들은 쿠버에서 동작하고, 아마존 관리형 서비스와 연결
      • 서버간에는 직접 통신하지 않음
  • 타다의 EKS 활용
    • 미국리전에만 출시 - 한국에 출시되기 까지 kops로 구축
    • 서울리전에 출시되자마자 마이그레이션
    • 쿠버네티스의 구성 설명
      • 마스터노드와 워커노드(kublet이 pod관리)
    • 마스터 노드는 HA를 유지해야 함 - EKS가 해결
    • 워커노드는 EKS최적화 AMI가 있음, autoscaling group 활용
    • ECS와 유사
    • 기본설정
      • AWS IAM기반 kube api서버 인증
      • ENI기반 네트워킹 플러그인(CNI?)
        • 참고: 노드당 ENI 갯수 제한있음(C5=25개)
    • 마이그레이션 절차
      • 기존 서버 클러스터와 EKS의 서버 클러스터를 함께 띄움
      • Route53의 weighted routing으로 기존 클러스터에서 서서히 옮겨옴
      • Kube 뿐아니라 RDS와 Redis도 AZ 두개로 동작 -> EKS 도 동일한 AZ(별도의 subnet)으로 생성
        • helm(패키지 매니저)의 차트로 그대로 생성
          • 기반서비스(nginx, fluentd)
          • 이후 서버, 프론트엔드 설치
      • 각 클러스터는 NLB로 맞이함, Route53에서 가중치를 두고 NLB로 분배
        • 100% 옮긴 후 기존 클러스터 제거
        • 그러나 DNS캐쉬를 대응하기 위해 NLB는 남겨두고 NLB의 대상을 새 클러스터로 수정
        • 기존 클러스터는 테라폼이었음 - 간단하게 종료
      • 상용환경을 위한 서비스
        • Ingress controller
          • 내부 서비스를 외부로 노출시켜 줌
          • (인터페이스라)실제 설치를 해야 동작을 함
          • Nginx Ingress controller 또는 AWS ALB Ingress controller
            • aws : 인그래스 1개당 ALB 1개 생성, gRPC 미지원
            • nginx : nginx 서버 기반, gRPC지원, 외부 로드밸런서 필요
        • 로드밸런서
          • Classic ELB (HTTP)
          • Classic ELB (TCP)
          • ALB : HTTP/2 지원하지만 gRPC미지원
          • NLB : TLS termination지원하지만, HTTP/2, gRPC 미지원 - nginx에서 TLS처리 (인증서 사야됨)
          • 그래서
            • NLB + nginx
            • nginx gRPC모듈
            • nginx에서 TLS 처리
        • 모니터링, 로깅
          • 컨테이너 사라지면 로그 삭제, 용량 커져도 곤란
          • fluentd : 로컬에 저장된 로그파일을 클라우드 와치 록스로 전달 - CloudWatch logs insight로 분석
          • EC2의 CloudWatch 매트릭은 의미 없음 - 프로메테우스 솔루션 사용
        • kube2iam 사용
          • 팟마다 다른 iam 프로파일을 사용하기 위함
      • VCNC 기술 블로그 : engineering.vcnc.co.kr