Kafka の保持は「いつ消すか(時間)」「どれだけ残すか(サイズ)」「どこで切るか(セグメント)」の3層で決まる。これらは独立に作動し、どれかの条件に該当すれば最古セグメントから削除が進む。
CCAAK では ms 付き設定の優先、トピック単位の上書き、delete と compact の相互作用、ロールと保持の違いが頻出。実務ではディスク安全域と監視、セグメント粒度の現実解がカギ。
Kafka の保持はパーティション単位で評価される。ログは複数のセグメントファイルへローテーションされ、削除は常に「セグメント単位」で行われる。新規書き込みは常にアクティブセグメントに追記され、しきい値を超えるとロールして新しいセグメントが開かれる。
時間ベース保持はセグメント内の最大タイムスタンプが retention.ms を超えたら削除候補にする。サイズベース保持はパーティション合計サイズが retention.bytes を超えると最古セグメントから削除で調整する。保持判定は一定間隔で行われる(log.retention.check.interval.ms)。
トピック設定がブローカ既定より優先される。ms サフィックスの設定(retention.ms, roll.ms など)が存在すれば、時間単位の設定(hours, minutes)より優先されることが公式動作。バージョンで既定値は変わりうるため、試験・実務ともに明示設定が安全。
ブローカ内のセグメントローテーションと削除の流れ
Producer --> Broker
TopicA-0 (log dir)
|
|-- 00000000000000000000.log [CLOSED]
|-- 00000000000001234567.log [CLOSED] <-- oldest, candidate for deletion
|-- 00000000000009876543.log [ACTIVE] <-- new appends
^ ^
| |
retention check roll (segment.bytes or roll.ms)
|
if time expired OR total size > retention.bytes => delete oldest CLOSED segment(s)
server.properties の最小関連設定例(ブローカ既定)
# 時間ベース保持(トピック未指定時の既定)
# log.retention.ms=604800000 # 例: 7日(バージョンにより既定は変わり得るため明示推奨)
# サイズベース保持(-1 は無制限)
# log.retention.bytes=-1
# セグメントサイズとロール(サイズ/時間のいずれかで新規セグメント作成)
# log.segment.bytes=1073741824 # 例: 1GiB(明示推奨)
# log.roll.ms=604800000 # 例: 7日(hours と併用しない)
# 保持チェック間隔
# log.retention.check.interval.ms=300000 # 例: 5分時間ベースはセグメント内の最大タイムスタンプで判定する。メッセージタイムスタンプの種別は message.timestamp.type(CreateTime または LogAppendTime)に従い、CreateTime の場合はプロデューサの時刻の歪みに注意する。保持は log.retention.check.interval.ms ごとに評価され、条件を満たせば該当する最古セグメントから削除が始まる。
サイズベースはパーティション合計サイズが retention.bytes を超えている間、最古セグメントから削減する。時間・サイズはどちらか片方でも条件に達すれば削除される。retention.bytes が -1 の場合はサイズでは削除されず、時間のみで削除される。
実務では時間ベースで期間保証を与え、サイズベースでディスク上限をガードする二重フェイルセーフが一般的。試験では ms 付き設定の優先、パーティション単位、チェック間隔の存在を押さえる。
| 軸 | 主な設定 | 判定タイミング | 運用上の注意 |
|---|---|---|---|
| 時間ベース | retention.ms | セグメント最大TSが現在時刻−保持期間を超過 | CreateTime の時刻歪みとクロック同期に注意 |
| サイズベース | retention.bytes | 合計サイズが上限を超えている間は連続削除 | ディスク安全域を考慮し十分に低めに設定 |
| セグメント | segment.bytes / roll.ms | 書き込み時のしきい値到達でロール | 小さすぎるとファイル数が増え、大きすぎると復旧と圧縮が遅い |
トピック単位での保持設定(時間・サイズ)
# 時間ベース保持を 7 日、サイズベースを 50GiB に設定(例)
bin/kafka-configs.sh --bootstrap-server <broker:9092> \
--alter --topic my-topic \
--add-config retention.ms=604800000,retention.bytes=$((50*1024*1024*1024))
# 設定の確認
bin/kafka-configs.sh --bootstrap-server <broker:9092> \
--describe --topic my-topic | grep -E 'retention'セグメントはログの最小削除単位であり、ロールは新しいセグメントを開始するトリガ。ロールは通常、log.segment.bytes に到達するか、log.roll.ms(または hours)を超えた時点で発生する。ロールは保持とは別物であり、ロールしても直ちに削除はされない点を区別する。
設計の原則は、復旧・リーダー切替・ログクリーナの効率とファイル数のバランスを取ること。高スループットでは大きめの segment.bytes で I/O 効率を上げ、低トラフィックでは roll.ms を設定して「いつまでも巨大な単一セグメントにならない」ようにする。既定値はリリースにより変わり得るため、ワークロードに合わせて明示設定する。
ロール調整の例(低トラフィック対策)
# 低トラフィックでサイズ到達が遅い場合、時間ロールを明示
bin/kafka-configs.sh --bootstrap-server <broker:9092> \
--alter --topic events-low \
--add-config roll.ms=7200000,segment.bytes=$((256*1024*1024)) # 2時間 or 256MiB の早い方cleanup.policy=delete は本稿で扱う時間・サイズ保持がそのまま適用され、最古のセグメント単位で削除される。
cleanup.policy=compact はキー重複の古いレコードをマークして除去するプロセスで、保持とは別経路。compact,delete を併用すると、コンパクションで古いバージョンを間引きつつ、delete 側の時間・サイズでセグメントを削除する。tombstone の保持には delete.retention.ms が関わり、一定期間後に tombstone 自体も除去される。
コンパクション関連の調整例としては、log.cleaner.enable、min.cleanable.dirty.ratio、log.cleaner.min.compaction.lag.ms などがある。セグメント粒度はコンパクション単位にも影響するため、segment.bytes が極端に大きいと一回のコンパクション負荷が増す。
コンパクション併用時の設定例
# コンパクトかつ時間保持(7日)を適用
bin/kafka-topics.sh --bootstrap-server <broker:9092> \
--create --topic kv-store \
--partitions 6 --replication-factor 3 \
--config cleanup.policy=compact,delete \
--config retention.ms=604800000 \
--config delete.retention.ms=86400000 \
--config segment.bytes=$((256*1024*1024))変更手順の基本は、対象トピックの現在設定を確認し、影響を見積もったうえで段階的に適用すること。サイズ上限を厳しくする場合は先にディスク使用量を確認し、削除が連鎖して突発的な I/O 増大を招かないようにする。保持を延長する場合は空き容量とスループットから所要ディスクを再試算してから適用する。
監視では、パーティション単位サイズ、セグメント数、削除・ロールのレート、ログクリーナのスループットとラグを観測する。JMX では kafka.log のメトリクスやブローカのログを参照し、必要に応じて describeLogDirs でブローカごとのディスク使用を点検する。
現況確認と影響見積コマンド例
# ブローカごとのログディレクトリ使用量
bin/kafka-log-dirs.sh --bootstrap-server <broker:9092> --describe
# トピック設定の出所確認
bin/kafka-configs.sh --bootstrap-server <broker:9092> --describe --topic my-topic
# セグメントファイルの概数を把握(ブローカ側で)
ls /kafka-logs/my-topic-*/ | wc -lイベントストリーミング(7日保証、スパイク対策付き): 時間で 7 日を保証し、サイズで頭打ちを設ける。セグメントは 512MiB〜1GiB を起点に実測で調整。CreateTime を使う場合はプロデューサの時刻同期をSRE手順に含める。
監査ログ(90日保持、容量優先): サイズで強く制限しつつ、時間で 90 日を目標に。実効がサイズで先にトリガする可能性を想定し、可観測性要件に合わせてアーカイブ連携を前提設計にする。
状態ストアのチェンジログ(compact 併用): compact,delete の両立。delete.retention.ms を短めに、segment.bytes は中庸にして compaction のバッチ負荷を抑える。
シナリオ別の設定適用例
# イベントストリーミング
bin/kafka-configs.sh --bootstrap-server <broker:9092> --alter --topic events \
--add-config retention.ms=604800000,retention.bytes=$((200*1024*1024*1024)),segment.bytes=$((512*1024*1024))
# 監査ログ
bin/kafka-configs.sh --bootstrap-server <broker:9092> --alter --topic audit \
--add-config retention.ms=$((90*24*60*60*1000)),retention.bytes=$((500*1024*1024*1024)),roll.ms=$((24*60*60*1000))
# チェンジログ
bin/kafka-configs.sh --bootstrap-server <broker:9092> --alter --topic changelog \
--add-config cleanup.policy=compact,delete,delete.retention.ms=$((12*60*60*1000)),segment.bytes=$((256*1024*1024))CCAAK
問題 1
トピックに retention.ms=172800000 と retention.bytes=107374182400 を設定した。パーティションの合計サイズが 150GiB に達し、最古セグメントの最大タイムスタンプは 1 日前だった。保持チェック時に起こる動作として最も正しいものはどれか。
正解: A
retention.bytes はパーティション合計サイズの上限。150GiB は 100GiB 超過のため、保持チェックで最古セグメントから削除される。時間条件は 2 日に満たないが、時間とサイズは独立トリガであり、いずれかを満たせば削除が進む。
ms が付く設定と hours/minutes のどちらが有効になりますか?
同じ意味の設定が併存する場合、ms サフィックスの設定(retention.ms や roll.ms)が優先されます。試験・運用ともに ms を明示するのが安全です。
retention.bytes はクラスター全体の合計ですか?
いいえ。パーティション単位で評価されます。トピック全体では「パーティション数 × retention.bytes」が理論上の上限目安になります。
保持期間を延長すると既存データは直ちに増えますか?
いいえ。保持は削除の抑制であり、即座にデータが増えるわけではありません。ただし今後の削除が遅れるため、時間とともにディスク使用量が増加します。事前に必要容量を試算してください。
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-...