Kafkaの圧縮は、基本的にProducerのレコードバッチ単位で適用され、Brokerはそのまま保存・複製します。例外として、トピック側でcompression.typeを明示するとBrokerが再圧縮する場合があります。
本記事では、アルゴリズムごとの特性、設定パターン、監視・検証方法をまとめ、最後にCCDAK/CCAAKで頻出の論点を整理します。
Kafkaでは、Producerがレコードをバッチ化し、compression.typeに基づいてバッチごとに圧縮します。Brokerは圧縮済みバッチをほぼそのままログに書き、レプリケーションも圧縮済みのバイト列で行われます。Consumerは取得時にクライアントライブラリが展開します。
トピック設定のcompression.typeがproducerの場合、Producerが選んだ圧縮方式のまま保存されます。gzip/snappy/lz4/zstdなど具体的な値を設定した場合、Brokerは受信時に再圧縮するためCPU負荷とレイテンシが増えます。圧縮対象はレコードバッチであり、バッチが大きいほど一般に圧縮効率は向上します。
サイズ制限は圧縮後サイズに適用されます。具体的には、Producerのmax.request.size、Broker/トピックのmessage.max.bytes(またはmax.message.bytes)は圧縮後のレコードバッチサイズで評価されます。
| アルゴリズム | 典型的圧縮率 | 速度(圧縮/展開) | レイテンシ傾向 |
|---|---|---|---|
| gzip | 高 | 低 / 中 | 高(遅い) |
| snappy | 中 | 高 / 高 | 低(速い) |
| lz4 | 中〜高 | 非常に高 / 高 | 低(非常に速い) |
| zstd | 高〜非常に高 | 中〜高 / 中〜高 | 中(設定やデータ次第) |
Producer圧縮とBroker保存の流れ(トピック設定による分岐)
Producer
|
| 1) バッチ化 + 圧縮(compression.type)
v
[圧縮済みレコードバッチ]
|
|--> トピック compression.type = producer の場合 ---------
| |
v v
Broker へ送信 ------------------------------> ログにそのまま保存
|
|--> トピック compression.type = gzip/lz4/... の場合 ----
|
v
Brokerで再圧縮
|
v
ログに保存
|
v
レプリケーション(圧縮済みのまま)
|
v
Consumer が展開主要な圧縮タイプ(Producerのcompression.type)
none
gzip
snappy
lz4
zstdテキストや繰り返しの多いJSON/Avroは圧縮効果が高く、バイナリや既に圧縮済みのデータ(画像/動画/ZIP)は効果が薄いか悪化します。バッチが小さい場合、どの方式でも効果は限定的です。
低遅延・高スループット重視ならlz4かsnappyが無難です。ネットワーク帯域がボトルネックでCPUに余裕があるならzstdが有利です。gzipは高圧縮ですが遅いので、遅延許容か夜間バッチ等に向きます。
混在環境では、トピックcompression.type=producerとしてProducerごとに最適化するか、全体で統一したい場合は各Producer側を同一に合わせるのがベストです(トピック側で固定するとBroker再圧縮が発生します)。
Java Producerでの基本設定例
Properties p = new Properties();
p.put("bootstrap.servers", "broker1:9092,broker2:9092");
p.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
p.put("value.serializer", "org.apache.kafka.common.serialization.ByteArraySerializer");
// 圧縮方式を選択
p.put("compression.type", "lz4");
// バッチとレイテンシのトレードオフ
p.put("batch.size", "131072"); // 128KB 目安
p.put("linger.ms", "10"); // 10ms 待ってバッチ化
KafkaProducer<String, byte[]> producer = new KafkaProducer<>(p);原則として、圧縮方式はProducerで決め、トピックのcompression.typeはproducerのままにします。これによりBrokerの再圧縮を避け、CPUと待ち時間を節約できます。
全Producerで統一が難しく、監査や帯域制限の理由で統一したい場合のみ、トピック側に具体的な方式(gzip/snappy/lz4/zstd)を設定します。その場合はBrokerのCPUと遅延上昇を見込み、リソース計画とスロークライアントの影響評価を行います。
TLSやSASLを使う場合でも、圧縮は暗号化の前に適用されます。したがってネットワーク帯域の節約効果は残ります。
トピック設定の具体例(Broker側CLI)
# 既存トピックをProducer優先に(再圧縮を避ける)
kafka-configs --bootstrap-server localhost:9092 \
--entity-type topics --entity-name orders \
--alter --add-config compression.type=producer
# 統一したい場合にlz4で固定(再圧縮が発生)
kafka-configs --bootstrap-server localhost:9092 \
--entity-type topics --entity-name orders \
--alter --add-config compression.type=lz4
# 新規作成時にproducerのままで作成
kafka-topics --bootstrap-server localhost:9092 \
--create --topic events --partitions 12 --replication-factor 3 \
--config compression.type=producer圧縮はCPUとレイテンシのコストを伴います。導入時は、性能試験ツールとメトリクスで、CPU使用率、BytesIn/Out、リクエストレイテンシ(RequestQueueTime/LocalTime/RemoteTime)を確認します。再圧縮がある場合はBroker CPUの跳ね上がりに注意します。
テナント混在のクラスタでは、重い圧縮(gzip/zstd)を使うProducerのピークが他ワークロードに影響しないよう、スループット制御やクォータ、送信バッチ調整を併用します。
Consumer側の展開もCPUを使うため、消費側の遅延やGC、スループット低下がないかを併せて監視します。
性能検証例(kafka-producer-perf-test)
# lz4で送信(1KBメッセージ、100万件)
kafka-producer-perf-test --topic perf --num-records 1000000 \
--record-size 1024 --throughput -1 --producer-props \
bootstrap.servers=localhost:9092 compression.type=lz4 batch.size=131072 linger.ms=10
# zstdで送信(帯域重視)
kafka-producer-perf-test --topic perf --num-records 1000000 \
--record-size 1024 --throughput -1 --producer-props \
bootstrap.servers=localhost:9092 compression.type=zstd batch.size=131072 linger.ms=20実務選定のコアは、遅延SLA・CPU・帯域のどれがボトルネックかを明確にすることです。次の簡易ガイドを基に社内の代表ワークロードで検証してください。
試験では、圧縮の適用箇所(Producer中心)、トピック側のproducer指定で再圧縮を回避、レプリケーションが圧縮済みで行われる点、バッチ設定と圧縮効率の関係が頻出です。zstd/lz4の使い分けも問われます。
圧縮方式チートシート
snappy: 速い/圧縮率中/CPU低 → 低遅延
lz4: さらに速い/圧縮率中-高/CPU低-中 → デフォルト候補
zstd: 圧縮率高/CPU中-高 → 帯域重視
gzip: 圧縮率高/CPU高/遅い → バッチ系・遅延許容
Topic: compression.type=producer(再圧縮回避)
Producer: compression.type=<上記いずれか>
Batching: batch.size↑ + linger.ms↑ → 圧縮率↑(遅延↑)CCDAK / CCAAK
問題 1
管理者は、ネットワーク帯域を削減しつつBrokerのCPU増加を避けたい。複数のProducerが同じトピックに書き込むが、設定を統一できる。最も適切な構成はどれか。
正解: A
Producer側でlz4を統一し、トピックはcompression.type=producerのままにすると、Brokerの再圧縮を避けつつ帯域を削減できる。トピック側で方式固定すると、Producerと異なる場合にBrokerで再圧縮が発生しCPU/遅延コストが上がる。Broker全体設定のみでProducerトラフィックを強制変換はできない。圧縮無効化は帯域削減の要件に反する。
圧縮はどこで行われ、どこで展開されますか?
Producerがレコードバッチを圧縮します。Brokerは通常そのまま保存・レプリケーションし、Consumerが受信時に展開します。トピック設定で具体的な圧縮方式を指定するとBrokerで再圧縮が発生します。
バッチ設定と圧縮効率の関係は?
圧縮はバッチ単位なので、batch.sizeやlinger.msを増やしてバッチを大きくすると、一般に圧縮率が向上します。ただし待ち時間が増えるため、遅延SLAと併せて調整します。
TLSやSASLを使うと圧縮効果は失われますか?
いいえ。圧縮は暗号化前に適用されるため、圧縮効果は維持されます。ネットワーク上では圧縮済みのバイト列が暗号化されて送信されます。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Kafka Topic と Partition の基礎: 分散とスケーラビリティの要
CCDAK 対策と実務の両立を意識し、Topic/Partition/Replica/Consumer Group の役...
CCDAK 試験ガイド:出題範囲・配点・申込み・対策
Confluent Certified Developer for Apache Kafka (CCDAK) の出題範囲...
Confluent Certified Administrator (CCAAK) 対策: 出題範囲・配点の考え方・運用観点の要点
CCAAKに向けて、試験領域の押さえどころを運用目線で整理。プロダクションで通用する設定・監視・セキュリティの実践知を、...
Kafka の Replica と In-Sync Replicas を正しく設計する: 耐障害性と一貫性
レプリカとISRの仕組みを起点に、acks と min.insync.replicas、クリーン/アンクリーンリーダー選...
Kafka の Offset とコミット: ポジション管理と at-least-once の基礎
CCDAK 対策と実務の両立を意識して、Kafka コンシューマのオフセット管理とコミット戦略を整理。at-least-...