2024年了,如何更好的搭建Kafka集群?

Kafka的Kraft模式简单来说就是基于raft协议重新实现了zookeeper的功能。传统的zookeeper集群已经被标记为弃用,将在kafka4.0中完全移除。由于去掉了zk组件,部署也简化了不少。我们基于Kraft模式和Docker Compose同时采用最新版Kafka v3.6.1来搭建集群。

Kafka集群概念介绍

Kraft模式集群由两种角色的节点组成,分别是broker和controller角色。角色类型在节点启动时通过process.roles配置参数指定,允许指定brokercontroller,或者同时指定二者,可就是一个节点兼顾两种角色。

  1. broker类型节点的职责是为客户端提供服务,即接收生产者消息,并推送给消费者。还可以与其它broker之间同步副本消息。broker内就是我们熟悉的topic分区副本等结构了。
  2. controller类型的节点可以参与Leader选举,有投票权和被投票权,只有被选举称为Leader节点时才能为集群提供服务。一个集群中只能有一个Leader节点,如果出现多个Leader的异常情况通常被称为脑裂,这不是我们关注的主题。Leader节点负责维护整个集群的元数据与调度broker协同工作,例如创建删除topic、分区重分配、preferred leader选举、topic分区拓展、broker上线下线等。

Kafka集群带来的好处是允许横向扩展broker节点,并且在线就可以完成扩展。

集群拓扑图

我们在宿主机上搭建5个节点的Kafka集群,集群由两个[broker]节点,两个[broker,controller]节点和一个[controller]节点组成,并且使用Docker容器来部署这五个节点。

image.png

我们规划了三种流量路径:

  1. 外部流量 EXTERNAL://:19092,允许外部客户端(生产者、消费者、集群管理工具都算是外部客户端)连接到集群。我们将容器中的端口映射出来,由于集群部署在单机单网卡电脑上,所有端口不允许重复,我们暴漏出4各端口:19092、29092、39092、49092
  2. 控制流量 CONTROLLER://:9093,我们为控制节点间的通信设置了单独的端口9093,以防数据流量过载造成控制信息下发延迟或失败。
  3. 内部流量 INTERNAL://:9092,broker之间同步副本数据走内部端口9092。

实验软件与版本说明

kafka: 3.6.1
docker: 25.0.1
docker compose: v2.24.2

参数解释

如果你的Docker环境已经备好,那么直接将下面的内容复制到yaml,稍作修改就能快速搭建起Kafka集群。

# docker-compose.yaml
services:kafka1:image: 'bitnami/kafka:3.6.1'ports:- '19092:19092'environment:- KAFKA_KRAFT_CLUSTER_ID=EX5bq5NfRe2IX1nhxrSO6g- KAFKA_CFG_NODE_ID=1- KAFKA_CFG_PROCESS_ROLES=broker- KAFKA_CFG_LISTENERS=INTERNAL://:9092, EXTERNAL://:19092- KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://kafka1:9092, EXTERNAL://192.168.56.103:19092- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT, EXTERNAL:PLAINTEXT, CONTROLLER:PLAINTEXT- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=3@kafka3:9093, 4@kafka4:9093, 5@kafka5:9093- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNALnetworks:- kfk-networkkafka2:image: 'bitnami/kafka:3.6.1'ports:- '29092:19092'environment:- KAFKA_KRAFT_CLUSTER_ID=EX5bq5NfRe2IX1nhxrSO6g- KAFKA_CFG_NODE_ID=2- KAFKA_CFG_PROCESS_ROLES=broker- KAFKA_CFG_LISTENERS=INTERNAL://:9092, EXTERNAL://:19092- KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://kafka2:9092, EXTERNAL://192.168.56.103:29092- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT, EXTERNAL:PLAINTEXT, CONTROLLER:PLAINTEXT- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=3@kafka3:9093, 4@kafka4:9093, 5@kafka5:9093- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNALnetworks:- kfk-networkkafka3:image: 'bitnami/kafka:3.6.1'ports:- '39092:19092'environment:- KAFKA_KRAFT_CLUSTER_ID=EX5bq5NfRe2IX1nhxrSO6g- KAFKA_CFG_NODE_ID=3- KAFKA_CFG_PROCESS_ROLES=broker,controller- KAFKA_CFG_LISTENERS=INTERNAL://:9092, EXTERNAL://:19092, CONTROLLER://:9093- KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://kafka3:9092, EXTERNAL://192.168.56.103:39092- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT, EXTERNAL:PLAINTEXT, CONTROLLER:PLAINTEXT- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=3@kafka3:9093, 4@kafka4:9093, 5@kafka5:9093- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNALnetworks:- kfk-networkkafka4:image: 'bitnami/kafka:3.6.1'ports:- '49092:19092'environment:- KAFKA_KRAFT_CLUSTER_ID=EX5bq5NfRe2IX1nhxrSO6g- KAFKA_CFG_NODE_ID=4- KAFKA_CFG_PROCESS_ROLES=broker,controller- KAFKA_CFG_LISTENERS=INTERNAL://:9092, EXTERNAL://:19092, CONTROLLER://:9093- KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://kafka4:9092, EXTERNAL://192.168.56.103:49092- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT, EXTERNAL:PLAINTEXT, CONTROLLER:PLAINTEXT- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=3@kafka3:9093, 4@kafka4:9093, 5@kafka5:9093- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNALnetworks:- kfk-networkkafka5:image: 'bitnami/kafka:3.6.1'ports:- '59092:19092'environment:- KAFKA_KRAFT_CLUSTER_ID=EX5bq5NfRe2IX1nhxrSO6g- KAFKA_CFG_NODE_ID=5- KAFKA_CFG_PROCESS_ROLES=controller- KAFKA_CFG_LISTENERS=CONTROLLER://:9093- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT, EXTERNAL:PLAINTEXT, CONTROLLER:PLAINTEXT- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=3@kafka3:9093, 4@kafka4:9093, 5@kafka5:9093- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLERnetworks:- kfk-network
networks:kfk-network:name: kfk-networkexternal: true

我这边宿主机IP是192.168.56.103,你需要将它改为你IP地址,执行下面指令应该就能启动成功:

# 创建网络
docker network create kfk-network
# 拉取镜像
docker compose pull
# 运行容器
docker compose up -d

如果你的运行过程中遇到问题可以欢迎留言讨论。

我们不但要把集群运行起来,还要理解这些参数的含义。上面的compose文件中使用环境变量作为启动参数传递给Kafka,与直接修改配置文件效果一样。在Kraft模式下,Kafka有如下三个配置文件可以配置。

  • config/kraft/broker.properties 当节点作为[broker]角色运行时,会去读该文件中的配置项启动。
  • config/kraft/controller.properties 当节点作为[controller]角色运行时,会去读该文件中的配置项启动。
  • config/kraft/server.properties 当节点同时作为[broker, controller]角色运行时,会去读该文件中的配置项启动。

接下来我们来看看这些文件内常用的配置项:

  • KAFKA_KRAFT_CLUSTER_ID:配置集群ID,这个配置项比较特殊,并未在上面列举的配置文件中,而是位于一个自动生成的配置文件meta.properties中,位置不固定,具体位置由bin/kafka-storage.sh命令执行完打印的参数决定。该配置文件中定义了cluster.id,即同一个集群中的所有节点都应该指定相同的集群ID。
  • KAFKA_CFG_NODE_ID:配置节点ID,同一集群内节点ID不允许重复。
  • KAFKA_CFG_PROCESS_ROLES:指定节点的角色,允许指定brokercontroller,或者同时指定二者,可就是一个节点兼顾两种角色。
  • KAFKA_CFG_LISTENERS:列出节点监听器,通常不同的角色会监听不同的端口,它的格式是{LISTENER_NAME}://{hostname}:{port},要搞懂它的配置策略你可以阅读一文搞懂Kafka中的listeners配置策略
  • KAFKA_CFG_ADVERTISED_LISTENERS:listeners选项配置了以怎样的协议监听某个端口。这个配置项类似防火墙的作用,对外公开允许它们使用怎样的IP和端口访问集群,这里外部指的是客户端(包括生产者、消费者、管理脚本等)或其它broker节点。
  • KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP:配置监听器对应的安全协议。
  • KAFKA_CFG_CONTROLLER_QUORUM_VOTERS:指定集群内所有的controller节点,格式为:nodeId@ip:port。
  • KAFKA_CFG_CONTROLLER_LISTENER_NAMES:指定controller监听器名称列表。
  • KAFKA_CFG_INTER_BROKER_LISTENER_NAME:指定其它broker节点与本节点通信的监听器。

由上面这些配置可以看出,凡是以KAFKA_CFG_开头的环境变量,在配置kraft配置文件中都有对应的配置项。例如KAFKA_CFG_NODE_ID在配置文件中就是node.id

测试生产消费

# 创建主题
bin/kafka-topics.sh --create --topic test-tip --bootstrap-server=192.168.56.103:19092
# 往cssyy主题推送消息
bin/kafka-console-producer.sh --bootstrap-server=192.168.56.103:19092 --topic cssyy
>程序饲养员放假啦
>程序饲养员上班啦
# 从头开始消费cssyy主题消息
bin/kafka-console-consumer.sh --bootstrap-server=192.168.56.103:19092 --topic cssyy --from-beginning
程序饲养员放假啦
程序饲养员上班啦

查看集群当前状态参数

# 查看集群信息
bin/kafka-metadata-quorum.sh --bootstrap-server 192.168.56.103:19092:19092 desbe --status
ClusterId:              EX5bq5NfRe2IX1nhxrSO6g
LeaderId:               4
LeaderEpoch:            1
HighWatermark:          2817
MaxFollowerLag:         0
MaxFollowerLagTimeMs:   341
CurrentVoters:          [3,4,5]
CurrentObservers:       [1,2]# 查看节点复制信息
bin/kafka-metadata-quorum.sh --bootstrap-server 192.168.56.103:19092:19092 describe --replication
NodeId  LogEndOffset    Lag     LastFetchTimestamp      LastCaughtUpTimestamp   Status
4       2959            0       1706702371530           1706702371530           Leader
3       2959            0       1706702371114           1706702371114           Follower
5       2959            0       1706702371114           1706702371114           Follower
1       2959            0       1706702371112           1706702371112           Observer
2       2959            0       1706702371113           1706702371113           Observer

最好的办法是有个图形化的工具来查看这些信息,Kafka免费的工具实在没有好用的,也就是Offset Explorer还勉强能用,如果你有更好用的工具可以分享一下。

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/252291.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ARM 嵌入式 编译系列 2.7 -- GCC 编译优化参数详细介绍】

请阅读【嵌入式开发学习必备专栏 】 文章目录 GCC 编译优化概述常用优化等级-O1 打开的优化选项-O2 打开的优化选项-O3 打开的优化选项-Os 打开的优化选项优化技术使用优化选项的注意事项GCC 编译优化概述 GCC(GNU Compiler Collection)包含了用于C、C++、Objective-C、Fort…

ubuntu系统下c++ cmakelist vscode debug(带传参的debug)的详细示例

c和cmake的debug,网上很多都需要配置launch.json,cpp.json啥的,记不住也太复杂了,我这里使用cmake插件带有的设置,各位可以看一看啊✌(不知不觉,竟然了解了vscode中配置文件的生效逻辑🤣) 克隆…

linux中的mtime,ctime,atime

目录 结论 文件 touch新文件 调整文件内容 echo直接修改 vi修改 修改文件属性 调整归属 调整权限 读取文件 目录 增加文件 调整目录下文件属性 访问目录下文件 删除文件 结论 mtime:文件内容的修改时间(不含权限、属组修改) …

centos7 在线编译安装 CMake 3.5.1 shell脚本

脚本 要在CentOS 7上在线编译安装CMake 3.5.1,你可以使用以下shell脚本作为参考: #!/bin/bash# 设置下载和安装目录 DOWNLOAD_DIR"/tmp/cmake_download" INSTALL_DIR"/opt/cmake"# 创建目录 mkdir -p $DOWNLOAD_DIR mkdir -p $INS…

浅谈QT的几种线程的使用和区别。

简介: 线程是操作系统中的基本执行单元,是一个独立的执行路径。每个线程都有自己的栈空间,用于存储本地变量和函数调用的上下文。多个线程可以在同一进程中并发执行,从而实现并发处理,提高程序的性能和响应能力。 与进…

【Leetcode】1696. 跳跃游戏 VI

文章目录 题目思路代码结果 题目 题目链接 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 一开始你在下标 0 处。每一步,你最多可以往前跳 k 步,但你不能跳出数组的边界。也就是说,你可以从下标 i 跳到 [i 1, min(n -…

【Unity3D小技巧】Unity3D中UI控制解决方案

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 在开发中总是会控制UI界面,如何优雅的控制UI界面是…

3.0 Zookeeper linux 服务端集群搭建步骤

本章节将示范三台 zookeeper 服务端集群搭建步骤。 所需准备工作,创建三台虚拟机环境并安装好 java 开发工具包 JDK,可以使用 VM 或者 vagrantvirtualbox 搭建 centos/ubuntu 环境,本案例基于宿主机 windows10 系统同时使用 vagrantvirtualb…

centos 7.6 安装 openldap 2.5.17

centos 7.6 安装ldap 1、下载ldap2、安装ldap2.1、官方参考文档2.2、安装前准备2.2.1、安装gcc2.2.2、安装Cyrus SASL 2.1.272.2.3、安装OpenSSL 1.1.12.2.3.1、下载openssl 3.02.2.3.2、安装依赖包2.2.3.3、编译安装openssl 3.0 2.2.3、安装libevent 2.1.82.2.4、安装libargon…

小程序支付类型接入京东支付

一、情景描述 当前项目想在微信小程序付款时添加上京东支付支付类型,效果如下 普通的付款方式可以直接付款就能完成支付,但京东支付无法在小程序上直接付款,他需要复制生成的链接,然后打开京东app然后在京东平台上付款。 所以&…

网络安全大赛

网络安全大赛 网络安全大赛的类型有很多,比赛类型也参差不齐,这里以国内的CTF网络安全大赛里面著名的的XCTF和强国杯来介绍,国外的话用DenCon CTF和Pwn2Own来举例 CTF CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相…

【开源】JAVA+Vue+SpringBoot实现二手车交易系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 二手车档案管理模块2.3 车辆预约管理模块2.4 车辆预定管理模块2.5 车辆留言板管理模块2.6 车辆资讯管理模块 三、系统设计3.1 E-R图设计3.2 可行性分析3.2.1 技术可行性分析3.2.2 操作可行性3.2.3 经济…

第7节、双电机直线运动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】,查看本系列全部文章 摘要:前面章节主要介绍单个电机控制,本节内容介绍两个电机完成Bresenham直线运动 一、Bresenham直线算法介绍 Bresenham直线算法由Jack Elton Bresenham于1962年在IBM开发,最初用于计…

python创建pdf文件

目录 一:使用reportlab库 二:使用使pdf库 在Python中生成PDF文件可以使用多种库,其中最常用的是reportlab和fpdf。以下是使用这两个库生成PDF文件的示例代码: 一:使用reportlab库 1:写入文字信息 from r…

使用Pycharm在本地调用chatgpt的接口

目录 1.安装环境 2.建立多轮对话的完整代码(根据自己使用的不同代理需要修改端口(port)) 3.修改代码在自己的Pycharm上访问chagpt的api并实现多轮对话,如果不修改是无法成功运行的。需要确定秘钥和端口以保证正常访…

Kafka 使用手册

kafka3.0 文章目录 kafka3.01. 什么是kafka?2. kafka基础架构3. kafka集群搭建4. kafka命令行操作主题命令行【topic】生产者命令行【producer】消费者命令行【consumer】 5. kafka生产者生产者消息发送流程Producer 发送原理普通的异步发送带回调函数的异步发送同步…

【VUE】UniAPP之uview组件库,自定义tag封装,支持添加u-icon图标

组件代码 <template><view class"tag" :class"[props.mode, props.shape]"><slot name"left"><!-- icon图标 没有传入图标时不显示 --><u-icon v-if"props.icon ! " :name"props.icon" :color&…

基于单片机的智能燃气灶控制系统设计

摘要&#xff1a;针对传统燃气灶存在不能防干烧、不能进行温度检测、不能进行火力自动调节等问题&#xff0c;设计了一种基于单片机控制的智能燃气灶&#xff0c;它通过单片机进行控制&#xff0c;由开关模块、测温模块、语音播报模块、火力控制模块和防空烧模块五个模块组成&a…

目标检测:3采用YOLOv8 API训练自己的模型

​ 目录 ​1.YOLOv8 的新特性 2.如何使用 YOLOv8? 3使用YOLOv8训练模型 4.验证训练集 5.测试训练集 6.测验其他图片 7 其他问题 参考: 1.YOLOv8 的新特性 Ultralytics 为 YOLO 模型发布了一个全新的存储库。它被构建为 用于训练对象检测、实例分割和图像分类模型的统…

JVM工作原理与实战(三十六):GraalVM虚拟机

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、GraalVM介绍 二、GraalVM的两种运行模式 三、GraalVM应用场景 1.GraalVM存在的问题 2.GraalVM企业级应用-Serverless架构 3.Serverless架构-函数计算 4.Serverless架构-Serve…