Elena, Did you provision a KRaft controller quorum before restarting the brokers?
If you don't mind, could you create a JIRA and attach the config files used for the brokers before/after the migration along with the controller configs? Please include the sequence of steps you took in the JIRA as well. Here is our JIRA project: https://issues.apache.org/jira/projects/KAFKA/issues, and general info on filing issues https://cwiki.apache.org/confluence/display/KAFKA/Reporting+Issues+in+Apache+Kafka Thanks! David On Tue, May 16, 2023 at 2:54 AM Elena Batranu <batranuel...@yahoo.com.invalid> wrote: > Hello! I have a problem with my kafka configuration (kafka 3.4). I'm > trying to migrate from zookeeper to kraft. I have 3 brokers, on one of them > was also the zookeeper. I want to restart my brokers one by one, without > having downtime. I started with putting the configuration with also kraft > and zookeeper, to do the migration gradually. In this step my nodes are up, > but i have the following error in the logs from kraft. > [2023-05-16 06:35:19,485] DEBUG [BrokerToControllerChannelManager broker=0 > name=quorum]: No controller provided, retrying after backoff > (kafka.server.BrokerToControllerRequestThread)[2023-05-16 06:35:19,585] > DEBUG [BrokerToControllerChannelManager broker=0 name=quorum]: Controller > isn't cached, looking for local metadata changes > (kafka.server.BrokerToControllerRequestThread)[2023-05-16 06:35:19,586] > DEBUG [BrokerToControllerChannelManager broker=0 name=quorum]: No > controller provided, retrying after backoff > (kafka.server.BrokerToControllerRequestThread)[2023-05-16 06:35:19,624] > INFO [RaftManager nodeId=0] Node 3002 disconnected. > (org.apache.kafka.clients.NetworkClient)[2023-05-16 06:35:19,624] WARN > [RaftManager nodeId=0] Connection to node 3002 (/192.168.25.172:9093) > could not be established. Broker may not be available. > (org.apache.kafka.clients.NetworkClient)[2023-05-16 06:35:19,642] INFO > [RaftManager nodeId=0] Node 3001 disconnected. > (org.apache.kafka.clients.NetworkClient)[2023-05-16 06:35:19,642] WARN > [RaftManager nodeId=0] Connection to node 3001 (/192.168.25.232:9093) > could not be established. Broker may not be available. > (org.apache.kafka.clients.NetworkClient)[2023-05-16 06:35:19,643] INFO > [RaftManager nodeId=0] Node 3000 disconnected. > (org.apache.kafka.clients.NetworkClient)[2023-05-16 06:35:19,643] WARN > [RaftManager nodeId=0] Connection to node 3000 (/192.168.25.146:9093) > could not be established. Broker may not be available. > (org.apache.kafka.clients.NetworkClient) > I configured the controller on each broker, the file looks like this: > # Licensed to the Apache Software Foundation (ASF) under one or more# > contributor license agreements. See the NOTICE file distributed with# this > work for additional information regarding copyright ownership.# The ASF > licenses this file to You under the Apache License, Version 2.0# (the > "License"); you may not use this file except in compliance with# the > License. You may obtain a copy of the License at## > http://www.apache.org/licenses/LICENSE-2.0## Unless required by > applicable law or agreed to in writing, software# distributed under the > License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR > CONDITIONS OF ANY KIND, either express or implied.# See the License for the > specific language governing permissions and# limitations under the License. > ## This configuration file is intended for use in KRaft mode, where# > Apache ZooKeeper is not present. See config/kraft/README.md for details.# > ############################# Server Basics ############################# > # The role of this server. Setting this puts us in KRaft > modeprocess.roles=controller > # The node id associated with this instance's rolesnode.id=3000# The > connect string for the controller > quorum#controller.quorum.voters=3000@localhost > :9093controller.quorum.voters=3000@192.168.25.146:9093, > 3001@192.168.25.232:9093, > 3002@192.168.25.172:9093############################# > <http://3002@192.168.25.172:9093#%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23> > Socket Server Settings ############################# > # The address the socket server listens on.# Note that only the controller > listeners are allowed here when `process.roles=controller`, and this > listener should be consistent with `controller.quorum.voters` value.# > FORMAT:# listeners = listener_name://host_name:port# EXAMPLE:# > listeners = PLAINTEXT://your.host.name:9092listeners=CONTROLLER://:9093 > # A comma-separated list of the names of the listeners used by the > controller.# This is required if running in KRaft > mode.controller.listener.names=CONTROLLER > # Maps listener names to security protocols, the default is for them to be > the same. See the config documentation for more > details#listener.security.protocol.map=PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL > # The number of threads that the server uses for receiving requests from > the network and sending responses to the networknum.network.threads=3 > # The number of threads that the server uses for processing requests, > which may include disk I/Onum.io.threads=8 > # The send buffer (SO_SNDBUF) used by the socket > serversocket.send.buffer.bytes=102400 > # The receive buffer (SO_RCVBUF) used by the socket > serversocket.receive.buffer.bytes=102400 > # The maximum size of a request that the socket server will accept > (protection against OOM)socket.request.max.bytes=104857600 > > ############################# Log Basics ############################# > # A comma separated list of directories under which to store log > fileslog.dirs=/data/kraft-controller-logs > # The default number of log partitions per topic. More partitions allow > greater# parallelism for consumption, but this will also result in more > files across# the brokers.num.partitions=1 > # The number of threads per data directory to be used for log recovery at > startup and flushing at shutdown.# This value is recommended to be > increased for installations with data dirs located in RAID > array.num.recovery.threads.per.data.dir=1 > ############################# Internal Topic Settings > ############################## The replication factor for the group > metadata internal topics "__consumer_offsets" and "__transaction_state"# > For anything other than development testing, a value greater than 1 is > recommended to ensure availability such as > 3.offsets.topic.replication.factor=1transaction.state.log.replication.factor=1transaction.state.log.min.isr=1 > ############################# Log Flush Policy > ############################# > # Messages are immediately written to the filesystem but by default we > only fsync() to sync# the OS cache lazily. The following configurations > control the flush of data to disk.# There are a few important trade-offs > here:# 1. Durability: Unflushed data may be lost if you are not using > replication.# 2. Latency: Very large flush intervals may lead to latency > spikes when the flush does occur as there will be a lot of data to flush.# > 3. Throughput: The flush is generally the most expensive operation, and a > small flush interval may lead to excessive seeks.# The settings below allow > one to configure the flush policy to flush data after a period of time or# > every N messages (or both). This can be done globally and overridden on a > per-topic basis. > # The number of messages to accept before forcing a flush of data to > disk#log.flush.interval.messages=10000 > # The maximum amount of time a message can sit in a log before we force a > flush#log.flush.interval.ms=1000 > ############################# Log Retention Policy > ############################# > # The following configurations control the disposal of log segments. The > policy can# be set to delete segments after a period of time, or after a > given size has accumulated.# A segment will be deleted whenever *either* of > these criteria are met. Deletion always happens# from the end of the log. > # The minimum age of a log file to be eligible for deletion due to > agelog.retention.hours=168 > # A size-based retention policy for logs. Segments are pruned from the log > unless the remaining# segments drop below log.retention.bytes. Functions > independently of log.retention.hours.#log.retention.bytes=1073741824 > # The maximum size of a log segment file. When this size is reached a new > log segment will be created.log.segment.bytes=1073741824 > # The interval at which log segments are checked to see if they can be > deleted according# to the retention > policieslog.retention.check.interval.ms=300000# Enable the > migrationzookeeper.metadata.migration.enable=true > # ZooKeeper client configurationzookeeper.connect=localhost:2181 > > > ############################################################################################### > Also this is my setup for the server.properties file: > # Licensed to the Apache Software Foundation (ASF) under one or more# > contributor license agreements. See the NOTICE file distributed with# this > work for additional information regarding copyright ownership.# The ASF > licenses this file to You under the Apache License, Version 2.0# (the > "License"); you may not use this file except in compliance with# the > License. You may obtain a copy of the License at## > http://www.apache.org/licenses/LICENSE-2.0## Unless required by > applicable law or agreed to in writing, software# distributed under the > License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR > CONDITIONS OF ANY KIND, either express or implied.# See the License for the > specific language governing permissions and# limitations under the License. > ## This configuration file is intended for use in KRaft mode, where# > Apache ZooKeeper is not present. See config/kraft/README.md for details.# > ############################# Server Basics ############################# > # The role of this server. Setting this puts us in KRaft > mode#process.roles=broker,controller#process.roles=broker# The node id > associated with this instance's roles#node.id=0broker.id=0 > # The connect string for the controller quorum#controller.quorum.voters= > 3000@192.168.25.146:9093controller.quorum.voters=3000@192.168.25.146:9093, > 3001@192.168.25.232:9093, > 3002@192.168.25.172:9093############################# > <http://3002@192.168.25.172:9093#%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23> > Socket Server Settings ############################# > # The address the socket server listens on.# Combined nodes (i.e. those > with `process.roles=broker,controller`) must list the controller listener > here at a minimum.# If the broker listener is not defined, the default > listener will use a host name that is equal to the value of > java.net.InetAddress.getCanonicalHostName(),# with PLAINTEXT listener name, > and port 9092.# FORMAT:# listeners = listener_name://host_name:port# > EXAMPLE:# listeners = PLAINTEXT://your.host.name > :9092listeners=PLAINTEXT://192.168.25.146:9092 > > # Name of listener used for communication between brokers.# > inter.broker.listener.name=PLAINTEXT > # Listener name, hostname and port the broker will advertise to clients.# > If not set, it uses the value for > "listeners".advertised.listeners=PLAINTEXT://192.168.25.146:9092# A > comma-separated list of the names of the listeners used by the controller.# > If no explicit mapping set in `listener.security.protocol.map`, default > will be using PLAINTEXT protocol# This is required if running in KRaft > mode.controller.listener.names=CONTROLLER > # Maps listener names to security protocols, the default is for them to be > the same. See the config documentation for more > details#listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSLlistener.security.protocol.map=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT# > The number of threads that the server uses for receiving requests from the > network and sending responses to the networknum.network.threads=3 > # The number of threads that the server uses for processing requests, > which may include disk I/Onum.io.threads=8 > # The send buffer (SO_SNDBUF) used by the socket > serversocket.send.buffer.bytes=102400 > # The receive buffer (SO_RCVBUF) used by the socket > serversocket.receive.buffer.bytes=102400 > # The maximum size of a request that the socket server will accept > (protection against OOM)socket.request.max.bytes=104857600 > > ############################# Log Basics ############################# > # A comma separated list of directories under which to store log > fileslog.dirs=/data/kraft > # The default number of log partitions per topic. More partitions allow > greater# parallelism for consumption, but this will also result in more > files across# the brokers.num.partitions=1 > # The number of threads per data directory to be used for log recovery at > startup and flushing at shutdown.# This value is recommended to be > increased for installations with data dirs located in RAID > array.num.recovery.threads.per.data.dir=1 > ############################# Internal Topic Settings > ############################## The replication factor for the group > metadata internal topics "__consumer_offsets" and "__transaction_state"# > For anything other than development testing, a value greater than 1 is > recommended to ensure availability such as > 3.offsets.topic.replication.factor=1transaction.state.log.replication.factor=1transaction.state.log.min.isr=1 > ############################# Log Flush Policy > ############################# > # Messages are immediately written to the filesystem but by default we > only fsync() to sync# the OS cache lazily. The following configurations > control the flush of data to disk.# There are a few important trade-offs > here:# 1. Durability: Unflushed data may be lost if you are not using > replication.# 2. Latency: Very large flush intervals may lead to latency > spikes when the flush does occur as there will be a lot of data to flush.# > 3. Throughput: The flush is generally the most expensive operation, and a > small flush interval may lead to excessive seeks.# The settings below allow > one to configure the flush policy to flush data after a period of time or# > every N messages (or both). This can be done globally and overridden on a > per-topic basis. > # The number of messages to accept before forcing a flush of data to > disk#log.flush.interval.messages=10000 > # The maximum amount of time a message can sit in a log before we force a > flush#log.flush.interval.ms=1000 > ############################# Log Retention Policy > ############################# > # The following configurations control the disposal of log segments. The > policy can# be set to delete segments after a period of time, or after a > given size has accumulated.# A segment will be deleted whenever *either* of > these criteria are met. Deletion always happens# from the end of the log. > # The minimum age of a log file to be eligible for deletion due to > agelog.retention.hours=168 > # A size-based retention policy for logs. Segments are pruned from the log > unless the remaining# segments drop below log.retention.bytes. Functions > independently of log.retention.hours.#log.retention.bytes=1073741824 > # The maximum size of a log segment file. When this size is reached a new > log segment will be created.log.segment.bytes=1073741824 > # The interval at which log segments are checked to see if they can be > deleted according# to the retention > policieslog.retention.check.interval.ms > =300000zookeeper.connect=192.168.25.146:2181 > zookeeper.metadata.migration.enable=trueinter.broker.protocol.version=3.4 > ########################################################################## > i tried to do the next steps, to comment the lines related with zookeeper > (on one of my broker)zookeeper.connect=192.168.25.146:2181 > zookeeper.metadata.migration.enable=trueinter.broker.protocol.version=3.4 > and put this in place of broker.idprocess.roles=broker > node.id=0 > > but after this kafka isn't working anymore. All my brokers are on the same > cluster, so i don't think is a problem with the connection between them. I > think i omitted something in the configurations files. > I want to fully migrate to kraft. Please take a look and tell me if you > have any suggestions. -- -David