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당 스트림마다 비용 발생
- Privisioned mode
- 보안
- 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개 배치까지 처리 가능
- Shared (Classic) Fan-out Consumer
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
'Programming' 카테고리의 다른 글
[AWS, Certified Developer Associate] CloudWatch, EventBridge (0) | 2024.05.27 |
---|---|
[AWS, Certified Developer Associate] Kinesis Data Firehose, Kinesis Data Analytics (0) | 2024.05.24 |
[AWS, Certified Developer Associate] SQS, SNS (0) | 2024.05.18 |
[AWS, Certified Developer Associate] CloudFormation (0) | 2024.05.15 |
[AWS, Certified Developer Associate] Elastic Beanstalk (0) | 2024.05.13 |