[Keyspace] Hot Partition - Deep Dive
Keyspace 개요
AWS Keyspace는 AWS가 제공하는 관리형 Apache Cassandra 호환 NoSQL 데이터베이스 서비스이다. 사용량에 따라 자동으로 확장되어 높은 수준의 처리량과 저장 용량을 제공하는데 있어 장점을 지닌다. 또한, Managed 서비스이기에 불필요한 운영업무(설치, 운영) 등의 작업은 AWS가 담당하여 진행해준다.
Hot Partition이란?
다량의 read/write 요청들이 테이블 내에 존재하는 특정 파티션으로만 라우팅 되는 경우 다른 파티션에 대비하여 더 많은 요청을 받게 된다. 만약, 해당 파티션에 고정적으로 할당된 성능보다 더 높은 read/write 요청들이 인입되는 경우 Throttling 현상을 겪을 수 있으며, 이러한 현상과 연관있는 파티션들을 Hot Partition이라고 부른다.
일반적으로 파티션 수는 파티션 키 개수보다 매우 적은 개수로 구성이 되어지게 된다. 그렇기에 트래픽을 다른 파티션키로 보냄에도 불구하고 동일한 파티션이 트래픽을 받게 되기도 한다.
예를들어, 파티션 키 1-100, 파티션 4개의 구성이 있다고 가정을 하자.
Partition 1: 1-20
Partition 2: 21-60
Partition 3: 61-90
Partition 4: 91-100
파티션 키 21-60에 집중적으로 요청된다면, 요청들이 다른 파티션 키를 향함에도 불구하고 특정 파티션에 몰릴 수 있는 현상이 발생한다. 임시 방편으로 파티션을 좀 더 세밀한 범위로 구성하는 방안이 있으나 장기적인 관점에서 해당 방법은 권장하지 않는다.
P1: 1-10, P2: 11-20, P3: 21-45, P4: 46-60, P5: 61-80, P6: 81-90, P7: 91-95, P8: 96-100.
또한, 테이블 레벨에서 충분한 capacity를 가지고 있음에도 불구하고 Throttling 현상은 요청량이 partition level에서의 capacity를 초과하는 경우에도 겪을 수 있다. 이유로써는 On-Demand mode에서는 Table 레벨에서의 capacity(R/W)를 자동 확장시키게 되는데, Partition은 고정적인 Capacity가 할당되어지며 Scale 되지 않기 때문이다.
※ Partition 은 3,000 Read capacity 과 1,000 write capacity 혹은 3,000 IOPS의 성능이 고정적으로 할당된다. Partition capacity는 변동될 수 없는 속성이다.
예를 들어 유저들이 채팅 기록에 접근할 때 일괄적으로 데이터를 로드할 수 있으며, 모두 한번에 데이터를 로드할 수는 없다. 쿼리문들이 특정 파티션으로 향하는 경우 해당 파티션에 대한 capacity error 로 인해 테이블의 capacity가 충분함에도 불구하고 read/write throttling 에러를 겪을 수 있다.
공식문서 내용[1]에서 확인할 수 있듯이 Throttling Exception은 capacity 에러로 인해 발생하는 것이며, 이는 table 혹은 partition 레벨에서의 capacity 에러와 연관이 있는 지표이다.
[1] https://docs.aws.amazon.com/keyspaces/latest/devguide/troubleshooting.serverless.html
해결방안
앞서 언급하였듯이 Amazon Keyspace 파티션은 초당 1000 WCU/WRU, 3000 RCU/RRU 을 지원한다. 이를 바탕으로 적합한 파티션으로 요청들이 분산될 수 있도록 데이터모델링을 구성할 필요가 있으며, 자세한 상황은 [2]에서 확인이 가능하다.
[2] https://docs.aws.amazon.com/keyspaces/latest/devguide/data-modeling.html
Cloudwatch Metric
Q. Cloudwatch 로그상에서 ReadThrottling 지표 외에 ReadThrottleEvents/StoragePartitionThroughputCapacityExceeded 도 동시에 보임. 이 지표들 역시 Hot Partition과 연관된 지표인지?
A. 그렇다.
(1) AWS에서 제공하는 한계 용량 3,000 RCU 1,000 WCU를 초과하게 될 때, StoragePartitionThroughputCapacityExceeded이 발생하게 되며 연달아 ReadThrottling, UserErrors가 발생하게 된다. 또한 이 3개의 메트릭들은 모두 상관관계가 있다.
(2) 3개 메트릭의 상관관계에 대하여
- 2-1. StoragePartitionThroughputCapacityExceeded은 ReadThrottling의 발생 유형중에 하나이다.
그렇기에 ReadThrottling >= StoragePartitionThroughputCapacityExceeded 의 관계가 성립한다. - 2-2. ReadThrottling은 UserError 발생 유형중에 하나이다.
Throttling의 유형은 여러가지이며, Throttling 자체가 UserError에 속하게 된다.
정리하면, StoragePartitionThroughputCapacityExceeded ∈ ReadThrottling ∈ UserError 의 관계가 성립한다.
그렇기에 hot partitioning 이슈가 발생하게 되면 3개의 메트릭 값은 동일하게 되는 이유이다.