KRaft (Kafka 4.0) 集群配置指南(超簡單,脫離 ZooKeeper 集群)還包含了簡化測試指令的腳本!!!

docker-compose方式部署kafka集群

Kafka 4.0 引入了 KRaft 模式(Kafka Raft Metadata Mode),它使 Kafka 集群不再依賴 ZooKeeper 進行元數據管理。KRaft 模式簡化了 Kafka 部署和管理,不需要額外配置 ZooKeeper 服務,使得集群的配置和運維更加高效。

本文將介紹如何配置一個基于 KRaft 模式的 Kafka 集群,步驟簡單明了。我們將從零開始,介紹如何配置 Kafka 集群并進行測試,包括遇到的權限問題以及如何通過自定義工具簡化測試命令。

一、KRaft 模式簡介

KRaft(Kafka Raft Metadata Mode)是 Kafka 在 4.0 版本引入的一個新特性,旨在替代傳統的依賴 ZooKeeper 的架構。在 KRaft 模式下,Kafka 使用內建的 Raft 協議來管理元數據和集群協調,而不需要外部的 ZooKeeper 服務。

主要特點:

  • 不再依賴 ZooKeeper。

  • 使用 Kafka 自帶的 Raft 協議處理元數據和控制器選舉。

  • 簡化了集群配置,降低了維護成本。

二、集群配置

1. 配置主機

在本例中,我們使用了 3 臺主機,每臺主機上啟動一個 Kafka 容器,形成一個簡單的 KRaft 模式集群。

  • 主機 1 (IP: 172.16.0.106):配置為 Kafka 節點 0。

  • 主機 2 (IP: 172.16.0.107):配置為 Kafka 節點 1。

  • 主機 3 (IP: 172.16.0.108):配置為 Kafka 節點 2。

2. Kafka 配置

docker-compose.yml 中,我們配置了 3 個 Kafka 節點的容器,采用 KRaft 模式,并設置了必要的環境變量來啟動集群。
這是第一個節點:0

services:kafka-0:image: bitnami/kafka:4.0.0container_name: kafka-0ports:- "9092:9092"- "9093:9093"environment:- KAFKA_CFG_NODE_ID=0- KAFKA_CFG_PROCESS_ROLES=controller,broker- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@172.16.0.106:9093,1@172.16.0.107:9093,2@172.16.0.108:9093- KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv- KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://172.16.0.106:9092- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2volumes:- /data/kafka/kafka-0:/bitnami/kafka

?這是第一個節點::1

services:kafka-1:image: bitnami/kafka:4.0.0container_name: kafka-1ports:- "9092:9092"- "9093:9093"environment:- KAFKA_CFG_NODE_ID=1- KAFKA_CFG_PROCESS_ROLES=controller,broker- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@172.16.0.106:9093,1@172.16.0.107:9093,2@172.16.0.108:9093- KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv- KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://172.16.0.107:9092- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2volumes:- /data/kafka/kafka-0:/bitnami/kafka

?這是第三個節點:2

services:kafka-2:image: bitnami/kafka:4.0.0container_name: kafka-2ports:- "9092:9092"- "9093:9093"environment:- KAFKA_CFG_NODE_ID=0- KAFKA_CFG_PROCESS_ROLES=controller,broker- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@172.16.0.106:9093,1@172.16.0.107:9093,2@172.16.0.108:9093- KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv- KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://172.16.0.108:9092- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2volumes:- /data/kafka/kafka-0:/bitnami/kafka

?

每個 Kafka 節點的配置都類似,只是 KAFKA_CFG_NODE_IDKAFKA_CFG_ADVERTISED_LISTENERS 不同。

3. 數據持久化

通過 Docker 的 volumes 配置,我們將每個容器的數據目錄掛載到宿主機上,從而實現數據持久化。如下所示:

volumes:- /data/kafka/kafka-0:/bitnami/kafka

這意味著 Kafka 容器中的數據會存儲在宿主機的 /data/kafka/kafka-0 目錄中,即使容器停止或刪除,數據也不會丟失。

三、遇到的權限問題及解決方法

在配置過程中,我遇到了一個權限問題:容器內的腳本無法刪除臨時文件或執行一些操作。

解決方法:

  1. 容器內操作權限問題:由于容器內沒有 sudo 權限,導致無法執行一些文件刪除操作。解決方案是在宿主機上執行相關操作,使用 docker exec 執行命令時確保使用正確的權限。

  2. 文件系統權限:掛載到容器的宿主機目錄 /data/kafka/kafka-0 必須確保有正確的讀寫權限,否則 Kafka 容器無法正常寫入數據。確保宿主機上的目錄擁有正確的權限,例如使用 chmod 命令修改目錄權限。

四、集群測試

測試 Kafka 集群是否成功部署,我們使用了以下步驟:

  1. 啟動 Kafka 容器:使用 docker-compose up?分別啟動集群。

  2. 這個問題!Kafka 在 Docker 容器中運行時,通常會以 1001 這個用戶 ID(UID)來啟動,而宿主機上的目錄默認可能是 root 用戶所有。這就導致了 Kafka 在容器內無法對掛載的目錄進行寫入或修改,因為容器用戶與宿主機目錄的所有者不同。

    解決方法:

    你可以通過更改宿主機目錄的所有者為容器內的 Kafka 用戶(即 UID 1001),這樣容器就能夠正確地訪問和修改該目錄。

    執行以下命令:

sudo chown -R 1001:1001 ./kafka_data

這將會把宿主機上的 ./kafka_data 目錄的所有者更改為 UID 1001,即容器內的 Kafka 用戶。這樣,容器就可以在該目錄下創建所需的文件了。

為什么要這么做?

  • Kafka 容器默認使用 1001 用戶運行,而宿主機的目錄默認是 root 用戶擁有。

  • Docker 容器內的進程沒有 root 權限,因此無法修改宿主機上的目錄(除非你將宿主機目錄的權限改為所有人都能寫入)。

  • 使用 chown -R 1001:1001 將目錄所有者改為容器內 Kafka 用戶,使容器能夠訪問和操作該目錄。

?

  1. 檢查 Kafka 主題:使用

    kafka-topics.sh --list --bootstrap-server localhost:9092

    命令查看集群中的所有主題。

  2. 創建測試主題:通過

    kafka-topics.sh --create --topic test --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1

    創建一個名為 test 的測試主題。

docker exec -it kafka-0 bash
kafka-topics.sh --create --topic test --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
kafka-topics.sh --list --bootstrap-server localhost:9092

五、自定義工具簡化命令

為了方便測試,我編寫了一個自定義工具腳本 kafka-tools.sh,通過簡單的命令執行 Kafka 常用操作:

1.宿主機(容器外部)執行:

vim?kafka-tools.sh

#!/bin/bash# Kafka操作函數# 列出所有主題
kt() {kafka-topics.sh --list --bootstrap-server localhost:9092
}# 生產消息到指定主題
kp() {if [ -z "$1" ]; thenecho "請指定主題名稱!"return 1fikafka-console-producer.sh --broker-list localhost:9092 --topic "$1"
}# 消費指定主題的消息
kc() {if [ -z "$1" ]; thenecho "請指定主題名稱!"return 1fikafka-console-consumer.sh --bootstrap-server localhost:9092 --topic "$1" --from-beginning
}# 刪除指定主題
kd() {if [ -z "$1" ]; thenecho "請指定主題名稱!"return 1fikafka-topics.sh --bootstrap-server localhost:9092 --topic "$1" --delete
}# 查看指定主題描述
kdesc() {if [ -z "$1" ]; thenecho "請指定主題名稱!"return 1fikafka-topics.sh --bootstrap-server localhost:9092 --describe --topic "$1"
}# 創建一個新主題
create_topic() {if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ]; thenecho "請提供主題名稱、分區數和副本數!"return 1fikafka-topics.sh --create --topic "$1" --bootstrap-server localhost:9092 --partitions "$2" --replication-factor "$3"
}# 提示
echo "? Kafka 自定義工具函數已經加載成功(使用方式如下):"
echo "  kt --list            ----查看所有主題"
echo "  kp my-topic          ----使用主題生產"
echo "  kc my-topic          ----使用主題消費"
echo "  kd my-topic          ----刪除主題"
echo "  kdesc my-topic       ----主題描述"
echo "  create_topic my-topic 3 1 ----創建主題 (例如:3個分區,1個副本)"

?

?2.將.sh文件移動到容器內部:

docker cp kafka-tools.sh kafka-0:/tmp/kafka-tools.sh
docker cp kafka-tools.sh kafka-1:/tmp/kafka-tools.sh
docker cp kafka-tools.sh kafka-2:/tmp/kafka-tools.sh

docker cp kafka-tools.sh kafka-0:/tmp/kafka-tools.sh
docker exec -it kafka-0 bash
source /tmp/kafka-tools.sh

?

3.進入容器?
docker exec -it kafka-0 bash
4.執行:
?source /tmp/kafka-tools.sh

?提示:則執行成功
生命周期是每次容器內執行后(容器不死,方便測試,復雜參數的命令還是需要自己去寫或者完善該腳本)

使用方法:

  • kt --list:查看所有 Kafka 主題。

  • kp <topic>:生產消息到指定主題。

  • kc <topic>:消費指定主題的消息。

  • kd <topic>:刪除指定的主題。

  • kdesc <topic>:查看指定主題的描述。

通過這些簡化命令,我可以在容器內快速執行 Kafka 操作,而不需要記住每個命令的詳細參數。

加載成功后,你可以直接在容器內使用簡化命令,極大地方便了測試和管理 Kafka 集群。

六、總結

本文介紹了如何配置 KRaft 模式的 Kafka 4.0 集群,并解決了容器內的權限問題。通過自定義工具腳本,我們將常用的 Kafka 操作簡化為一系列簡單的命令,使得集群管理更加高效。

KRaft 模式是 Kafka 4.0 中的重要特性,它的引入讓 Kafka 不再依賴 ZooKeeper,簡化了集群的部署和管理。希望本文能幫助你順利部署并管理 KRaft 模式的 Kafka 集群。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80287.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80287.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80287.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Admyral - 可擴展的GRC工程自動化平臺

文章目錄 一、關于 Admyral相關鏈接資源關鍵特性 二、安裝系統要求 三、快速開始1、啟動服務 四、核心功能1、自動化即代碼2、AI增強工作流3、雙向同步編輯器4、工作流監控5、企業級基礎設施 五、示例應用六、其他信息許可證遙測說明 一、關于 Admyral Admyral 是一個基于 Pyt…

DDR在PCB布局布線時的注意事項及設計要點

一、布局注意事項 控制器與DDR顆粒的布局 靠近原則&#xff1a;控制器與DDR顆粒應盡量靠近&#xff0c;縮短時鐘&#xff08;CLK&#xff09;、地址/控制線&#xff08;CA&#xff09;、數據線&#xff08;DQ/DQS&#xff09;的走線長度&#xff0c;減少信號延遲差異。 分組隔…

計算機網絡-LDP工作過程詳解

前面我們已經學習了LDP的基礎概念&#xff0c;了解了LDP會話的建立、LDP的標簽控制等知識&#xff0c;今天來整體過一遍LDP的一個工作過程&#xff0c;后面我們再通過實驗深入學習。 一、LDP標簽分發 標簽分發需要基于基礎的路由協議建立LDP會話&#xff0c;激活MPLS和LDP。以…

解構與重構:自動化測試框架的進階認知之旅

目錄 一、自動化測試的介紹 &#xff08;一&#xff09;自動化測試的起源與發展 &#xff08;二&#xff09;自動化測試的定義與目標 &#xff08;三&#xff09;自動化測試的適用場景 二、什么是自動化測試框架 &#xff08;一&#xff09;自動化測試框架的定義 &#x…

跑不出的循環 | LoveySelf 系列定位

最近開始陷入一輪一輪的循環狀態&#xff0c;無奈&#xff0c;只能自我整理一下。23年暑假&#xff0c;在計算機系折騰了一年后&#xff0c;重新打開博客&#xff0c;回想在數學系摸索博客寫作的日子&#xff0c;思緒涌上心頭&#xff0c;我們決定拾起這份力量。當時覺得 hexo …

Redis最新入門教程

文章目錄 Redis最新入門教程1.安裝Redis2.連接Redis3.Redis環境變量配置4.入門Redis4.1 Redis的數據結構4.2 Redis的Key4.3 Redis-String4.4 Redis-Hash4.5 Redis-List4.6 Redis-Set4.7 Redis-Zset 5.在Java中使用Redis6.緩存雪崩、擊穿、穿透6.1 緩存雪崩6.2 緩沖擊穿6.3 緩沖…

一文讀懂Python之requests模塊(36)

一、requests模塊簡介 requests模塊是python中原生的一款基于網絡請求的模塊&#xff0c;功能強大&#xff0c;簡單便捷且高效 &#xff0c;該模塊可以模擬瀏覽器發送請求&#xff0c;主要包括指定url、發起請求、獲取響應數據和持久化存儲&#xff0c;包括 GET、POST、PUT、…

WPF之布局流程

文章目錄 1. 概述2. 布局元素的邊界框3. 布局系統原理3.1 布局流程時序圖 4. 測量階段(Measure Phase)4.1 測量過程4.2 MeasureOverride方法 5. 排列階段(Arrange Phase)5.1 排列過程5.2 ArrangeOverride方法 6. 渲染階段(Render Phase)7. 布局事件7.1 主要布局事件7.2 布局事件…

uniapp|獲取當前用戶定位、與系統設定位置計算相隔米數、實現打卡簽到(可自定義設定位置、位置有效范圍米數)

基于UniApp闡述移動應用開發中定位功能的實現全流程,涵蓋實時定位獲取、動態距離計算與自定義位置、有效范圍設定等功能。文章提供完整的代碼示例與適配方案,適用于社交簽到、課堂教室打卡等場景。 目錄 引言定位功能在移動應用中的價值(社交、導航、O2O等場景)UniApp跨平臺…

Yii2.0 模型規則(rules)詳解

一、基本語法結構 public function rules() {return [// 規則1[[attribute1, attribute2], validator, options > value, ...],// 規則2[attribute, validator, options > value, ...],// 規則3...]; }二、規則類型分類 1、核心驗證器&#xff08;內置驗證器&#xff0…

數據結構(三)——棧和隊列

一、棧和隊列的定義和特點 棧&#xff1a;受約束的線性表&#xff0c;只允許棧頂元素入棧和出棧 對棧來說&#xff0c;表尾端稱為棧頂&#xff0c;表頭端稱為棧底&#xff0c;不含元素的空表稱為空棧 先進后出&#xff0c;后進先出 隊列&#xff1a;受約束的線性表&#xff0…

SQL Server 存儲過程開發三層結構規范

以下是《SQL Server 存儲過程開發三層結構規范》的正式文檔結構&#xff0c;適用于企業級數據庫應用開發場景&#xff0c;有助于團隊協作、代碼審查與自動化運維&#xff1a; &#x1f4d8; SQL Server 存儲過程開發三層結構規范 一、架構設計總覽 三層結構簡介 層級命名約定…

接上篇,解決FramePack啟動報錯:“httpx.ReadError: [WinError 10054] 遠程主機強迫關閉了一個現有的連接。“的問題

#工作記錄 FramePack部署&#xff08;從PyCharm解釋器創建和使用開始&#xff09;保姆級教程-CSDN博客 上篇我們記錄到FramePack從克隆到啟動調試的保姆級教程&#xff0c;關于啟動時會報以下錯誤的問題&#xff0c;已作出解決&#xff1a; 報錯摘錄&#xff1a; (.venv) PS F…

ping_test_parallel.sh 并行網絡掃描腳本

并行網絡掃描腳本分析&#xff1a;提高網絡探測效率 引言腳本概述核心代碼分析顏色定義與初始化并行處理機制并行執行與進程控制結果處理與統計 技術亮點性能分析結論附錄&#xff1a;完整腳本 引言 在網絡管理和運維過程中&#xff0c;快速檢測網段內主機的在線狀態是一項常見…

leetcode 3342. 到達最后一個房間的最少時間 II 中等

有一個地窖&#xff0c;地窖中有 n x m 個房間&#xff0c;它們呈網格狀排布。 給你一個大小為 n x m 的二維數組 moveTime &#xff0c;其中 moveTime[i][j] 表示在這個時刻 以后 你才可以 開始 往這個房間 移動 。你在時刻 t 0 時從房間 (0, 0) 出發&#xff0c;每次可以移…

關于vue-office在vue3工程中的引用報錯問題

在vue3項目工程中&#xff0c;根據vue-office文檔在vue2中的引用&#xff1a; //引入VueOfficeDocx組件 相關樣式import VueOfficeDocx from vue-office/docx;import vue-office/docx/lib/index.css; 報錯信息&#xff1a; [plugin:vite:import-analysis] Failed to resolve …

【macOS常用快捷鍵】

以下是 macOS 最常用快捷鍵列表&#xff0c;按使用頻率由高到低分類整理&#xff0c;涵蓋日常操作、效率工具及系統控制&#xff0c;助你快速提升使用效率&#xff1a; 一、基礎高頻操作 快捷鍵功能說明Command C復制選中內容Command V粘貼Command X剪切Command Z撤銷上一…

mdadm 報錯: buffer overflow detected

最近跑 blktest (https://github.com/osandov/blktests) 時發現 md/001 的測試失敗了 單獨執行&#xff0c;最后定位到是 mdadm 命令報錯: buffer overflow detected 這個 bug 目前已經修復: https://git.kernel.org/pub/scm/utils/mdadm/mdadm.git/commit/?id827e1870f3205…

查看jdk是否安裝并且配置成功?(Android studio安裝前的準備)

WinR輸入cmd打開命令提示窗口 輸入命令 java -version 回車顯示如下&#xff1a;

STM32智能刷卡消費系統(uC/OS-III)

一、項目概述與開發背景 本系統是一款基于STM32微控制器的智能刷卡消費終端&#xff0c;集成RFID識別、OLED顯示、Flash存儲、藍牙通信等核心模塊。項目采用uC/OS-III實時操作系統實現多任務并發處理&#xff0c;適用于校園一卡通、企業食堂等小額支付場景。系統支持定額扣款、…