[AWS Developer Associate] AWS Kinesis 정리
Kinesis란?
Kinesis는 스트리밍 데이터를 실시간으로 수집, 처리 분석하도록 도와준다.
실시간 데이터 : 애플리케이션 로그, 지표, 웹사이트 클릭스트림, IoT 원격데이터 등.
Kinesis를 구성하는 4개의 서비스
1. Kinesis Data Streams : 데이터 스트림을 입력, 처리하고 저장
2. Kinesis Data Firehose : 데이터 스트림을 AWS 내부 또는 외부의 데이터 스토어로 로드
3. Kinesis Data Analytics : SQL 언어 또는 Apache Flink를 통해 데이터 스트림을 분석
4. Kinesis Video Streams : 비디오 스트림을 입력, 저장, 처리
[Kinesis Data Streams]
시스템에 빅데이터를 스트리밍하는 방법
- Kinesis Data Streams 는 번호가 매겨진 여러 샤드로 구성된다. (샤드는 사전에 프로비저닝되어 있어야 한다.)
- Kinesis Data Streams 를 시작할 때 미리 N개의 샤드가 있는 스트림을 만들고, 모든 샤드에 걸쳐 데이터가 분할되고 샤드가 수집 및 소비율에 맞춰 스트림 용량을 정의한다.
- 여러 형태의 생산자(Producer)가 Kinesis Data Streams에 데이터를 보낸다.
-> 생산자 : 애플리케이션, 클라이언트, SDK 등등
- 생산자들은 SDK에 의존해 Kinesis Data Streams 레코드를 생성
** Kinesis Data Streams 레코드
1) 파티션 키 : 레코드가 어느 샤드로 갈지 정의
2) 최대 1MB 값을 가지는 데이터 블롭 : 값 자체
- 생산자에서 Kinesis DataStreams로 데이터를 보낼 때, 샤드당 1MB/sec로 데이터가 전송된다.
- Kinesis DataStreams에 있는 데이터를 많은 소비자가 소비할 수 있다.
Kinesis Data Streams의 속성
1) 보유 기간을 설정할 수 있다.(1일 ~ 365일)
2) 기본적으로 데이터를 재처리하거나 반복할 수 있다.
3) Kinesis에 삽입된 데이터는 삭제가 불가능하다(immutability)
4) Kinesis Data Streams로 데이터를 보내면 파티션 키가 추가된는데 같은 파티션 키를 공유하는 메시지는 동일한 샤드로 이동해 키 기반 순서를 제공
5) 생산자는 AWS SDK Kinesis Producer Library(KPL) Kinesis Agent를 사용해 데이터를 전송할 수 있다.
6) 소비자는 직접 작성 가능
7) 용량 모드
- 프로비저닝 모드
: 몇 개의 샤드 프로비저닝을 선택한 후 수동 혹은 API를 사용해 확장
- 온디멘드 모드
: 용량이 수요에 맞춰 시간 흐름에 따라 조정된다.
-> 지난 30일간의 피크 처리량에 기반해 오토 스케일링이 수행된다.
8) CloudTrail로 모든 API 호출을 모니터링 가능
[Kinesis Data Streams 보안]
- 리전 내에서만 배포
- IAM 정책을 사용해 샤드 생성 및 읽기에 대한 액세스 제어
HTTPS를 이용한 전송 중 암호화 및 KMS 를 이용한 저장 중 암호화
- 클라이언트 측 암호화/복호화 가능
- VPC 엔드 포인트도 Kinesis에 적용 가능 : 인터넷을 거치지 않고 프라이빗 서브넷의 EC2 인스턴스에서 직접 Kinesis에 액세스가 가능
[Kinesis에서 데이터를 가져오는 방법(Kinesis생산자 사용)]
- AWS SDK : 간단한 생산자
- Kinesis Producer Library(KPL) 사용 : SDK 위에 구축되며, 배치 처리, 압축, 재시도 등의 고급 기능을 API로 사용 사능
- Kinesis Agent : Kinesis 생산자 라이브러리 위에 구축되어 있으며 로그 파일을 모티러링하고 Kinesis Data Streams에 이들을 스트리밍할 때 사용
- Kinesis 에 데이터를 보내는 API : PutRecord API
- 해쉬 함수를 거친 파티션 키를 통해 어느 샤드로 보내질 지 결정한다.
- 핫 파티션 키를 피하려면 파티션 키를 잘 분배해야 한다.
-> 하나의 샤드의 처리량이 다른 샤드에 비해 너무 많아지고 불균형을 가져올 수 있다.
-> 분산된 파티션 키 사용
-> 그렇지 않으면 프로비저닝 처리량 초과 오류 발생!!
(ProvisionedThroughputExceeded)
: 해결 방안
1) 매우 잘 분산된 파티션 키 사용
2) 기하급수적인 백오프(exponential backoff)를 통해 재시도를 구현해서 예외 상황을 재시도할 수 있게 한다.
3) 샤드 스케일린(샤드 분할) : 샤드를 분할하여 처리량을 증가시킨다.