Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

Status

Current stateUnder DiscussionAccepted

Discussion thread: Image Removedhttps://confluentlists.slackapache.comorg/archives/C021W3ULE2X/p1690905387380699thread/mwcljxdnyobthsszy4n2qr2tqcf9cxcf 

JIRA: KMETA-1086

Jira
serverASF JIRA
serverId5aa69414-a9e9-3523-82ec-879b028fb15b
keyKAFKA-15471

Motivation

Some users run KRaft controllers and brokers on the same machine (not containerized, but through tarballs, etc) and with ZooKeeper, they can independently start/.  Prior to KRaft, when running ZooKeeper and Kafka on the same machine, users could independently stop the ZooKeeper controller node and Kafka broker since there were specific shell scripts for each (zookeeper-server-stop and kafka-server-stop, respectively).

However in KRaft mode, they can't start and stop the KRaft controller controllers independently from the Kafka brokerbrokers or any independent process because there is just a single script that doesn't distinguish between processes and signals all of them. We need to provide a way for users to kill either controllers or brokers, and even better, any individual process.

Public Interfaces

The command line for killing controllers/brokers will changestopping Kafka nodes will include a pair of optional and mutually exclusive parameters "[--process-role]" OR "[--node-id]"  to support identifying a set of processes or a specific process to stop based on the contents of the node's configuration file.

Instead of simply running 

Code Block
./bin/kafka-server-stop.sh

The new script will accept an optional parameter [--process-role=value], with the value indicating whether to kill Kafka broker processes or controller processes.

OR

The new script will accept an optional parameter [--node-id=value], with the value indicating the specific process, identified by its node id, that the user wishes to kill.

Example 1: the new command to kill all the broker processes proposed change include adding an extra optional field "process-role", which specify the specific process the user want to kill, i.e, controller/broker. For example, the new command line to kill broker only will look like:

Code Block
./bin/kafka-server-stop.sh --process-role =broker

The output will indicate the process(es) that was(were) killed, and the process(es) that was(were) not killed, with the process PID. For example:

Code Block
Killed broker with PID 69194
Skip killing controller with PID 69039

Example 2: the command to kill the process with node ID = 1 will look like:

Code Block
./bin/kafka-server-stop.sh --node-id=1

If both parameters are provided, the value for node-id parameter will take precedence, i.e, the process with node id specified will be killed, no matter what's the process role provided. Also, a log message will be shown to indicate that precedence. 

When neither a "process-role" nor a "node-id" field is provided, the behavior remains unchanged -- all Kafka processes are stoppedWhen a process-role field is not provided, the command line killed both controllers and brokers.

Proposed Changes

I'm changing the "kafka-server-stop.sh" file to accept an optional field, either "process-role" or "node-id". When the user specify specifies a process role or a node id, I will retrieve the absolute path to the configuration file, and search for the value of "process role"that field. If the process role value retrieved from the configuration file matches the process role the user providedinput, that process will be killed, otherwise it will be skipped.NOTE: If users want to use the feature, they have to provide an absolute path to the configuration file when starting a controller/broker process. Also, the configuration file has to be provided as the last argument. 

Compatibility, Deprecation, and Migration Plan

Existing users won't need to change any behavior if they want to continue killing both controller /and broker processes. Otherwise, if they want to either kill only the broker/controller, or an individual broker/controller, they'll need to provide specify a "process-role" or a "node-id" field in the script language. 

Test Plan

The change can be tested through command line

Rejected Alternatives

One rejected alternatives is using an optional argument "[--required-config <name = value>]" to allow users to stop Kafka processes with any arbitrary name = value based on the node's configuration file. This argument gives the users freedom to choose any field in the configuration file to indicate the process they want to kill. However, upon discussion, we think this approach based on configs is a bit too open-ended and not very user friendly. Therefore, we decided to simply provide flags for the things a user may care about the most, i.e, two specific and mutually exclusive parameters process-role  and node-id . We agree that it is more user-friendly than the --required-config  argument, and it comes at the possible expense of generality.