Kafka の耐障害性は「レプリケーション」と「ISR(In-Sync Replicas)」で成立します。単にレプリケーション係数を増やすだけではデータ損失を回避できません。acks と min.insync.replicas の組み合わせ、そして unclean.leader.election.enable をどう置くかが一貫性を左右します。
本稿は CCAAK などの資格対策を意識しつつ、現場で迷いがちな設計ポイントを公式ドキュメントの挙動に沿って整理します。特に RF=3 を前提とした安全な構成、ISR の縮小/拡大、HW(High Watermark) とコミットの意味、フェイルオーバー時の可用性トレードオフを具体的に解説します。
Kafka の各パーティションは 1 台のリーダーと複数のフォロワーで構成され、replication.factor(RF) により総レプリカ数が決まります。フォロワーはリーダーから順次取り込み、同じ順序でログを複製します。
ISR は「リーダーと十分に同期しているレプリカの集合」です。フォロワーが所定の時間しきい値内に追随できていない場合は ISR から外れ、自動で縮小/拡大します。プロデューサーの acks=all は ISR を基準にコミットの可否を判断します。
Producer から Leader、Follower、ISR の関係
トピック作成と最小ISRの設定例
kafka-topics --bootstrap-server broker1:9092 \
--create --topic orders --partitions 6 --replication-factor 3
# トピック単位で最小ISR=2を設定 (RF=3 が前提)
kafka-configs --bootstrap-server broker1:9092 \
--alter --topic orders --add-config min.insync.replicas=2フォロワーは定期的にリーダーからデータをフェッチします。一定時間以上フェッチや追随ができない場合、フォロワーは ISR から外れます。再度追いつけば自動的に ISR に復帰します。
ISR はスループット制御の安全弁でもあります。追随できないレプリカを外すことでコミット前提の複製待ちが過度に遅延することを避けられます。ただし ISR が min.insync.replicas 未満に縮むと acks=all の書き込みはエラーになります。
ISR の確認 (Describe 出力に ISR が表示される)
kafka-topics --bootstrap-server broker1:9092 --describe --topic orders
# 出力例の一部
# Partition: 0 Leader: 2 Replicas: 2,1,3 ISR: 2,3Kafka のコミットは High Watermark(HW) に基づきます。HW は ISR 内レプリカの LEO(Log End Offset) の最小値で、これより小さいオフセットは全 ISR にレプリカ済みと見なされます。
acks=all のプロデューサー応答は、レコードがコミットされ HW がそのレコードを含む位置まで前進したときに返ります。ISR が遅ければ一時的に待たされ、ISR が縮んで再編成されれば進みます。
プロデューサーの一貫性寄り設定例
bootstrap.servers=broker1:9092,broker2:9092,broker3:9092
acks=all
enable.idempotence=true
retries=2147483647
max.in.flight.requests.per.connection=1
request.timeout.ms=30000
delivery.timeout.ms=120000acks はリーダーがどの段階で応答するかの方針、min.insync.replicas はコミットのための最小 ISR サイズの下限です。RF=3 の一般的な安全策は「acks=all + min.insync.replicas=2」。これにより 1 台障害時でも新規書き込みが安全に継続し、さらに 2 台目が失われた場合は書き込みを停止してデータ損失を避けます。
低レイテンシ志向なら acks=1 ですが、リーダー単独障害で直前の書き込みが失われる可能性があります。バッチや重要データは acks=all と min.insync.replicas の併用を基本にしましょう。
| acks | min.insync.replicas(トピック) | 一貫性/損失リスク | 耐えられる同時障害数 (RF=3 前提) |
|---|---|---|---|
| 0 | 任意 | 未到達でも成功応答。損失リスク高 | 0 |
| 1 | 1 | リーダー書き込みで応答。リーダー障害直前の書き込みが失われ得る | 0 |
| all | 2 | 実務推奨。1 台障害時も継続し、2 台目で安全に停止 | 1 |
| all | 3 | 最も厳格。常に全レプリカ必要。可用性は低下 | 1 |
トピックごとの acks 運用と設定確認の流れ
# プロデューサー側 (例: アプリ設定)
acks=all
# トピック側の最小ISRを 2 にしておく (RF=3 前提)
kafka-configs --bootstrap-server broker1:9092 \
--alter --topic payments --add-config min.insync.replicas=2
# 設定確認
kafka-configs --bootstrap-server broker1:9092 \
--describe --topic payments | grep min.insync.replicas健全なフェイルオーバーでは、ISR 内のレプリカのみから新しいリーダーを選出します。これがクリーンなリーダー選出で、順序と整合性を保ちます。一方、unclean.leader.election.enable を許可すると、ISR 外の遅延レプリカがリーダーになる場合があり、未複製の書き込みが巻き戻されデータ損失が発生します。
強い一貫性を求めるなら unclean.leader.election.enable=false を推奨します。その場合、ISR が完全に失われるとパーティションは一時的に書読不可となりますが、データは失われません。
トピック単位のアンクリーン選出禁止
kafka-configs --bootstrap-server broker1:9092 \
--alter --topic orders --add-config unclean.leader.election.enable=false
# 確認
diff <(kafka-configs --bootstrap-server broker1:9092 --describe --topic orders | sort) /dev/null | catISR とレプリカ遅延は継続監視が不可欠です。UnderReplicatedPartitions が 0 を維持できているか、IsrShrinks/Expands の増減、ネットワークとディスク待ち時間を把握しましょう。プロデューサー側では NotEnoughReplicas 系エラーの再試行戦略と警告の整備が必要です。
本番前に障害注入テストを繰り返し、1 台停止時の acks=all + min.insync.replicas=2 の継続性、2 台停止時に書き込みが止まること、復旧後に順序と整合性が保たれることを確認します。
CLI での健全性チェック例
# アンダーレプリケートの検出
kafka-topics --bootstrap-server broker1:9092 --under-replicated-partitions --describe
# パーティションのリーダー/ISR 一覧
kafka-topics --bootstrap-server broker1:9092 --describe --topic orders
# ブローカ毎の負荷は外部監視や JMX エクスポートを活用CCAAK
問題 1
RF=3 のトピックで、1 台のブローカ障害時にもデータ損失なしで書き込みを継続したい。プロデューサーとトピックの組み合わせとして最も適切なのはどれか。
正解: A
acks=all と min.insync.replicas=2 の併用は RF=3 で 1 台障害時も無損失継続を可能にし、2 台目で安全に失敗させる。unclean.leader.election.enable=false は ISR 外からの選出を防ぎ、巻き戻しによる損失を避ける。他の選択肢はいずれも損失リスクか不必要な可用性低下を招く。
ISR と AR(All Replicas) は何が違うのか。
AR はトピックのレプリカ全体、ISR はそのうち「リーダーに十分追随している集合」。コミットと acks=all は ISR を基準に判断される。遅延レプリカは一時的に ISR から外れる。
acks=all にしていれば必ず安全か。
いいえ。min.insync.replicas の下限が重要。ISR が下限を割ると書き込みは失敗して安全側に倒れるが、下限を低く設定すると障害時に損失リスクが上がる。また unclean.leader.election.enable=true では巻き戻しが起こり得る。
RF=2 でも十分か。
小規模用途では成立するが、ネットワーク分断やメンテナンス時のジレンマが増える。強い一貫性と運用余裕を確保するなら RF=3 以上を推奨。RF=2 での acks=all + minISR=2 は厳格だが可用性が低く、minISR=1 は損失リスクが上がる。
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 の Offset とコミット: ポジション管理と at-least-once の基礎
CCDAK 対策と実務の両立を意識して、Kafka コンシューマのオフセット管理とコミット戦略を整理。at-least-...
Kafka Producer API 基礎: 送信フローと主要設定の意味
CCDAK 対応。Producer の送信フローを起点に、スループット・信頼性・順序性を左右する主要パラメータの意図と実...