From 598044baaa6fe45094b5994f655f379943a78e5c Mon Sep 17 00:00:00 2001
From: Akkishiva1 <142904126+Akkishiva1@users.noreply.github.com>
Date: Sun, 21 Jul 2024 22:39:13 +0530
Subject: [PATCH 01/58] Added the file
converted to markdown format
---
_posts/Migrating Zookeeper to kraft.md | 390 +++++++++++++++++++++++++
1 file changed, 390 insertions(+)
create mode 100644 _posts/Migrating Zookeeper to kraft.md
diff --git a/_posts/Migrating Zookeeper to kraft.md b/_posts/Migrating Zookeeper to kraft.md
new file mode 100644
index 0000000000..3991b2b7b5
--- /dev/null
+++ b/_posts/Migrating Zookeeper to kraft.md
@@ -0,0 +1,390 @@
+
+
Introduction
+
+In its evolution, Kafka has recently shifted away from relying on ZooKeeper to
+manage its essential metadata and now embraces a quorum-based controller using
+Kafka Raft, or KRaft (pronounced 'craft'), which has been generally available
+since Confluent Platform version 7.4.
+
+
+Apache Kafka has traditionally entrusted ZooKeeper with crucial tasks such as
+storing metadata, managing brokers, controlling topics, and overseeing cluster
+configurations. Initially, this centralized approach with ZooKeeper was ideal
+for ensuring robust distributed coordination and reliable leader election
+mechanisms. However, the complexity of maintaining ZooKeeper alongside a Kafka
+cluster has become evident over time. Moreover, ZooKeeper's limitations have
+emerged as a bottleneck, restricting the scalability of Kafka clusters by
+limiting the number of partitions a single broker can effectively manage.
+
+
+Recognizing these challenges and seeking to streamline Kafka's architecture, the
+Kafka community introduced KIP-500.
+This initiative aims to phase out ZooKeeper and introduce a more efficient
+metadata quorum solution. This blog post is dedicated to guiding you through the
+transition from ZooKeeper to KRaft. We will provide a step-by-step roadmap for
+migrating your Kafka deployment to KRaft.
+
+
+Why Bye to ZooKeeper ?
+
+
+ZooKeeper data is replicated across a number of nodes forming an ensemble, using
+the ZooKeeper Atomic Broadcast (ZAB) protocol to ensure data consistency across
+all nodes. However, integrating ZooKeeper with Kafka involves managing a
+separate distributed system alongside Kafka itself, which introduces additional
+complexities in deployment, management, and troubleshooting.
+
+
+Moreover, ZooKeeper introduces scalability bottlenecks that limit the number of
+topics and partitions supported within a Kafka cluster. For example, during
+controller failover events, the newly elected controller must retrieve metadata
+from ZooKeeper, including details for all topics, which can impact performance.
+Additionally, any metadata updates require propagation to other brokers via
+RPCs, and as the number of partitions increases, the propagation time grows,
+potentially slowing down the system.
+
+
+In contrast, other distributed systems like MongoDB, Cassandra, and
+Elasticsearch handle metadata management internally, eliminating the need for
+external tools like ZooKeeper. This streamlined approach significantly
+simplifies deployment and operational management—imagine handling just one
+distributed system instead of two! Furthermore, internal metadata management
+enhances scalability and efficiency, optimizing operations and providing
+stronger guarantees for Kafka's functionality.
+
+
+Hello from KRaft!
+
+
+To address challenges with ZooKeeper, the Kafka community introduced KRaft, a
+new way to handle metadata directly within Kafka itself. Unlike ZooKeeper, which
+required managing a separate system alongside Kafka, KRaft integrates metadata
+management into Kafka using an event-driven approach.
+
+
+KRaft uses a quorum-based controller with an event-driven implementation of the
+Raft protocol. This controller manages an event log stored in a special topic
+named "__cluster_metadata." Unlike regular topics, data in "__cluster_metadata"
+is written synchronously to disk, ensuring reliability required by Raft.
+
+
+Advantages of KRaft
+
+
+- Simplicity: KRaft streamlines Kafka’s architecture by
+eliminating the need for a separate coordination service like ZooKeeper. Users
+and operators only need to manage one system, and KRaft uses the same
+configuration, failure handling, and security mechanisms as Kafka’s data plane,
+making it easier to learn and operate.
+
- Scalability: KRaft enhances Kafka’s scalability by reducing
+the load on the metadata store. In KRaft mode, only a subset of brokers, known
+as the controller quorum, handles metadata. This setup minimizes connections and
+requests to the metadata store, enabling Kafka to support more brokers and
+topics without impacting performance.
+
- Availability: KRaft improves Kafka’s availability by
+allowing the system to handle partial failures. Only a quorum of controllers is
+needed to process requests, so if some controllers are down or disconnected, the
+remaining ones can still maintain cluster operations. This makes Kafka more
+resilient to network issues and data center failures.
+
+
+
+- Simplified Deployment and Management: With KRaft, you no
+longer need to manage a separate ZooKeeper cluster, reducing operational
+complexity and costs. Kafka users can continue using existing tools and APIs,
+such as the Admin API and kafka-reassign-partitions tool, for managing their
+clusters.
+
- Increased Security: KRaft supports encryption and
+authentication for client-server communication using SSL/TLS or SASL, ensuring
+that Kafka metadata is protected from unauthorized access or tampering.
+
+
+
+By adopting KRaft, Kafka enhances its scalability, simplifies operations, and
+integrates metadata management directly into its architecture, offering a more
+efficient alternative to ZooKeeper.
+
+
+How to migrate from ZooKeeper to KRaft
+
+
+While KRaft has been production-ready for several releases now, with continuous
+feature enhancements, the majority of existing Kafka clusters still rely on
+ZooKeeper. However, there's growing interest among users to migrate to KRaft to
+overcome the limitations associated with ZooKeeper, as discussed earlier.
+
+
+Moreover, ZooKeeper will be deprecated within the Kafka project, with support
+expected to be fully removed in an upcoming release. This development
+underscores the urgency for Kafka users to plan and execute migrations from
+ZooKeeper to KRaft.
+
+
+Before beginning the migration process, our Kafka brokers are currently
+operating in ZooKeeper-mode and are connected to the ZooKeeper ensemble where
+metadata is stored. Let's follow the steps below to migrate to KRaft.
+
+
+Step 1: Retrieve the cluster ID
+
+
+- You must format storage for your Kafka cluster with the ID of the existing
+cluster. You can get this ID with the zookeeper-shell tool.
+
+
+
+
+
+
+Step 2: Configure a KRaft controller quorum
+
+
+- Set up the KRaft controller quorum responsible for managing metadata in
+KRaft mode.
+
- Number of KRaft controller nodes should match the current ZooKeeper ensemble
+size.
+
- Migration does not support transitioning to "combined" mode nodes.
+
- Configure each KRaft controller node with connections to ZooKeeper.
+
- Add the flag zookeeper.metadata.migration.enable=true to signal the
+migration intent.
+
- Upon startup, KRaft controllers establish a quorum and elect a leader.
+
- Controllers enter a waiting state for Kafka brokers to register.
+
+
+
+
+
+
+process.roles=controller
+node.id=3000
+controller.quorum.voters=3000@localhost:9093
+controller.listener.names=CONTROLLER
+listeners=CONTROLLER://:9093
+
+
+# Enable the migration
+ zookeeper.metadata.migration.enable=true
+
+
+# ZooKeeper client configuration
+ zookeeper.connect=localhost:2181
+
+
+# Enable migrations for cluster linking
+ confluent.cluster.link.metadata.topic.enable=true
+
+
+# Other configuration entries ...
+
+
+Step 3: Format storage with the ID you saved previously
+
+
+- Format storage on each node with the ID and the controller configuration
+file.
+
+
+
+
+
+
+Step 4: Start each controller
+
+
+- Start each controller, specifying the configuration file with migration
+enabled.
+
+
+
+
+
+
+./bin/kafka-server-start.sh ./etc/kafka/kraft/controller.properties
+
+Step 5: Enable migration on the brokers
+
+
+
+
+
+
+broker.id=0
+listeners=PLAINTEXT://:9092
+advertised.listeners=PLAINTEXT://localhost:9092
+listener.security.protocol.map=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
+
+
+# Set the IBP
+ inter.broker.protocol.version=3.6
+
+
+# Enable the migration
+ zookeeper.metadata.migration.enable=true
+
+
+# Cluster linking metadata topic enabled
+ confluent.cluster.link.metadata.topic.enable=true
+
+
+# ZooKeeper client configuration
+ zookeeper.connect=localhost:2181
+
+
+# KRaft controller quorum configuration
+ controller.quorum.voters=3000@localhost:9093
+ controller.listener.names=CONTROLLER
+
+
+Step 6: Migrate the brokers
+
+
+
+
+
+
+process.roles=broker
+node.id=0
+listeners=PLAINTEXT://:9092
+advertised.listeners=PLAINTEXT://localhost:9092
+listener.security.protocol.map=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
+
+
+# Remove the IBP, KRaft uses "metadata.version" feature flag
+# inter.broker.protocol.version=3.6
+
+
+# Remove the migration enabled flag
+# zookeeper.metadata.migration.enable=true
+
+
+# Remove the cluster linking metadata topic setting
+# confluent.cluster.link.metadata.topic.enable=true
+
+
+# Remove ZooKeeper client configuration
+# zookeeper.connect=localhost:2181
+
+
+# Keep the KRaft controller quorum configuration
+ controller.quorum.voters=3000@localhost:9093
+ controller.listener.names=CONTROLLER
+
+
+# If using ACLs, change the authorizer from AclAuthorizer used for ZooKeeper to the StandardAuthorizer used for KRaft.
+ authorizer.class.name=kafka.security.authorizer
+
+
+Step 7: Take KRaft controllers out of migration mode
+
+
+- Disable Migration: Comment out or remove the
+zookeeper.metadata.migration.enable=true property. This signals that the
+controllers are no longer in migration mode and are fully operational in KRaft
+mode.
+
- Remove ZooKeeper Configuration: Comment out or remove any ZooKeeper-specific
+configuration entries (zookeeper.connect=localhost:2181 in this example). Since
+KRaft mode no longer relies on ZooKeeper for metadata management, these entries
+are no longer needed.
+
+ Example controller.properties
File for KRaft Mode
+
+
+
+
+
+process.roles=controller
+node.id=3000
+controller.quorum.voters=3000@localhost:9093
+controller.listener.names=CONTROLLER
+listeners=CONTROLLER://:9093
+
+
+# Disable migration
+# zookeeper.metadata.migration.enable=true
+
+
+# Remove ZooKeeper client configuration.
+# zookeeper.connect=localhost:2181
+
+
+
+Conclusion
+
+
+In this article, we've explored the role of ZooKeeper in Kafka and why Kafka has
+opted to transition to a quorum-based controller, KRaft. The Apache Kafka
+community has deprecated ZooKeeper for storing cluster metadata, with plans for
+complete removal in the upcoming version release. This signifies that users will
+need to transition towards KRaft-based clusters in the near future. Given the
+prevalence of ZooKeeper-based clusters currently in production, migrating to
+KRaft involves significant manual intervention, including configuration updates
+and rolling node restarts.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+gd2md-html: xyzzy Sun Jul 21 2024
\ No newline at end of file
From d67ccf3deccf2c47b90edfcbd4a377814c3c38e4 Mon Sep 17 00:00:00 2001
From: Akkishiva1 <142904126+Akkishiva1@users.noreply.github.com>
Date: Sun, 21 Jul 2024 22:52:25 +0530
Subject: [PATCH 02/58] Update and rename Migrating Zookeeper to kraft.md to
Migrating-Zookeeper-to-kraft.md
---
...ng Zookeeper to kraft.md => Migrating-Zookeeper-to-kraft.md} | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
rename _posts/{Migrating Zookeeper to kraft.md => Migrating-Zookeeper-to-kraft.md} (97%)
diff --git a/_posts/Migrating Zookeeper to kraft.md b/_posts/Migrating-Zookeeper-to-kraft.md
similarity index 97%
rename from _posts/Migrating Zookeeper to kraft.md
rename to _posts/Migrating-Zookeeper-to-kraft.md
index 3991b2b7b5..f28eec5d32 100644
--- a/_posts/Migrating Zookeeper to kraft.md
+++ b/_posts/Migrating-Zookeeper-to-kraft.md
@@ -387,4 +387,4 @@ and rolling node restarts.
-gd2md-html: xyzzy Sun Jul 21 2024
\ No newline at end of file
+gd2md-html: xyzzy Sun Jul 21 2024
From 7c8e489874c6803c1f6c3692a48cb5765528cc9f Mon Sep 17 00:00:00 2001
From: Akkishiva1 <142904126+Akkishiva1@users.noreply.github.com>
Date: Sun, 21 Jul 2024 22:53:06 +0530
Subject: [PATCH 03/58] Update Migrating-Zookeeper-to-kraft.md
---
_posts/Migrating-Zookeeper-to-kraft.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/_posts/Migrating-Zookeeper-to-kraft.md b/_posts/Migrating-Zookeeper-to-kraft.md
index f28eec5d32..5f0cea7595 100644
--- a/_posts/Migrating-Zookeeper-to-kraft.md
+++ b/_posts/Migrating-Zookeeper-to-kraft.md
@@ -2,7 +2,7 @@
* ERRORs: 0
* WARNINGs: 0
* ALERTS: 2 -->
-Introduction
+Introduction
In its evolution, Kafka has recently shifted away from relying on ZooKeeper to
manage its essential metadata and now embraces a quorum-based controller using
From 82fd3859b275f5e73cf8aeb8a729404b9b00f690 Mon Sep 17 00:00:00 2001
From: Akkishiva1 <142904126+Akkishiva1@users.noreply.github.com>
Date: Sun, 21 Jul 2024 22:54:12 +0530
Subject: [PATCH 04/58] Update Migrating-Zookeeper-to-kraft.md
---
_posts/Migrating-Zookeeper-to-kraft.md | 1 -
1 file changed, 1 deletion(-)
diff --git a/_posts/Migrating-Zookeeper-to-kraft.md b/_posts/Migrating-Zookeeper-to-kraft.md
index 5f0cea7595..955cbfd4d4 100644
--- a/_posts/Migrating-Zookeeper-to-kraft.md
+++ b/_posts/Migrating-Zookeeper-to-kraft.md
@@ -387,4 +387,3 @@ and rolling node restarts.
-
gd2md-html: xyzzy Sun Jul 21 2024
From 54a42bf821b7d2a1dd95230de1af4b37815a2a52 Mon Sep 17 00:00:00 2001
From: Akkishiva1 <142904126+Akkishiva1@users.noreply.github.com>
Date: Sun, 21 Jul 2024 23:05:07 +0530
Subject: [PATCH 05/58] insert images
---
_posts/migration/images | 1 +
1 file changed, 1 insertion(+)
create mode 100644 _posts/migration/images
diff --git a/_posts/migration/images b/_posts/migration/images
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/_posts/migration/images
@@ -0,0 +1 @@
+
From 6c8612e3c65abaed66f4e76cc783c9e056366300 Mon Sep 17 00:00:00 2001
From: Akkishiva1 <142904126+Akkishiva1@users.noreply.github.com>
Date: Sun, 21 Jul 2024 23:05:53 +0530
Subject: [PATCH 06/58] Delete _posts/migration/images
---
_posts/migration/images | 1 -
1 file changed, 1 deletion(-)
delete mode 100644 _posts/migration/images
diff --git a/_posts/migration/images b/_posts/migration/images
deleted file mode 100644
index 8b13789179..0000000000
--- a/_posts/migration/images
+++ /dev/null
@@ -1 +0,0 @@
-
From cafe2e0ebcb910e6e76646969ebc7b8df3d5d2a6 Mon Sep 17 00:00:00 2001
From: Akkishiva1 <142904126+Akkishiva1@users.noreply.github.com>
Date: Sun, 21 Jul 2024 23:06:52 +0530
Subject: [PATCH 07/58] insert images
---
_posts/migrations/images | 1 +
1 file changed, 1 insertion(+)
create mode 100644 _posts/migrations/images
diff --git a/_posts/migrations/images b/_posts/migrations/images
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/_posts/migrations/images
@@ -0,0 +1 @@
+
From 2d21f06adfbde51bcfcd6ea677909c9a62f023e5 Mon Sep 17 00:00:00 2001
From: Akkishiva1 <142904126+Akkishiva1@users.noreply.github.com>
Date: Sun, 21 Jul 2024 23:12:08 +0530
Subject: [PATCH 08/58] Add files via upload
---
_posts/migrations/0_TB4m7ZfPMgHF_ljN.png | Bin 0 -> 758029 bytes
.../Screenshot from 2024-07-21 23-09-32.png | Bin 0 -> 51052 bytes
.../Screenshot from 2024-07-21 23-10-03.png | Bin 0 -> 22874 bytes
3 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 _posts/migrations/0_TB4m7ZfPMgHF_ljN.png
create mode 100644 _posts/migrations/Screenshot from 2024-07-21 23-09-32.png
create mode 100644 _posts/migrations/Screenshot from 2024-07-21 23-10-03.png
diff --git a/_posts/migrations/0_TB4m7ZfPMgHF_ljN.png b/_posts/migrations/0_TB4m7ZfPMgHF_ljN.png
new file mode 100644
index 0000000000000000000000000000000000000000..2468979155987e29a27db802908c54683db6222f
GIT binary patch
literal 758029
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