Cassandra における時系列ワークロードのためのワイドパーティションの動的分割
NetflixのTimeSeries Abstractionは、Apache Cassandraをストレージとして使用し、ミリ秒単位のレイテンシでペタバイト級の時系列イベントデータを投入およびクエリします。単一のパーティションが時間の経過とともに大量のイベントを蓄積するワイドパーティションは、TimeSeriesワークロードにとって大きな課題となります。これにより、Cassandraクラスタでは読み取りレイテンシの増加、タイムアウト、CPU使用率の上昇、ガベージコレクションの一時停止が発生します。これに対処するため、TimeSeriesデータは離散的な時間チャンクにパーティション分割され、管理可能なセグメントが作成されます。初期のプロビジョニング戦略は、ユーザー指定のワークロード特性とモンテカルロシミュレーションに依存して、最適なインフラストラクチャとパーティション構成を決定していました。しかし、ワークロードが不明な場合、不正確に見積もられた場合、時間の経過とともに進化した場合、またはデータのアウトライアを含んでいた場合、このアプローチは不十分であることが判明しました。調整を自動化するために、バックグラウンドワーカーが導入され、パーティションヒストグラムを監視し、観測されたデータ密度に基づいて将来の時間スライスを動的に再パーティション分割するようになりました。このTime Slice Re-Partitioning戦略は、ほとんどのデータが同様のワイドパーティションの動作を示す場合に、読み取りレイテンシとタイムアウトを効果的に削減します。しかし、この戦略は、テーブル内のIDのごく一部のみがワイドであるシナリオには対応していません。そのようなケースでは、呼び出し元がレイテンシの上昇を伴ってもすべてのデータを必要とする場合に、Dynamic Partitioning per IDが開発されました。この非同期パイプラインは、読み取り操作中にワイドパーティションを検出し、透過的に最適なサイズに分割します。このプロセスには、検出、計画と分割、および分割されたパーティションへのクエリのリダイレクトによる読み取りの提供が含まれます。検出は、読み取り操作が設定されたバイトしきい値を超えた場合に発生し、Kafkaにイベントを発行します。システムは、簡潔さのために、最初は不変のパーティションに焦点を当てます。計画段階では、パーティション全体を読み取って分割計画を作成し、チェックポインティングを使用して障害に対処します。分割は、イベントバケットを時間バケットに割り当てるなどの特定の戦略にデータ分割を委任することを含みます。分割の検証は重要であり、チェックサムを使用して、分割が完了したとマークする前にデータの整合性を保証します。最後に、TimeSeriesサーバーはインメモリのブルームフィルタを使用して、読み取りクエリを分割されたパーティションに効率的にリダイレクトし、呼び出し元には実質的に見えないようにリダイレクトを行います。