This page is meant as a template for writing a KIP. To create a KIP choose Tools->Copy on this page and modify with your content and replace the heading with the next KIP number and a description of your issue. Replace anything in italics with your own description.

Status

Current state: Under Discussion

Discussion threadhttps://lists.apache.org/thread/vnzmqvcbfxo7hhyj9gzpgmdq59w3n7dy

JIRA: here 

Please keep the discussion on the mailing list rather than commenting on the wiki (wiki discussions get unwieldy fast).

Motivation

The reason for this KIP is to remove the requirement of brokers needed to run the storage tool before starting Kafka. Currently, when brokers format in KRaft, they persist a UUID value representing a cluster ID, which is passed from the kafka-storage format  command to the meta.properties file. The main purpose of cluster id is to prevent nodes from contacting other Kafka clusters (ref KIP-78).

For brokers, meta.properties ’ other data: node.id  and directory id , are obtained from the node’s static config and randomly generated, respectively.

For controllers, meta.properties ’ directory id may come from —-initial-controllers , but otherwise controllers are the same as brokers with respect to the above data.

We still maintain that controllers who are part of the bootstrapped voter set must format, but observer controllers do not need to format, just like brokers. This can be enforced by requiring —-cluster-id  when any of the KIP-853 format flags are provided or when the local node is part of its static voter set.

Background on cluster.id from ZooKeeper Kafka

Cluster id was a znode, /cluster/id , that was initially empty. During the startup of a cluster, brokers would race to write a random UUID in ZK to this znode, which would never change after being set, via getOrGenerateClusterId() .

Public Interfaces

meta.properties

Introduce meta.properties v2 with optional cluster id (same as v0).

ClusterIdRecord


Storage Tool

--cluster-id is now optional for brokers + observer controllers. This flag is still required for "bootstrapping" controllers (i.e. controllers who are part of an initial dynamic voter set (determined by the --standalone or --initial-controllers) flags, or who are part of a static voter set).

Proposed Changes

Option 1: Continue to persist cluster id in meta.properties but have KRaft discover it + persist it

Option 2: Introduce a metadata record for cluster id

Compatibility, Deprecation, and Migration Plan

This section depends on which approach is chosen for the proposed changes.

Test Plan

Rejected Alternatives

WIP: Currently considering two solutions