9.10. Kafka および ZooKeeper ストレージの設定
Streams for Apache Kafka では、Kafka と ZooKeeper のデータストレージオプションを柔軟に設定できます。
サポート対象のストレージタイプは次のとおりです。
- 一時データストレージ (開発用のみで推奨されます)
- 永続ストレージ
- JBOD (Kafka のみ。ZooKeeper では使用できません)
- 階層化ストレージ (早期アクセス)
ストレージを設定するには、コンポーネントのカスタムリソースで storage
プロパティーを指定します。ストレージタイプは、storage.type
プロパティーを使用して設定されます。ノードプールを使用する場合、Kafka クラスターで使用される各ノードプールに固有のストレージ設定を指定できます。Kafka
リソースで使用できる同じストレージプロパティーは、KafkaNodePool
プールリソースでも使用できます。
階層化ストレージは、異なる特性を持つストレージタイプを並行して使用することで、データ管理の柔軟性を高めます。たとえば、階層化ストレージには次のようなものが含まれます。
- パフォーマンスとコストがより高いブロックストレージ
- パフォーマンスとコストがより少ないオブジェクトストレージ
階層化ストレージは、Kafka の早期アクセス機能です。階層化ストレージを設定するには、tieredStorage
プロパティーを指定します。階層化ストレージは、Kafka
カスタムリソースを使用するクラスターレベルでのみ設定されます。
ストレージ関連のスキーマリファレンスには、ストレージ設定プロパティーに関する詳細情報が記載されています。
Kafka クラスターをデプロイした後に、ストレージタイプを変更することはできません。
9.10.1. データストレージに関する留意事項
Streams for Apache Kafka を適切に機能させるには、効率的なデータストレージインフラストラクチャーが不可欠です。ブロックストレージを使用することを強く推奨します。Streams for Apache Kafka は、ブロックストレージでの使用についてのみテストされています。NFS などのファイルストレージはテストされておらず、動作するという保証はありません。
ブロックストレージには、以下のいずれかのオプションを選択します。
- Amazon Elastic Block Store (EBS) などのクラウドベースのブロックストレージソリューション。
- ローカル永続ボリューム を使用した永続ストレージ
- ファイバーチャネル や iSCSI などのプロトコルがアクセスする SAN (ストレージエリアネットワーク) ボリューム
Streams for Apache Kafka には OpenShift の raw ブロックボリュームは必要ありません。
9.10.1.1. ファイルシステム
Kafka は、メッセージの保存にファイルシステムを使用します。Streams for Apache Kafka は、Kafka で一般的に使用される XFS および ext4 ファイルシステムと互換性があります。ファイルシステムを選択して設定するときは、デプロイメントの基盤となるアーキテクチャーと要件を考慮してください。
詳細については、Kafka ドキュメントの Filesystem Selection を参照してください。
9.10.1.2. ディスク使用量
Apache Kafka と ZooKeeper には別々のディスクを使用します。
ソリッドステートドライブ (SSD) は必須ではありませんが、複数のトピックに対してデータが非同期的に送受信される大規模なクラスターで Kafka のパフォーマンスを向上させることができます。SSD は、高速で低レイテンシーのデータアクセスが必要な ZooKeeper で特に有効です。
Kafka と ZooKeeper の両方にデータレプリケーションが組み込まれているため、レプリケーションされたストレージのプロビジョニングは必要ありません。
9.10.2. 一時ストレージ
一時データストレージは一時的なものです。ノード上のすべての Pod は、ローカルの一時ストレージスペースを共有します。データは、それを使用する Pod が実行されている限り保持されます。Pod が削除されると、データは失われます。ただし、Pod は高可用性環境でデータを回復できます。
その一時的な性質のため、一時ストレージは開発とテストにのみ推奨されます。
一時ストレージは emptyDir
ボリュームを使用してデータを保存します。Pod がノードに割り当てられると、emptyDir
ボリュームが作成されます。sizeLimit
プロパティーを使用して、emptyDir
のストレージの合計量を設定できます。
一時ストレージは、単一ノードの ZooKeeper クラスターやレプリケーション係数が 1 の Kafka トピックでの使用には適していません。
一時ストレージを使用するには、Kafka
または ZooKeeper
リソースのストレージタイプ設定を ephemeral
に設定します。ノードプールを使用している場合は、個々のノードプールのストレージ設定で ephemeral
を指定することもできます。
一時ストレージ設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: storage: type: ephemeral # ... zookeeper: storage: type: ephemeral # ...
9.10.2.1. Kafka ログディレクトリーのマウントパス
一時ボリュームは、以下のパスにマウントされるログディレクトリーとして Kafka ブローカーによって使用されます。
/var/lib/kafka/data/kafka-logIDX
IDX
は、Kafka ブローカー Pod インデックスです。たとえば、/var/lib/kafka/data/kafka-log0
のようになります。
9.10.3. 永続ストレージ
永続的なデータストレージは、システムが中断した場合でもデータを保持します。永続的なデータストレージを使用する Pod の場合、データは Pod の障害や再起動後も保持されます。永続的な性質のため、実稼働環境には永続ストレージを推奨します。
Streams for Apache Kafka で永続ストレージを使用するには、Kafka
または ZooKeeper
リソースのストレージ設定に persistent-claim
を指定します。ノードプールを使用している場合は、個々のノードプールのストレージ設定で persistent-claim
を指定することもできます。
Pod が Persistent Volume Claim (PVC) を使用して Persistent Volume (PV) 上でストレージ要求を行うようにリソースを設定します。PV は、オンデマンドで作成され、それを使用する Pod から独立したストレージボリュームを表します。PVC は、Pod の作成時に必要なストレージの量を要求します。PV の基盤となるストレージインフラストラクチャーを理解する必要はありません。PV がストレージ基準に一致する場合、PVC は PV にバインドされます。
ストレージタイプを指定するには、次の 2 つのオプションがあります。
storage.type: persistent-claim
-
ストレージタイプとして
persistent-claim
を選択した場合、単一の永続ストレージボリュームが定義されます。 storage.type: jbod
-
ストレージタイプとして
jbod
を選択すると、一意の ID を使用して永続ストレージボリュームの配列を柔軟に定義できます。
実稼働環境では、次のように設定することを推奨します。
-
Kafka またはノードプールの場合は、1 つ以上の永続ボリュームを使用して
storage.type
をjbod
に設定します。 -
ZooKeeper の場合、単一の永続ボリュームに対して
storage.type を
persistent-claim
として設定します。
永続ストレージには、次の設定オプションもあります。
id
(任意)-
ストレージ ID 番号。このオプションは、JBOD ストレージ宣言で定義されるストレージボリュームには必須です。デフォルトは
0
です。 size
(必須)- 永続ボリューム要求のサイズ (例: 1000Gi)。
class
(任意)- PVC は、StorageClass を指定することにより、さまざまなタイプの永続ストレージを要求できます。ストレージクラスはストレージプロファイルを定義し、そのプロファイルに基づいて PV を動的にプロビジョニングします。ストレージクラスが指定されていない場合、OpenShift クラスターで default としてマークされたストレージクラスが使用されます。永続ストレージオプションには、SAN ストレージタイプまたは ローカル永続ボリューム が含まれる場合があります。
selector
(任意)- 特定の PV を指定する設定。選択したボリュームのラベルを表す key:value ペアを提供します。
deleteClaim
(任意)-
クラスターのアンインストール時に PVC を削除するかどうかを指定するブール値。デフォルトは
false
です。
既存 Streams for Apache Kafka クラスター内の永続ボリュームのサイズ拡大は、永続ボリュームのサイズ変更をサポートする OpenShift バージョンでのみサポートされます。サイズを変更する永続ボリュームには、ボリューム拡張をサポートするストレージクラスを使用する必要があります。ボリューム拡張をサポートしないその他のバージョンの OpenShift およびストレージクラスでは、クラスターをデプロイする前に必要なストレージサイズを決定する必要があります。既存の永続ボリュームのサイズを縮小することはできません。
Kafka と ZooKeeper の永続ストレージ設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false - id: 1 type: persistent-claim size: 100Gi deleteClaim: false - id: 2 type: persistent-claim size: 100Gi deleteClaim: false # ... zookeeper: storage: type: persistent-claim size: 1000Gi # ...
特定のストレージクラスを使用した永続ストレージ設定の例
# ... storage: type: persistent-claim size: 500Gi class: my-storage-class # ...
selector
を使用して、SSD などの特定の機能を提供するラベル付き永続ボリュームを指定します。
セレクターを使用した永続ストレージ設定の例
# ... storage: type: persistent-claim size: 1Gi selector: hdd-type: ssd deleteClaim: true # ...
9.10.3.1. ストレージクラスのオーバーライド
デフォルトのストレージクラスを使用する代わりに、1 つ以上の Kafka または ZooKeeper ノードに異なるストレージクラスを指定できます。これは、ストレージクラスが、異なるアベイラビリティーゾーンやデータセンターに制限されている場合などに便利です。この場合、overrides
フィールドを使用できます。
以下の例では、デフォルトのストレージクラスの名前は my-storage-class
になります。
クラスオーバーライドを使用したストレージ設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: labels: app: my-cluster name: my-cluster namespace: myproject spec: # ... kafka: replicas: 3 storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false class: my-storage-class overrides: - broker: 0 class: my-storage-class-zone-1a - broker: 1 class: my-storage-class-zone-1b - broker: 2 class: my-storage-class-zone-1c # ... # ... zookeeper: replicas: 3 storage: deleteClaim: true size: 100Gi type: persistent-claim class: my-storage-class overrides: - broker: 0 class: my-storage-class-zone-1a - broker: 1 class: my-storage-class-zone-1b - broker: 2 class: my-storage-class-zone-1c # ...
overrides
プロパティーが設定され、ボリュームによって以下のストレージクラスが使用されます。
-
ZooKeeper ノード 0 の永続ボリュームでは
my-storage-class-zone-1a
が使用されます。 -
ZooKeeper ノード 1 の永続ボリュームでは
my-storage-class-zone-1b
が使用されます。 -
ZooKeeper ノード 2 の永続ボリュームでは
my-storage-class-zone-1c
が使用されます。 -
Kafka ブローカー 0 の永続ボリュームでは
my-storage-class-zone-1a
が使用されます。 -
Kafka ブローカー 1 の永続ボリュームでは
my-storage-class-zone-1b
が使用されます。 -
Kafka ブローカー 2 の永続ボリュームでは
my-storage-class-zone-1c
が使用されます。
overrides
プロパティーは現在、ストレージ class
をオーバーライドするためにのみ使用されます。他のストレージ設定プロパティーのオーバーライドは現在サポートされていません。
9.10.3.2. 永続ストレージ用の PVC リソース
永続ストレージを使用すると、次の名前で PVC が作成されます。
data-cluster-name-kafka-idx
-
Kafka ブローカー Pod
idx
のデータを格納するために使用されるボリュームの PVC。 data-cluster-name-zookeeper-idx
-
ZooKeeper ノード Pod
idx
のデータを格納するために使用されるボリュームの PVC。
9.10.3.3. Kafka ログディレクトリーのマウントパス
永続ボリュームは、以下のパスにマウントされるログディレクトリーとして Kafka ブローカーによって使用されます。
/var/lib/kafka/data/kafka-logIDX
IDX
は、Kafka ブローカー Pod インデックスです。たとえば、/var/lib/kafka/data/kafka-log0
のようになります。
9.10.4. 永続ボリュームのサイズ変更
クラスターで使用される永続ボリュームは、ストレージインフラストラクチャーがサポートしている限り、データ損失のリスクなしにサイズ変更できます。Streams for Apache Kafka は、ストレージのサイズを変更する設定の更新に従って、ストレージインフラストラクチャーに変更を指示します。ストレージ拡張は、persistent-claim ボリュームを使用する Streams for Apache Kafka クラスターでサポートされています。
ストレージの削減は、ブローカーごとに複数のディスクを使用する場合にのみ可能です。ディスク上のすべてのパーティションを同じブローカー内の他のボリューム (ブローカー内) または同じクラスター内の他のブローカー (クラスター内) に移動した後、ディスクを削除できます。
永続ボリュームのサイズは OpenShift で現在サポートされていないため、減らすことはできません。
前提条件
- ボリュームのサイズ変更をサポートする OpenShift クラスター。
- Cluster Operator が稼働中である。
- ボリューム拡張をサポートするストレージクラスを使用して作成された永続ボリュームを使用する Kafka クラスター。
手順
クラスターの
Kafka
リソースを編集します。size
プロパティーを変更して、Kafka クラスター、ZooKeeper クラスター、またはその両方に割り当てられた永続ボリュームのサイズを増やします。-
Kafka クラスターの場合は、
spec.kafka.storage
の下にあるsize
プロパティーを更新します。 -
ZooKeeper クラスターの場合は、
spec.zookeeper.storage
の下にあるsize
プロパティーを更新します。
ボリュームサイズを
2000Gi
に増やす Kafka 設定apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... storage: type: persistent-claim size: 2000Gi class: my-storage-class # ... zookeeper: # ...
-
Kafka クラスターの場合は、
リソースを作成または更新します。
oc apply -f <kafka_configuration_file>
OpenShift では、Cluster Operator からの要求に応じて、選択された永続ボリュームの容量が増やされます。サイズ変更が完了すると、サイズ変更された永続ボリュームを使用するすべての Pod が Cluster Operator によって再起動されます。これは自動的に行われます。
クラスター上の関連する Pod のストレージ容量が増加したことを確認します。
oc get pv
ストレージが増加した Kafka ブローカー Pod
NAME CAPACITY CLAIM pvc-0ca459ce-... 2000Gi my-project/data-my-cluster-kafka-2 pvc-6e1810be-... 2000Gi my-project/data-my-cluster-kafka-0 pvc-82dc78c9-... 2000Gi my-project/data-my-cluster-kafka-1
出力には、ブローカー Pod に関連付けられた各 PVC の名前が表示されます。
関連情報
- OpenShift での永続ボリュームのサイズ変更に関する詳細は、Resizing Persistent Volumes using Kubernetes を参照してください。
9.10.5. JBOD ストレージ
JBOD ストレージを使用すると、複数のディスクまたはボリュームを使用するように Kafka クラスターを設定できます。このアプローチにより、Kafka ブローカーのデータストレージ容量が増え、パフォーマンスが向上する可能性があります。JBOD 設定は 1 つ以上のボリュームによって定義され、各ボリュームは 一時 または 永続 ボリュームのいずれかになります。JBOD ボリューム宣言のルールおよび制約は、一時および永続ストレージのルールおよび制約と同じです。たとえば、プロビジョニング後に永続ストレージのボリュームのサイズを縮小できません。また、タイプが ephemeral
の場合は、sizeLimit
の値を変更することはできません。
JBOD ストレージは Kafka でのみ サポートされ、ZooKeeper ではサポートされません。
JBOD ストレージを使用するには、Kafka
リソースのストレージタイプ設定を jbod
に設定します。ノードプールを使用している場合は、個々のノードプールのストレージ設定で jbod
を指定することもできます。
volumes
プロパティーを使用すると、JBOD ストレージアレイまたは設定を設定するディスクを記述できます。
JBOD ストレージ設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false - id: 1 type: persistent-claim size: 100Gi deleteClaim: false # ...
JBOD ボリュームが作成されると、ID を変更することはできません。JBOD 設定からボリュームを追加または削除できます。
9.10.5.1. JBOD ストレージの PVC リソース
永続ストレージを使用して JBOD ボリュームを宣言すると、次の名前の PVC が作成されます。
data-id-cluster-name-kafka-idx
-
Kafka ブローカー Pod
idx
のデータを格納するために使用されるボリュームの PVC。id
は、Kafka ブローカー Pod のデータを格納するために使用されるボリュームの ID になります。
9.10.5.2. Kafka ログディレクトリーのマウントパス
JBOD ボリュームは、以下のパスにマウントされるログディレクトリーとして Kafka ブローカーによって使用されます。
/var/lib/kafka/data-id/kafka-logidx
id
は、Kafka ブローカー Pod idx
のデータを保存するために使用されるボリュームの ID に置き換えます。たとえば、/var/lib/kafka/data-0/kafka-log0
のようになります。
9.10.6. JBOD ストレージへのボリュームの追加
この手順では、JBOD ストレージを使用するように設定されている Kafka クラスターにボリュームを追加する方法を説明します。この手順は、他のストレージタイプを使用するように設定されている Kafka クラスターには適用できません。
以前使用され、削除された id
の下に新規ボリュームを追加する場合、以前使用された PersistentVolumeClaims
が必ず削除されているよう確認する必要があります。
前提条件
- OpenShift クラスター
- 稼働中の Cluster Operator
- JBOD ストレージのある Kafka クラスター。
手順
Kafka
リソースのspec.kafka.storage.volumes
プロパティーを編集します。新しいボリュームをvolumes
アレイに追加します。たとえば、id が2
の新しいボリュームを追加します。apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false - id: 1 type: persistent-claim size: 100Gi deleteClaim: false - id: 2 type: persistent-claim size: 100Gi deleteClaim: false # ... zookeeper: # ...
リソースを作成または更新します。
oc apply -f <kafka_configuration_file>
新しいトピックを作成するか、既存のパーティションを新しいディスクに再度割り当てます。
ヒントCruise Control は、パーティションを再割り当てするための効果的なツールです。ブローカー内のディスク分散を実行するには、
KafkaRebalance.spec
でrebalanceDisk
をtrue
に設定します。
9.10.7. JBOD ストレージからのボリュームの削除
この手順では、JBOD ストレージを使用するように設定されている Kafka クラスターからボリュームを削除する方法を説明します。この手順は、他のストレージタイプを使用するように設定されている Kafka クラスターには適用できません。JBOD ストレージには、常に 1 つのボリュームが含まれている必要があります。
データの損失を避けるには、ボリュームを削除する前にすべてのパーティションを移動する必要があります。
前提条件
- OpenShift クラスター
- 稼働中の Cluster Operator
- 複数のボリュームがある JBOD ストレージのある Kafka クラスター
手順
削除するディスクからすべてのパーティションを再度割り当てます。削除するディスクに割り当てられたままになっているパーティションのデータは削除される可能性があります。
ヒントkafka-reassign-partitions.sh
ツールを使用してパーティションを再割り当てできます。Kafka
リソースのspec.kafka.storage.volumes
プロパティーを編集します。volumes
アレイから 1 つまたは複数のボリュームを削除します。たとえば、ID が1
と2
のボリュームを削除します。apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false # ... zookeeper: # ...
リソースを作成または更新します。
oc apply -f <kafka_configuration_file>
9.10.8. 階層化ストレージ (早期アクセス)
階層化ストレージは、ログセグメントを別のストレージシステムに移動することで、Kafka データを管理するための柔軟なアプローチを導入します。たとえば、頻繁にアクセスされるデータに対してブローカー上のブロックストレージの使用を組み合わせ、データのアクセス性と耐久性を損なうことなく、古いデータやアクセス頻度の低いデータをブロックストレージから Amazon S3 などのよりコスト効率が高くスケーラブルなリモートストレージソリューションにオフロードできます。
階層化ストレージは Kafka の早期アクセス機能であり、Streams for Apache Kafka でも利用できます。現在の制限 により、実稼働環境では推奨されません。
階層化ストレージでは、Kafka とリモートストレージシステム間の通信を処理するために Kafka の RemoteStorageManager
インターフェイスの実装が必要です。これは、Kafka
リソースの設定によって有効になります。Streams for Apache Kafka は、カスタムの階層化ストレージが有効な場合、Remote Log Metadata Management (RLMM) に Kafka の TopicBasedRemoteLogMetadataManager
を使用します。RLMM は、リモートストレージに関連するメタデータを管理します。
カスタムの階層化ストレージを使用するには、次の手順を実行します。
- カスタムコンテナーイメージをビルドして、Streams for Apache Kafka イメージに Kafka 用の階層化ストレージプラグインを含めます。プラグインは、Streams for Apache Kafka によって管理される Kafka クラスターが階層化ストレージソリューションと対話するために必要な機能を提供する必要があります。
-
Kafka
リソースのtieredStorage
プロパティーを使用して、階層化ストレージ用に Kafka を設定します。カスタムRemoteStorageManager
実装のクラス名とパス、および追加の設定を指定します。 - 必要に応じて、RLMM 固有の階層化ストレージ設定を指定します。
Kafka のカスタム階層化ストレージ設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: tieredStorage: type: custom 1 remoteStorageManager: 2 className: com.example.kafka.tiered.storage.s3.S3RemoteStorageManager classPath: /opt/kafka/plugins/tiered-storage-s3/* config: storage.bucket.name: my-bucket 3 # ... config: rlmm.config.remote.log.metadata.topic.replication.factor: 1 4 # ...
- 1
type
はcustom
に設定する必要があります。- 2
- クラス名とパスを含むカスタム
RemoteStorageManager
実装の設定。 - 3
- カスタム
RemoteStorageManager
実装に渡す設定。Streams for Apache Kafka によってrsm.config.
という接頭辞が自動的に付けられます。 - 4
- RLMM に渡す階層型ストレージ設定。
rlmm.config.
の接頭辞が必要です。階層化ストレージ設定の詳細は、Apache Kafka のドキュメント を参照してください。