---
title: "Kafka observer promotion in Confluent Multi-Region Clusters"
description: "Losing the west region drops the ISR below min.insync.replicas=2. Confluent MRC promotes a dr observer to a sync replica and Kafka acks=all writes resume."
url: https://monedula.dev/kafka-simulator/scenarios/observer-promotion/
---

# Kafka observer promotion in Confluent Multi-Region Clusters

Scenario 10.1.3 · Observer promotion. Disaster recovery · Advanced · about 4 min · Apache Kafka 4.3 · Confluent Platform feature.

Confluent MRC recovery: sync replicas in east + west (min.ISR 2) with two async observers in a dr region. Lose the west region and the in-sync count drops below min.ISR (produces stall) - so an observer catches up and is promoted into the ISR as a synchronous replica, restoring durability while the second observer stays async.

Run it: https://monedula.dev/kafka-simulator/playground/?scenario=10.1.3

## What you start with

When a Confluent MRC partition loses enough synchronous replicas to fall below min.ISR, an async observer can be promoted into the ISR to take over the durability role. Here sync replicas span east and west (min.ISR 2) with two DR observers; losing the west region stalls acks=all until one observer catches up and is promoted into the in-sync set.

## Step by step

1. **MRC ready - sync in east + west (min.ISR 2), two async observers in dr** (t+0.000s): orders has a synchronous replica in east and west; the two dr replicas are async observers that never count toward ISR / acks=all. [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=10.1.3&t=0)
2. **Committed in east + west (HW 3) - dr observers trail** (t+0.900s): Both sync replicas committed O1-O3; the high-watermark is 3. The dr observers lag (async). [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=10.1.3&t=1)
3. **West region lost - ISR 1 < min.ISR 2 (acks=all produces stall); dr observer moved into the replica set** (t+1.100s): broker-2 (west) died, so the in-sync count fell below min.ISR - acks=all writes would stall. The simulator moves a reachable dr observer (broker-3) into the replica set now and admits it to the ISR on the next step; in MRC, promotion is that ISR join, which happens once the observer has caught up. [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=10.1.3&t=2)
4. **Observer promoted to sync - ISR restored to 2, durability back** (t+1.400s): The dr replica caught up and was promoted into the ISR; the in-sync count is back to 2. The second dr replica stays an async observer. [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=10.1.3&t=3)
5. **New write committed on the promoted replica; one observer still async** (t+1.900s): O4 committed on east + the promoted dr replica (HW 4). The remaining dr observer continues to trail asynchronously. [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=10.1.3&t=4)

## The takeaway

Observer promotion is MRC's automatic durability backstop - it converts a trailing async copy into a counted synchronous replica so acks=all writes can resume after a region loss.

## Configs in this scenario

- [`min.insync.replicas`](https://kafka.apache.org/43/configuration/topic-configs/#topicconfigs_min.insync.replicas): The fewest in-sync replicas, leader included, that must have a write for an acks=all produce to succeed (default 1); with fewer in the ISR the leader rejects the write with NOT_ENOUGH_REPLICAS. [How min.insync.replicas works](https://monedula.dev/kafka-simulator/configs/min-insync-replicas/)
- [`acks`](https://kafka.apache.org/43/configuration/producer-configs/#producerconfigs_acks): How many replicas must have a write before the producer counts it as sent: 0 (none), 1 (the leader only) or all (every in-sync replica, the default, and required for idempotence). [How acks works](https://monedula.dev/kafka-simulator/configs/acks/)

## Further reading

- [Confluent documentation](https://docs.confluent.io/platform/current/multi-dc-deployments/multi-region-async/index.html)
