Uber のテクノロジー ブログは、少ない Kafka ブローカーと少ないメモリでデータ保持を最大化することを目的とした記事「Uber での Kafka 階層型ストレージの紹介」を公開しました。これにより、さまざまなビジネス アプリケーション全体でメッセージの保持時間を長くすることができます。
一般的な解決策は、外部ストレージを手動で統合し、データを外部システムに定期的に同期することです。ただし、これには、データの保存方法の決定、同期頻度の設定、プロセスのトリガー、データのフェッチ、インデックス作成の使用など、開発とメンテナンスに多大な労力がかかります。
そこで、Uber は外部ストレージのロジックをカプセル化し、シンプルな構成でプラグアンドプレイできるソリューションを提案しました。この機能は Apache Foundation と協力して開発されており、将来のバージョンで利用可能になる予定です。
Kafka は、非常に高いスループット機能を備えた追加専用のメッセージ キュー (MQ) コンポーネントであることを理解することが重要です。 Kafka はブローカーのローカル ストレージにログを保存し、ユーザーは保持期間またはログ サイズを構成できます。以前の会社 (Lenovo) では、データを継続的に消費するために Flink を使用していました。大量のデータにより、Kafka がディスク ストレージの制限を超え、データの書き込みエラーやビジネス エラーが発生する可能性があります。コストを削減するには、より多くのマシンを導入する代わりに、保持時間を調整するしかありません。
また、古いデータを外部ストレージに保存するシステムを各社が独自に開発するとなると、膨大な開発作業が必要となります。また、同期とデータの一貫性に関して多くの問題が発生する可能性があります。
本質は、リモート ログ管理とストレージ管理を追加することでブローカーを変革することです。
RemoteLogManager: コピー、クリーニング、フェッチなど、リモート ログ セグメントのライフサイクルを管理します。
RemoteStorageManager: コピー、フェッチ、削除など、リモート ログ セグメントのアクションを管理します。リモート ログ セグメントに関連付けられたメタデータには、セグメントの開始オフセットと終了オフセット、タイムスタンプ、プロデューサー状態のスナップショット、リーダー エポック チェックポイントに関する情報が含まれます。
RemoteLogMetadataManager はこのメタデータを追跡し、各セグメントの開始位置と終了位置、およびデータの取得と管理に必要なその他の重要な情報をシステムが確実に認識できるようにします。
RemoteLogMetadataManager: 強力な一貫性を備えたリモート ログ セグメントのメタデータ ライフサイクルを管理します。
このうち、RemoteLogManager は制御コンポーネントとして機能し、ブローカーのディスクに直接接続して読み取りデータを取得します。また、リモート データをコールバックする役割も果たします。 RemoteStorageManager はデータを操作するエンティティであり、RemoteLogMetadataManager はメタデータの管理を担当します。
Kafka 階層型ストレージの 3 つのアクションの概要
セグメントをリモート ストレージにコピーしています
ログ セグメントの終了オフセット (セグメント内の最後のメッセージのオフセット) がパーティションの最終安定オフセットより小さい場合、そのログ セグメントはリモート ストレージへのコピーに適格であるとみなされます。(最終安定オフセット (LSO): 最も高いオフセット)これまでのすべてのメッセージは、すべての同期レプリカによって完全に確認され、データ損失が発生しません。)RemoteStorageManager は、ログ セグメントとそれに関連するインデックス、タイムスタンプ、プロデューサー スナップショット、およびリーダー エポック キャッシュのコピーを処理します。
リモート セグメントのクリーンアップ
リモート データは、専用のスレッド プールによって対象となるセグメントを計算することにより、定期的にクリーンアップされます。これは、ローカル ログ セグメントの非同期クリーンアップとは異なります。トピックが削除されると、リモート ログ セグメントのクリーンアップが非同期で実行され、既存の削除操作がブロックされたり、新しいトピックが再作成されたりすることはありません。
リモートストレージからセグメントを取得しています
RemoteLogManager は、RemoteLogMetadataManager を使用してメタデータ ストアを調べ、必要なオフセットとリーダー エポックに基づいてターゲットのリモート セグメントを決定します。 RemoteStorageManager を使用してセグメント内の位置を見つけ、必要なデータのフェッチを開始します。
以上がKafka の階層型ストレージ - Uber のテクノロジー ブログの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。