kafka 3.5.0 raft协议安装

前言

最近做项目,需要使用kafka进行通信,且只能使用kafka,笔者没有测试集群,就自己搭建了kafka集群,实际上笔者在很早之前就搭建了,因为当时还是zookeeper(简称ZK)注册元数据,现在新版kafka(3.0.0开始)已经自带了元数据能力(使用raft协议)减少了kafka对zk的依赖性。笔者在查询资料发现,说jdk至少jdk11,实测jdk8也能运行,且并不需要网上说的3+4节点,3+3即可,当然理论上broker节点越多越好,但是元数据节点建议3、5个最合适,raft的过半一致性和容错性的综合取舍。

准备

准备kafka安装包:Apache Kafka

笔者使用的kafka 3.5.0和scala 2.13,采用3台虚拟机,当然容器也不是不行,注意持久化pv pvc和配置的管理(ip换成域名,dns的切换支持),中间件建议使用虚拟机,可以降低很多容错性。

jdk使用open jdk,配置java_home和path,以Ubuntu为例

 sudo apt install openjdk-8-jdk-headless

以macOS为例,创建一个ubuntu-server 最小安装的虚拟机(vmware,毕竟个人使用不要钱),然后安装openssh 和 openjdk,然后shutdown now

网络选择桥接,相当于一台“真实在”网络上的一台物理机

这样就得到了

192.168.0.108

192.168.0.107

192.168.0.106

3台虚拟机

步骤

先看kafka集群的架构图,实际上安装的过程就是架构图的执行过程

 

从图中可以看出已经没有zk的存在了,从kafka节点自己管理元数据,通过raft协议选主的方式。

1. kafka的准备

上传kafka安装包,必须是二进制安装包,不要源码包,编译比较麻烦,然后解压

tar -zxvf  kafka_2.13-3.5.0.gz

查看配置目录会发现

明显多了kraft的配置目录,那么如果使用kafka raft元数据中心,则需要修改kraft目录,启动时指定kraft目录的配置

2. 配置修改

raft协议实际上跟zk差不多,使用raft协议的中间件就太多了,但是本质上每个节点都需要一个唯一id,zk也是如此,所以kafka kraft就相当于集成的zk。

在kraft下的有3个文件文件,其中启动相关的是server.properties中

执行配置修改


# The role of this server. Setting this puts us in KRaft mode
process.roles=broker,controller

# The node id associated with this instance's roles
node.id=1

# The connect string for the controller quorum
controller.quorum.voters=1@localhost:9093

############################# 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:9092
listeners=PLAINTEXT://:9092,CONTROLLER://:9093

# 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://localhost: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_SSL

# The number of threads that the server uses for receiving requests from the network and sending responses to the network
num.network.threads=3

# The number of threads that the server uses for processing requests, which may include disk I/O
num.io.threads=8

# The send buffer (SO_SNDBUF) used by the socket server
socket.send.buffer.bytes=102400

# The receive buffer (SO_RCVBUF) used by the socket server
socket.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 files
log.dirs=/tmp/kraft-combined-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=1
transaction.state.log.replication.factor=1
transaction.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 age
log.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 policies
log.retention.check.interval.ms=300000

每一行都有注释,重点关注

笔者设定

192.168.0.106 nodeid 1 

192.168.0.107 nodeid 2

192.168.0.108 nodeid 3

至此配置基本上完成,同理一个节点可以同时是controller和broker,也可以仅仅是controller或者broker,因为controller的负载比较轻,所以一般是和broker一起。其中有个log.dir这个的路径是下面元数据生成的路径(选主)和数据事务日志,索引日志的存储目录

3. 启动

1. 生成uuid

任意找一个节点执行:

./kafka-storage.sh random-uuid

每次执行uuid会不一样,这个uuid标识是一个集群,所以所有节点公用一个uuid,不要每个节点重新生成,会识别不了 

 

然后执行format,如下标红是我生成的,这个每次不是固定的

 ./kafka-storage.sh format -t gZzkfRm4T1y8wSAY-ZNG5Q -c ../config/kraft/server.properties  

 格式化配置文件,同步其他节点

配置文件有什么变化?在日志配置的目录下出现

关键还是meta的文件,有集群id和节点id,版本号,这个对启动至关重要。

即在上面的log.dir的目录生成,所以尽量不能使用临时目录

2. 启动

启动就很简单了,使用刚刚配置的server.properties执行启动即可

./kafka-server-start.sh -daemon ../config/kraft/server.properties

不过为了方便查看启动日志,建议执行日志的console文件输出

 先看事务日志和索引

验证

验证很简单,查看bin同级目录下的日志即可

日志带有[2025-02-08 08:34:12,286] INFO [KafkaRaftServer nodeId=1] Kafka Server started (kafka.server.KafkaRaftServer) 

如果生成用途可以安装kafka的控制台,kafka-ui,不过我这里就不安装了,因为docker安装比较容易。

总结

kafka从3.0.0开始推出了raft模式的元数据中心,实际上类似zk,kafka自己命名kraft。使用这种方式搭建kafka集群将不再需要zk,同理,kafka的集群的每个节点可以同时是broker和controller(以前zk充当),也可以是单独的broker,controller(负载不重,不建议单独controller,跟zk没区别),官方说明需要jdk11及以上,实测jdk8可以运行,但是生成建议严格按照官方标定的jdk执行,jdk是向下兼容的,但是不确定是否会涉及新api或新特性的使用。

另外实际使用中,可能会涉及使用iptables做nat限制kafka的连接方,比如在kafka节点通过iptables限制发送者或者消费端的ip

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 9093 -j DNAT --to-destination kafkaxxx:9093

kafkaxxx --- 指定的是 Kafka 服务所在的机器地址

如果kafka是对接方提供,则在nat打通时,需要客户端连接的服务器也执行iptables,否则可能出现连接kafka正常,但是不能消费。

iptables -t nat -A POSTROUTING -p tcp -m tcp --dport 9093 -j SNAT --to-source natxxx

natxxx --- 指定的是配置 iptables 的本机的地址

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 鼠标轨迹 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…

爬虫技巧汇总

一、UA大列表 USER_AGENT_LIST 是一个包含多个用户代理字符串的列表,用于模拟不同浏览器和设备的请求。以下是一些常见的用户代理字符串: USER_AGENT_LIST [Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; Hot Lingo 2.0),Mozilla…

Microsoft Word xml 字符非法解决

如图,word能正常打开,复制内容到另外一个word时候出错,显示: Microsoft Word很抱歉,无法打开文档,因为内容有问题。确定详细信息(D)详细信息xml 字符非法。位置:行:3,列:2439 解决…

现代神经网络QA(LeNet/AlexNet/VGG/NiN/GooleNet/ResNet)-----一篇搞懂

现代神经网络Q&A-----一篇搞懂 LeNet核心架构 经典卷积神经网络的包括: 带填充以保持分辨率的卷积层;非线性激活函数,如ReLU;汇聚层,如最大汇聚层。 pooling时,使用avg还是max? max&…

数据结构与算法(test2)

五、串 1. 串是由___零___个或___多____个字符组成的有限序列, 又称为___字符串________。 一般记为 S“a1a2.....an” (n > 0), 串中的字符数目n称为串的__长度_____,零个字符的串称为___空串_____. 定义中谈到的"有限"是指长度 n 是一个有限的数值…

Matplotlib基础01( 基本绘图函数/多图布局/图形嵌套/绘图属性)

Matplotlib基础 Matplotlib是一个用于绘制静态、动态和交互式图表的Python库,广泛应用于数据可视化领域。它是Python中最常用的绘图库之一,提供了多种功能,可以生成高质量的图表。 Matplotlib是数据分析、机器学习等领域数据可视化的重要工…

六种负载均衡算法

六种负载均衡算法对比:原理、优缺点及适用场景 负载均衡是分布式系统的核心技术之一,通过合理分配请求流量,确保服务器资源高效利用,提升系统的可用性和响应速度。不同的负载均衡算法适用于不同的场景,以下是六种常见…

公司配置内网穿透方法笔记

一、目的 公司内部有局域网,局域网上有ftp服务器,有windows桌面服务器; 在内网环境下,是可以访问ftp服务器以及用远程桌面登录windows桌面服务器的; 现在想居家办公时,也能访问到公司内网的ftp服务器和win…

Citespace之关键词爆发检测分析(进阶分析)

在开始citespace进行关键词爆发检测分析之前,如果不会使用citespace的,可以参考我之前这一篇博客: https://blog.csdn.net/m0_56184997/article/details/145536095?spm1001.2014.3001.5501 一、创建工程后进行设置 在创建好工程后&#xf…

【文献讲解】《Non-local Neural Networks》

一、引言 传统的深度学习方法(如卷积神经网络CNN和循环神经网络RNN)在捕捉长距离依赖关系时存在局限性。CNN主要关注局部邻域的特征,而RNN则依赖于序列的递归计算,无法直接捕捉全局信息。为了解决这一问题,本文提出了一种非局部神经网络(Non-local Neural Networks),通…

基于 Spring Cloud + Spring AI + VUE 的知识助理平台介绍以及问题

前言(一些废话) 在看这篇文章的各位大佬,感谢你们留出几分钟时间,来看这个产品介绍,其实重点说实话,不是这个产品怎么样。而是在最后有一个郁结在心里的几个问题,希望大佬们能给出一些建议。万…

IDEA安装离线插件(目前提供了MavenHelper安装包)

目录 1、离线安装方式2、Maven Helper 1、离线安装方式 首先访问 IDEA插件网站 下载离线插件安装包,操作如下: 然后打开IDEA的Settings配置,点击Plugins,点击右侧设置按钮(齿轮),选择Install P…

JVM的性能优化

1.方法内联 方法内联,是指 JVM在运行时将调用次数达到一定阈值的方法调用替换为方法体本身 ,从而消除调用成本,并为接下来进一步的代码性能优化提供基础,是JVM的一个重要优化手段之一。 注: C++的inline属于编译后内联,但是java是运行时内联 简单通俗的讲就是把方法内部调…

蓝桥杯小白打卡第四天

1221. 四平方和 问题描述 四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多 4 个正整数的平方和。如果把 0 包括进去,就正好可以表示为 4 个数的平方和。 例如: (5 0^2 0^2 1^2 2^2)(7 1^2 1^2 1^2 2^2) …

【kafka系列】Topic 与 Partition

Kafka 的 Topic(主题) 和 Partition(分区) 是数据组织的核心概念,它们的映射关系及在 Broker 上的分布直接影响 Kafka 的性能、扩展性和容错能力。以下是详细解析: 一、Topic 与 Partition 的映射关系 Top…

哈佛大学“零点项目”(Project Zero)简介

哈佛大学“零点项目”(Project Zero)简介 起源与背景 “零点项目”(Project Zero)由美国哲学家纳尔逊古德曼(Nelson Goodman)于1967年在哈佛大学教育研究院创立。名称源于“从零开始研究艺术教育”的理念&…

【Java基础】为什么不支持多重继承?方法重载和方法重写之间区别、Exception 和 Error 区别?

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:Java基础面经 📚本系列文章为个…

rebase和merge

rebase 和merge区别: rebase变基,改变基底:rebase会抹去提交记录。 git pull 默认merge,git pull --rebase 变基 rebase C、D提交属于feature分支,是基于master分支,在B提交额外拉出来的,当…

科研工作中如何高效利用LabVIEW

LabVIEW作为图形化编程语言,在科研领域广泛应用于数据采集、自动控制、信号处理等任务。如何充分发挥其优势,提高实验效率和数据可靠性,是科研工作者需要重点关注的问题。本文从软件架构、硬件选型、数据处理、调试优化等方面详细探讨LabVIEW…

MybatisPlus整合druid多数据源

1.引入依赖&#xff1a; <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version> </dependency><dependency><groupId>com.baomidou</gro…