본문 바로가기

Cloud/AWS

[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) 샤드 스케일린(샤드 분할) : 샤드를 분할하여 처리량을 증가시킨다.