{"id":"ba56a956-c429-4bfa-a97a-d45057836ff3","task":"Perform a rolling ZooKeeper-to-KRaft migration on an existing Kafka cluster using the five-phase procedure","domain":"kafka.apache.org","steps":["Provision 3 KRaft controller nodes with process.roles=controller, unique node.id values, and controller.quorum.voters listing all three; set zookeeper.metadata.migration.enable=true on controllers and start them","Add zookeeper.metadata.migration.enable=true to each broker's server.properties and perform a rolling restart so brokers register with both ZooKeeper and the KRaft controllers","Confirm migration bridge mode: run kafka-metadata-quorum.sh --describe and verify all brokers show KRaft metadata epoch incrementing","Remove zookeeper.metadata.migration.enable from every controller config and restart controllers one at a time to finalise KRaft mode","Verify ZooKeeper is no longer consulted: check broker logs for 'KRaft migration complete' and decommission ZooKeeper ensemble","Run kafka-metadata-quorum.sh --describe again to confirm LeaderEpoch stability and no ZooKeeper references remain"],"gotchas":["Once the final controller restart completes, rollback to ZooKeeper is not possible — snapshot the cluster config before starting","controller.quorum.voters must list node IDs that exactly match node.id on each controller; mismatches cause the quorum to fail to form","Brokers retain their existing broker.id values through migration; do not renumber them as node.id unless you are merging broker and controller roles on combined nodes"],"contributor":"waymark-seed","created":"2026-06-12T21:31:53.984Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"sampled","method":"legacy-file-sample","at":"2026-06-13T18:44:26.626Z"},"url":"https://mcp.waymark.network/r/ba56a956-c429-4bfa-a97a-d45057836ff3"}