UberエンジニアリングチームがChaperoneという名のKafkaの監査ツールを,オープンソースプロジェクトとしてリリースした。ChaperoneはUberの運用するマルチデータセンタかつ大容量のKafaにおけるデータの損失,遅延,メッセージ重複の監査と検出を可能にする。
Uberが運用するKafkaのデータパイプラインは,複数のデータセンタに渡っている。同社のシステムでは,サービスコールやイベントによるログメッセージが大量に生成されるため,スループット向上のために最適化が行われている。これらのサービスはアクティブ-アクティブモードで,データセンタを越えて稼働している。UberのKafkaパイプラインを経由するデータはバッチ処理だけでなく,リアルタイムなデータ解析にも使用される。
KafkaはuRepllicatorというツールと共に,同社のシステムのさまざまなパーツを接続するメッセージパスとして機能する。uReplicatorはKafkaのMirrorMakerのデザインを基盤とするKafkaレプリケータで,既存のKafkaクラスタのコピーを生成するために使用することができる。ログメッセージはKafkaのプロキシにプッシュされた後に集計され,そのデータセンタのローカルな“リージョナル”Kafkaクラスタにプッシュされる。コンシューマはリージョナルKafkaクラスタに加えて,複数のデータセンタのデータを保持するコンバインドKaflaセットアップからもメッセージを参照することができる。Chaperoneは,これらのメッセージをリアルタイムで監査する必要性を満足させる目的で開発された。
Chaperoneの主な仕事は,パイプラインを通過するデータの損失や遅延,あるいは重複といった異常を検出することだ。Chaperoneは4つのコンポーネントで構成されている。
- 各アプリケーションからのメッセージを収集,集計し,統計情報を監査メッセージとして出力する“AuditLibrary”。このライブラリは,“タンブリングウィンドウ(tumbling windows)”の概念を使用して情報を監査メッセージに集計した上で,専用のKafkaトピックに送信する。タンブリングウィンドウはApache Flinkなどのストリーム処理システムにおいて,ストリーミングデータをオーバーラップしないセグメントにグループ化するために使用されている。
- Kafkaからのそれぞれのメッセージすべてをコンシュームして,タイムスタンプを付加した監査メッセージを生成し,専用のKafkaトピックにプッシュする“ChaperoneService”。
- ChaperoneServiceの生成したメッセージを取得してデータベースにプッシュし,それを取得してユーザ用のダッシュボードに表示可能にする“ChaperoneCollector”。ダッシュボードではメッセージの紛失だけでなく,遅延についても検出および指摘が容易に可能だ。
- データのクエリとフェッチの可能なREST APIを公開する“WebService”。
Chaperoneの実装する上で,開発チームには, 監査データの正確性を保証する必要があった。それを実現する戦略のひとつは,各メッセージが確実に一度,監査されることを保証することだ。この目的のためにログ先行書き込み(WAL)のテクニックが使用された。WALでは,監査メッセージをChaperoneServiceからKafkaに送信する前に記録することによって,サービスがクラッシュした時のメッセージ再生を可能にする。PostgreSQLなどのデータベースで使用されている一般的なテクニックだ。
もうひとつの戦略は,監査メッセージが処理されたステージに関わらず,一貫したタイムスタンプを持つことだ。しかしこの方法では,Chaperoneの問題を完全に解決することはできないため,メッセージエンコーディングに基づいたテクニックと組み合わせて使用されている。Avroスキーマでエンコードされたメッセージについては,タイムスタンプを一定時間内に抽出することができるが,JSONメッセージを処理するためにChaperoneチームは,JSONメッセージ全体をデコードしなくてもタイムスタンプを読み取り可能なストリームベースのJSONパーザを開発した。これによって処理されたタイムスタンプは,プロキシクライアントとサーバ層で使用されている。
データ損失の検出とは別にChaperoneでは,Kafkaのデータを,オフセットではなくタイムスタンプに基づいて読み取ることが可能だ。これによってメッセージがコンシュームされているかどうかに関わらず,任意の時間範囲のメッセージを読むことができる。ユーザが読み出したメッセージのダンプが可能になることから,Chaperoneはデバッグツールとしても機能する。
ChaperoneのソースコードはGitHubで公開されている。
この記事を評価
- 編集者評
- 編集長アクション