min.insync.replicasは、ISR(In-Sync Replica)に属するレプリカのうち、書き込み成功に最低限必要な台数を定義する設定です。acks=allと組み合わせることで、実効的な耐久性をコントロールします。
この記事では、公式ドキュメントの挙動に基づいてトレードオフを定量化し、障害時の具体的なふるまいと運用ベストプラクティスを整理します。CCAAKで頻出の論点も明示します。
Kafkaの各パーティションはLeaderと複数のFollowerで構成され、Leaderと十分に同期しているレプリカ集合がISRです。min.insync.replicas(以下minISR)は「書き込みを成功扱いにするためにISRに何台のackが必要か」の下限です。
acks=all(= -1)のとき、LeaderはISR全員のackを待ちます。ただしISRのサイズがminISRを下回っている場合、プロデューサーはNotEnoughReplicasエラーで失敗します。acks=1や0ではminISRは実質的に強制されず、Leaderのみ、またはネットワーク送信で即時成功します。
replication.factor(RF)とminISRの関係は厳格です。minISRはRF以下である必要があり、RF - minISR が「同時に許容できる障害(書き込み継続の観点)」のおおよその上限になります。
acks=all と min.insync.replicas=2 (RF=3) のイメージ
実務でも試験でも問われるのは、minISRとacksの組み合わせが"どれだけの障害で書き込み・読み取りの可用性とデータ耐久性を保てるか"です。近似的に、書き込み継続のために同時に許容できる障害数は RF - minISR と覚えると整理しやすくなります(acks=all前提)。
acks=allはISR全員のackを待つため、ISRに遅延レプリカがいると待ち時間が増え、タイムアウトでNotEnoughReplicasAfterAppendになる可能性があります。minISRを高く設定するとデータ喪失リスクは下がりますが、書き込みの可用性とレイテンシに影響します。
| acks | min.insync.replicas(m) | 書き込み成功条件 | 許容障害数(書込継続) |
|---|---|---|---|
| 0 | 任意 | 送信即時成功(ブローカー到達不要) | 評価困難(可用性は高いが意味薄) |
| 1 | 任意 | Leader追記で成功 | おおむねRF-1(Leader健在が前提) |
| all | 1 | ISR全員ack、かつISRサイズ≥1 | RF − 1 |
| all | 2 | ISR全員ack、かつISRサイズ≥2 | RF − 2 |
| all | RF | ISR=全台が常にack | 0 |
プロデューサーの耐久性優先プロパティ例
acks=all
enable.idempotence=true
retries=2147483647
max.in.flight.requests.per.connection=1
request.timeout.ms=30000
delivery.timeout.ms=120000
compression.type=snappy
linger.ms=10
batch.size=65536一律の最適解はありません。SLA(遅延・可用性・完全性)と障害モデルに合わせてRF・minISR・acksを組み合わせます。試験では"RF=3, minISR=2, acks=all"が実務的な安全デフォルトとして頻出です。
低遅延が最重要なケースでも、最小限の完全性を担保するためにacks=all, minISR=2を維持し、バッチや圧縮、ネットワークを最適化する方が総合的に安定します。
トピック/ブローカー設定の具体例
# トピック作成時にminISRを指定
kafka-topics --bootstrap-server <broker> \
--create --topic orders \
--partitions 12 --replication-factor 3 \
--config min.insync.replicas=2
# 既存トピックで変更
kafka-configs --bootstrap-server <broker> \
--alter --entity-type topics --entity-name orders \
--add-config min.insync.replicas=2
# ブローカーのデフォルト(サーバー設定)
# server.properties
min.insync.replicas=2
unclean.leader.election.enable=falseISRがminISR未満に縮小している状態でacks=allの書き込みを行うと、即座にNotEnoughReplicasが返ります。これは"開始時点で必要最小の同期者が不足"の意味です。
書き込み開始時にISR≥minISRでも、待機中にISRからノードが外れたりタイムアウトした場合、NotEnoughReplicasAfterAppendとなることがあります。これは"追記はされたが、期待通りの複製が間に合わなかった"状態です。
Leader障害時はISR内のレプリカから新規Leaderが選出されます。unclean.leader.election.enable=falseであれば、ISR外からの選出は行わず、可用性よりも整合性を優先します。
挙動確認のためのタイムアウト調整例(検証環境)
# プロデューサー(短めにしてエラーを顕在化)
acks=all
request.timeout.ms=10000
delivery.timeout.ms=20000
retries=10
max.in.flight.requests.per.connection=1minISRを活かすには、ISRが安定していることが前提です。UnderReplicatedPartitionsが0付近で推移し、IsrShrinksPerSecがスパイクしないことをSLOとして設定すると実務的です。
書き込みSLOは"p99レイテンシ""エラーレート""ISR安定性"の3点で見ると因果が追いやすくなります。acks=all運用ではタイムアウト値を適切に取り、ネットワーク・ディスクのヘッドルームを確保してください。
acks=all運用のタイムアウトと再試行の目安
# 目安(ワークロードとネットワークに合わせて要実測チューニング)
request.timeout.ms=30000
delivery.timeout.ms=120000
retries=2147483647
retry.backoff.ms=100
socket.connection.setup.timeout.ms=10000試験では"RFとminISRの差分"と"acks=all時のみminISRが効く"の2点が定番です。障害数の許容やエラーコードの違い、unclean leader electionの影響も押さえておきます。
また、トピック設定優先(ブローカーのデフォルトより強い)、minISR>RFはエラー、といった設定ルール問題も出題されます。
CCAAK
問題 1
トピックのreplication.factor=3、min.insync.replicas=2。プロデューサーはacks=all。Followerが1台ダウンし、残りのLeaderと1台のFollowerは引き続きISRに残っています。このときの挙動として正しいものはどれか。
正解: A
acks=allではISR全員のackを待ち、かつISRサイズがminISR以上である必要があります。本ケースではFollower1台の離脱後もISRサイズが2を満たしており、Leader+残存ISRのackで成功します。ISRがminISR未満ならNotEnoughReplicasで失敗します。
acks=1のとき、min.insync.replicasは影響しますか?
実質的に影響しません。acks=1ではLeaderへの追記で成功と見なされるため、ISRの台数要件(minISR)は強制されません。ただしFollowerが追いつく前にLeader障害が起きるとデータ喪失リスクが上がります。
min.insync.replicasはどこで設定しますか?
トピック設定として指定するのが基本です。未指定の場合はブローカーのmin.insync.replicas(デフォルト)が適用され、トピック側の設定がブローカーデフォルトを上書きします。設定値はreplication.factor以下である必要があります。
unclean.leader.election.enableはminISRとどう関係しますか?
unclean leader electionを無効(false)にすると、ISR外からのLeader選出を行わないためデータ完全性が高まりますが、Leader不在時に可用性が下がる可能性があります。minISRは"書き込み成功に必要な同期者数"を定め、unclean設定は"どこからLeaderを選べるか"を定めます。目的が異なるため両方を組み合わせて整合性ポリシーを決めます。
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-...