Shard
1 Kinesis Data Streams의 Shard
- Kinesis Data Streams는 대규모 데이터 스트리밍을 처리하기 위한 서비스입니다.
- 스트림 데이터는 여러 개의 샤드(shard)로 분할되어 병렬 처리됩니다.
- 샤드는 Kinesis Data Streams의 핵심 구성 요소 중 하나입니다.
2 Shard의 개념
- Shard는 Kinesis Data Streams에서 데이터 레코드를 저장하고 처리하는 기본 단위입니다.
- 각 샤드는 고정된 용량을 가지고 있으며, 읽기 및 쓰기 용량이 제한됩니다.
- 데이터를 스트림에 넣으면 특정 샤드에 할당되며, 소비자는 해당 샤드에서 데이터를 읽어 처리합니다.
2.1 Shard의 특성
- 각 샤드는 초당 1MB의 쓰기 용량과 2MB의 읽기 용량을 가집니다.
- 또한, 각 샤드는 초당 최대 1,000개의 PUT 레코드를 처리할 수 있습니다.
- Shard의 읽기 용량은 초당 5개의 GET 요청과 2개의 레코드 반환으로 제한됩니다.
2.2 Shard의 구성
- Kinesis 스트림은 하나 이상의 샤드로 구성될 수 있으며, 스트림의 용량은 샤드의 개수에 따라 결정됩니다.
- 필요에 따라 샤드를 추가하거나 제거하여 스트림의 용량을 조절할 수 있습니다.
- 샤드를 추가하면 스트림의 쓰기 및 읽기 용량이 증가하고, 샤드를 제거하면 용량이 감소합니다.
3 Shard의 데이터 분할
- 데이터를 샤드에 분배하기 위해 Kinesis는 파티션 키(partition key)를 사용합니다.
- 파티션 키는 데이터를 샤드에 균등하게 분배하는 데 사용되는 문자열 값입니다.
- Kinesis는 파티션 키의 해시 값을 계산하여 데이터를 특정 샤드에 할당합니다.
3.1 파티션 키의 중요성
- 파티션 키를 통해 데이터를 효과적으로 분산시켜 각 샤드의 부하를 균등하게 할 수 있습니다.
- 파티션 키를 잘못 설정하면 특정 샤드에 부하가 집중될 수 있으므로, 키를 적절히 선택하는 것이 중요합니다.
3.2 파티션 키 사용 예시
import boto3
kinesis_client = boto3.client('kinesis')
response = kinesis_client.put_record(
StreamName='my-stream',
Data=b'{"key":"value"}',
PartitionKey='partition-key-1'
)
- 위 예시에서
partition-key-1
은 파티션 키로 사용되며, 이 키의 해시 값에 따라 데이터가 샤드에 할당됩니다.
3.3 파티션 키 선택 시 고려사항
- 데이터의 균등 분포: 파티션 키를 선택할 때 데이터가 균등하게 분산되도록 해야 합니다.
- 키의 다양성: 너무 적은 수의 파티션 키를 사용하면 특정 샤드에 부하가 집중될 수 있습니다.
- 해시 충돌 방지: 해시 충돌이 발생하지 않도록 파티션 키를 잘 설계해야 합니다.
- 동일 파티션 키 데이터 순서 보장: 동일한 파티션 키를 가진 데이터는 동일한 샤드에 할당되어 순서가 보장됩니다.
4 Shard의 확장과 축소
- 스트림의 트래픽이 증가하거나 감소함에 따라 샤드를 확장하거나 축소할 수 있습니다.
- Kinesis는 샤드를 병합(merge)하거나 분할(split)하여 스트림의 용량을 조절할 수 있습니다.
4.1 Shard 병합
aws kinesis merge-shards --stream-name my-stream --shard-to-merge shardId-000000000000 --adjacent-shard-to-merge shardId-000000000001
- 두 개의 샤드를 병합하여 하나의 샤드로 만드는 과정입니다.
- 병합을 통해 샤드의 수를 줄이고, 스트림의 용량을 축소할 수 있습니다.
- 샤드를 병합하면 원래의 두 샤드는 더 이상 데이터를 수집하지 않으며, 데이터 보관 기간(retention period)이 끝나면 자동으로 삭제됩니다.
- 이는 샤드 병합 후에 스트림 내 불필요한 샤드가 남지 않도록 보장합니다.
- 기본적인 데이터 보관 기간은 24시간에서 최대 7일로 설정할 수 있습니다.
- 샤드를 병합할 때는 항상 두 개의 샤드만을 하나의 새로운 샤드로 병합할 수 있습니다.
- 세 개 이상의 샤드를 병합하려면 여러 번의 병합 작업을 수행해야 합니다.
- 예를 들어, 세 개의 샤드를 하나로 병합하려면 두 개의 샤드를 먼저 병합한 후, 남은 샤드와 다시 병합해야 합니다.
4.2 Shard 분할
aws kinesis split-shard --stream-name my-stream --shard-to-split shardId-000000000000 --new-starting-hash-key 170141183460469231731687303715884105728