Programming

[AWS, Certified Developer Associate] Kinesis Data Streams, Kinesis Client Library (KCL)

Kinesis

  • 스트리밍 데이터를 실시간으로 수집, 처리, 분석하도록 도와줌
    • 애플리케이션 로그, 지표, 웹사이트 클릭스트림, IoT 원격 데이터

 

Kinesis Data Streams

  • 빅데이터 스트리밍
  • 번호가 매겨진 여러 샤드로 구성 (샤드는 미리 프로비저닝 되어야함)
  • 데이터가 샤드에 분할
  • 샤드가 수집 / 소비율에 맞춰 스트림 용량 정의
  • 여러 형태의 생산자가 KDS에 데이터를 보냄
  • 데이터는 레코드 형태로 생성
    • Partition Key + 최대 1MB 데이터 볼륨
    • 파티션 키 : 레코드가 어느 샤드로 이동할지 결정
  • 여러 형태의 소비자가 레코드 수신
    • 파티션 키 + 샤드의 위치인 시퀀스 번호 + 데이터 볼륨
  • 1 ~ 365일 사이 보유기간 설정 가능
  • 데이터 재처리 가능
  • 삽입된 데이터는 삭제가 불가 (불변성, immutability)
  • 동일한 파티션키를 가지는 데이터는 같은 샤드에 위치해 정렬됨
  • 생산자 : AWS SDK, Kinesis Producer Library(KPL), Kinesis Agent
  • 소비자 : AWS SDK, Kinesis Client Library(KCL), AWS Lambda, KDF, KDA 등
  • 용량 모드 (Capacity Modes)
    • Privisioned mode
      • 몇 개의 샤드 프로비저닝 선택
      • 수동 or API를 통해 확장
      • 각 샤드는 1MB/s (or 1000 RPS) 입력 처리량
      • 각 샤드는 2MB/s 출력 처리량 (클래식 or 팬아웃 소비자)
      • 시간당 샤드 프로비저닝 비용 발생
    • On-demand mode
      • 용량을 프로비저닝하거나 관리할 필요가 없는 모드
      • 용량이 수요에 맞춰 시간 흐름에 따라 조정
      • 4MB/s (or 4000 RPS) 기본 용량 프로비저닝
      • 지난 30일간의 피크 처리량 기반 오토 스케일링 수행
      • 시간당 스트림 & 데이터 입출력 GB당 스트림마다 비용 발생
  • 보안
    • IAM 정책을 통해 샤드 생성/읽기에 대한 액세스 제어 가능
    • HTTPS 통한 전송중 암호화 가능
    • KMS 통한 저장 중 암호화 가능
    • 클라이언트 측 암호화 가능
    • VPC 엔드포인트 적용 가능 (인터넷을 거치지 않고 프라이빗 서브넷의 EC2 인스턴스에서 직접 액세스 가능)
    • CloudTrail로 API 호출 모니터링 가능

 

 

Kinesis - 생산자

  • 데이터 스트림에 레코드를 보냄
  • 데이터 레코드 구성
    • 일련번호 (샤드 내 파티션 키마다 고유)
    • 파티션 키 (레코드를 스트림에 넣을 때 필수로 지정)
    • 데이터 블롭 (최대 1MB)
  • AWS SDK : 단순한 생산자
  • KPL : C++, Java 지원, 배치성 기능 / 압축 / 재시도 등 고급기능 API로 제공
  • Kinesis Agent : 로그파일 모니터링 + KDS에 스트리밍
  • PutRecord API
  • PutRecord API 배치 기능 이용 시 비용절감 + 처리량 증가
  • 파티션키를 해시함수를 통해 특정 샤드로 보냄
    • 특정 샤드에 몰리는 hot partition 발생 시 PrivisionedThroughputExceeded 오류 발생
    • 샤드에 1MB/s or 1000 RPS를 초과함
    • sol 1.  분산된 파티션키 선정을 잘해야함
    • sol 2. 기하급수적 백오프를 통해 재시도를 구현
    • sol 3. 샤드 스케일링 (샤드 분할)

 

 

Kinesis - 소비자

  • 스트림으로부터 레코드를 가져와 처리
  • AWS Lambda, KDA, KDF, 사용자 정의 소비자 (AWS SDK), KCL
  • 사용자 정의 소비자
    • Shared (Classic) Fan-out Consumer
      • 샤드에 대해 샤드당 2MB/s 처리량 제공 (한 샤드에 컨슈머 3개일 경우 각 컨슈머당 약 666KB/s)
      • pull 모델 - 소비하는 애플리케이션이 적을 경우 유용
      • 샤드당 2MB/s 읽기 처리량 
      • 샤드 별 초당 최대 5개 GetRecords API 호출 제한
      • 지연시간 약 200ms
      • 비용 절감 시 유용
      • GetRecords API 콜을 통해 Kinesis로부터 직접 pull하고 데이터를 최대 10MB 반환
    • Enhanced Fan-out Consumer
      • 샤드에 대해 컨슈머당 2MB/s 처리량 제공
      • push 모델 - 샤드 자체에서 데이터를 소비자에게 푸시
      • 같은 스트림에서 소비하는 애플리케이션을 여러개 가질 수 있음
      • 샤드당 소비자당 2MB/s 일긱 처리량
      • 지연시간 약 70ms
      • 비용 높음
      • HTTP/2 스트리밍 방식으로 데이터 푸시
      • 데이터 스트림 당 5개의 소비자 애플리케이션 제한
        • AWS에 티켓을 올려 올릴 수 있음
      • 람다를 통해 서버 없이 데이터 소비 가능
      • 람다는 클래식 / 향상된 팬아웃 소비자 모드 모두 지원
      • 동시에 샤드 당 최대 10개 배치까지 처리 가능

 

Kinesis Client Library (KCL)

  • KDS에서 읽기 워크로드를 공유하는 분산 애플리케이션의 레코드를 읽을 때 도움을 주는 자바 라이브러리
  • 각 샤드는 KCL 인스턴스에 의해서만 읽힘
    • 4개 샤드 = 최대 4개의 KCL 인스턴스
  • 얼마나 읽었는지에 대한 진행정보를 dynamoDB에 체크포인트로 남김 (KCL 실행하는 애플리케이션은 dynamoDB 접근 IAM 액세스 필요)
    • KCL app 2개가 2개의 인스턴스에서 각각 실행중
    • KCL app 1은 샤드 1,2에서 데이터 읽음
    • KCL app 2는 샤드 3,4에서 데이터 읽음
    • KCL app 1의 장애 발생 시 DynamoDB의 체크포인트를 통해 KCL app 2가 읽기를 이어받아 재개 가능 (장애 복구)
    • 샤드 4->6개로 증가, KCL app 4개일 때 DynamoDB 체크포인트를 통해 읽기 업무 분배 (업무 분배, 스케일링)
  • EC2, Beanstalk, on-premise 서버(IAM 증명 필요) 등 다양한 곳에서 동작
  • KCL 1.x 버전은 공유된 컨슈머만 지원
  • KCL 2.x 버전은 향상된 팬아웃 컨슈머도 지원

 

 


Reference

Udemy - AWS Certified Developer Associate 시험 합격을 위한 모든 것!