IT/AWS

[AWS] Kinesis Data Streams - Overview

물통꿀꿀이 2019. 2. 15. 23:13

AWS에서는 실시간 데이터 스트리밍 (Data Streaming)을 처리하기 위한 Kinesis 라는 서비스가 존재한다.

실시간 데이터를 처리하기 위해서는 내부적으로 프로비저닝 (Provisioning)이 잘 이루어져야 하는데 Kinesis는 완전 관리형 (Full Managed) 서비스로 사용자는 내부 인프라에 대해서는 신경을 쓰지 않아도 된다.


이러한 Kinesis 서비스는 아래와 같이 4 가지 기능을 제공한다.

- Video Streams

- Data Streams

- Data Firehose

- Data Analytics

서비스로서 다양한 기능을 제공하지만 이번 포스팅에서는 Data Streams에 대해서만 알아보려고 한다.

(개략적으로 알고 싶다면 https://aws.amazon.com/ko/kinesis/ 을 참조하면 된다.)


Kinesis Data Streams를 알아보기 전에 간단히 스트리밍 데이터라는 것을 알아보면 "수천 개의 데이터 소스에서 연속적으로 생성되는 작은 크기(KB 단위)의 데이터이다." 즉, 실시간으로 계속 들어오는 데이터로 순차적으로 처리해야 한다는 특징을 가진다.

때문에 Kinesis Data Streams는 말 그대로 작은 데이터를 순차적으로 처리하는 역할을 한다.


그림 1. Kinesis Data Streams Architecture


위의 그림 1을 보면 데이터 스트림의 아키텍처를 확인 할 수 있다. 크게 Producer, Consumer, Stream으로 구성된다.

Producer와 Consumer는 데이터의 생산자와 소비자 역할을 수행하며 Stream은 데이터 수집 역할을 한다. (소비자에게 전달하기 위해 데이터 전처리도 포함)

이 중 Stream에 대해 좀 더 살펴보자.


그림 2. Shard


Stream에서 먼저 Shard에 대해 알아보자. 그림 1, 2에서 확인 할 수 있듯이 Shard는 Stream 내부의 구성 단위이다. 즉, Stream을 Shard 단위로 분리된다.

이러한 Shard는 한 개당 고정된 스트림 용량을 제공하는데 아래와 같다.

- 데이터 읽기 속도 : 2 MB/초

- 데이터 쓰기 속도 : 1 MB/초

- 레코드 쓰기 : 1000 개/초

그림 3. Shard Capacity


Stream을 생성할 때 Shard를 고정해야하기(나중에 ReSharding도 가능) 때문에 Stream을 어떻게 사용할지에 대한 고민이 필요하다. (추가로 계정당 만들 수 있는 Shard의 수는 제한되어 있다.)

그렇기 때문에 AWS 측에서는 Stream에서 사용할 적절한 Shard의 값을 찾을 수 있도록 친절하게 공식을 만들어주었다. (물론 콘솔에서 자동으로 계산해 줄 수도 있다.)


# 모든 값의 단위는 KiB

- 수신(Incoming) 쓰기 대역폭 = 평균 데이터 레코드 수 * 초당 읽고 쓰는 데이터 레코드 수

- 발신(Outgoing) 읽기 대역폭 = 수신 쓰기 대역폭 * 소비자 수

- Shard의 갯수 = Max(수신 쓰기 대역폭/1024, 발신 읽기 대역폭/2048)


다음으로 자주 언급되는 레코드 (Record) 에 대해 알아보자. 레코드는 데이터의 저장 단위로 파티션 키, 시퀀스 (Sequence) 번호, 데이터 BLOB 으로 구성된다. 

(Shard에서도 볼 수 있듯이 레코드의 묶음이 Shard가 된다.) 

이 중 파티션 키의 역할은 Shard 별로 데이터를 그룹화하는데 사용된다. 즉, Kinesis Data Streams에서는 스트림을 여러 개 만들 수 있고 만들어진 하나의 스트림에서는 1 개 이상의 Shard를 구성 할 수 있다. 이 때 레코드가 어떤 스트림의 어떤 샤드에 포함되어 있는지를 판단하기 위해 사용된다*.

* 그래서 레코드를 스트림에 넣을 때는 반드시 파티션 키가 필요하다. (아래 boto3의 라이브러리 참조 - StreamName과 Data, PartitionKey는 Required)

response = client.put_record(
    StreamName='string',
    Data=b'bytes',
    PartitionKey='string',
    ExplicitHashKey='string',
    SequenceNumberForOrdering='string'
)

그리고 시퀀스 번호는 각 레코드에 대한 고유 식별자이다. 

이를 바탕으로 아래 슬라이드의 그림을 확인해 보자. (참조 URL에서 확인 할 수 있듯이 보기 좋게 잘 그려 놓은...)


그림 4. Kinesis Key Concepts


그림 4를 보면 Stream, Shard, Record의 관계를 한 눈에 확인 할 수 있다. 

- 스트림 = N 개의 Shard

- Shard = N 개의 레코드

- 레코드 = 시퀀스 번호 + 파티션 키 + 데이터 BLOB


참조

https://www.slideshare.net/frodriguezolivera/aws-kinesis-streams

https://www.slideshare.net/kj187/aws-kinesis-76591880

https://aws.amazon.com/ko/kinesis/data-streams/faqs/

- https://docs.aws.amazon.com/ko_kr/streams/latest/dev/introduction.html