시계열 워크로드를 위한 카산드라의 와이드 파티션 동적 분할
Netflix의 TimeSeries Abstraction은 Apache Cassandra를 스토리지로 사용하여 밀리초 지연 시간으로 페타바이트 규모의 시간 이벤트 데이터를 수집하고 쿼리합니다. 단일 파티션이 시간이 지남에 따라 대량의 이벤트를 축적하는 와이드 파티션은 TimeSeries 워크로드에 상당한 문제를 야기합니다. 이는 Cassandra 클러스터에서 높은 읽기 지연 시간, 타임아웃, CPU 사용량 증가 및 가비지 컬렉션 일시 중단을 초래합니다. 이를 해결하기 위해 TimeSeries 데이터는 개별 시간 청크로 분할되어 관리 가능한 세그먼트를 생성합니다.초기 프로비저닝 전략은 사용자 지정 워크로드 특성과 몬테카를로 시뮬레이션을 사용하여 최적의 인프라 및 파티션 구성을 결정하는 데 의존했습니다. 그러나 이 접근 방식은 워크로드를 알 수 없거나, 부정확하게 추정하거나, 시간이 지남에 따라 진화하거나, 데이터 이상치를 포함하는 경우 불충분했습니다. 조정을 자동화하기 위해 백그라운드 워커를 도입하여 파티션 히스토그램을 모니터링하고 관찰된 데이터 밀도를 기반으로 향후 시간 슬라이스를 동적으로 재분할했습니다. 이 Time Slice Re-Partitioning 전략은 대부분의 데이터가 유사한 와이드 파티션 동작을 보일 때 읽기 지연 시간과 타임아웃을 효과적으로 줄입니다.그러나 이 전략은 테이블 내 ID의 작은 비율만 와이드한 시나리오를 해결하지 못합니다. 이러한 경우와 호출자가 높은 지연 시간에도 불구하고 모든 데이터를 필요로 하는 경우, Dynamic Partitioning per ID가 개발되었습니다. 이 비동기 파이프라인은 읽기 작업 중에 와이드 파티션을 감지하고 투명하게 최적의 크기로 분할합니다. 이 프로세스는 감지, 계획 및 분할, 분할된 파티션으로 쿼리를 재라우팅하여 읽기를 제공하는 것을 포함합니다.감지는 구성된 바이트 임계값을 초과하는 읽기 작업이 발생할 때 이루어지며, Kafka로 이벤트를 내보냅니다. 시스템은 단순성을 위해 처음에 불변 파티션에 집중합니다. 계획 단계에서는 전체 파티션을 읽어 분할 계획을 생성하며, 체크포인팅을 사용하여 실패를 처리합니다. 분할은 이벤트 버킷을 시간 버킷에 할당하는 것과 같은 특정 전략에 데이터 분할을 위임하는 것을 포함합니다. 분할을 검증하는 것이 중요하며, 체크섬은 분할이 완료된 것으로 표시하기 전에 데이터 무결성을 보장합니다. 마지막으로 TimeSeries 서버는 인메모리 Bloom 필터를 사용하여 읽기 쿼리를 분할된 파티션으로 효율적으로 전환하여 호출자에게 거의 눈에 띄지 않게