Kafka——两种集群搭建详解 k8s
1、简介
Kafka是一个能够支持高并发以及流式消息处理的消息中间件,并且Kafka天生就是支持集群的,今天就主要来介绍一下如何搭建Kafka集群。
Kafka目前支持使用Zookeeper模式搭建集群以及KRaft模式(即无Zookeeper)模式这两种模式搭建集群,这两种模式各有各的好处,今天就来分别介绍一下这两种方式
1.1、Kafka集群中的节点类型
一个Kafka集群是由下列几种类型的节点构成的,它们充当着不同的作用:
Broker节点:即代理节点,是Kafka中的工作节点,充当消息队列的角色,负责储存和处理消息,每个Broker都是一个独立的Kafka服务器,可以在不同的机器上运行,除此之外Broker还负责分区(partition)的管理,将主题(topic)划分为多个分区,并分布在集群的不同Broker上
Controller节点:即控制器节点,是集群中的特殊节点,负责储存和管理整个集群元数据和状态,它能够监控整个集群中的Broker,在需要时还能够进行平衡操作
混合节点:即同时担任Broker和Controller节点角色的节点
1.2、两重模式的搭建方式
Zookeeper模式集群
KRaft模式集群
2、Zookeeper模式集群
这是一种比较简单,相对“传统”的搭建方式了!在这种模式下,每个Kafka节点都是依赖于Zookeeper的,使用Zookeeper存储集群中所有节点的元数据。
只要所有的Kafka节点连接到同一个Zookeeper上面(或者同一个Zookeeper集群),这些Kafka节点就构成了一个集群。所以说就算是只有一个Kafka节点在运行,这一个节点也可以称作一个集群。
在Zookeeper模式集群中,Zookeeper节点(或者集群)就充当了Controller的角色,而所有的Kafka节点就充当着Broker的角色。
下面就来介绍一下搭建过程,这里在1台主机上分别运行Zookeeper和Kafka来模拟一个集群,一共一个Zookeeper节点和三个Kafka节点构成,如下:
节点名 | 地址和端口 |
---|---|
Zookeeper节点 | localhost:2181 |
Kafka节点1 | localhost:9092 |
Kafka节点1 | localhost:9093 |
Kafka节点1 | localhost:9094 |
1、搭建Zookeeper
首先我们要运行起一个Zookeeper节点,这里
首先我们要运行起一个Zookeeper节点,这里就不再赘述Zookeeper节点如何搭建了,搭建可以查看官方文档,或者使用Docker的方式搭建。
搭建完成并运行Zookeeper之后,我们会把所有的Kafka节点都配置到这一个Zookeeper节点上。
2、配置并运行所有Kafka节点
server1.properties
# 每个节点的id,不要不相同的整数
broker.id=1
# 存储位置
log.dirs=/tmp/kafka-logs/cluster/log1
# zookeeper集群的话,多个地址用逗号分割
zookeeper.connect=localhost:2181
# zookeeper连接超时时间
zookeeper.connection.timeout.ms=18000
# 外网暴露
advertised.listeners=PLAINTEXT://localhost:9092
# 内网端口
listeners=PLAINTEXT://localhost:9092
server2.properties
# 每个节点的id,不要不相同的整数
broker.id=2
# 存储位置
log.dirs=/tmp/kafka-logs/cluster/log2
# zookeeper集群的话,多个地址用逗号分割
zookeeper.connect=localhost:2181
# zookeeper连接超时时间
zookeeper.connection.timeout.ms=18000
# 外网暴露
advertised.listeners=PLAINTEXT://localhost:9093
# 内网端口
listeners=PLAINTEXT://localhost:9093
server3.properties
# 每个节点的id,不要不相同的整数
broker.id=3
# 存储位置
log.dirs=/tmp/kafka-logs/cluster/log3
# zookeeper集群的话,多个地址用逗号分割
zookeeper.connect=localhost:2181
# zookeeper连接超时时间
zookeeper.connection.timeout.ms=18000
# 外网暴露
advertised.listeners=PLAINTEXT://localhost:9094
# 内网端口
listeners=PLAINTEXT://localhost:9094
三台虚拟机配置完成后,分别使用终端进入到Kafka目录下并启动,执行下列命令:
./kafka-server-start.sh -daemon ../config/cluster/server1.properties
./kafka-server-start.sh -daemon ../config/cluster/server2.properties
./kafka-server-start.sh -daemon ../config/cluster/server3.properties
3、测试
先在kafka1的端口上面再开一个终端并进入Kafka目录,执行下列命令创建cluster-topic,共3个分区,每个人去都分配3个副本:
./kafka-topics.sh --bootstrap-server localhost:9092 --create --topic cluster-topic --partitions 3 --replication-factor 3
然后在kafka2的端口查询该topic:
./kafka-topics.sh --bootstrap-server localhost:9093 --describe --topic cluster-topic
显而易见,该topic下有3个分区,每个分区有三个副本。每个分区的leader分别是1,2,3,表明kafka将该topic的3分区均匀地在3台broker上进行了分配。
删除分区:
./kafka-topics.sh --bootstrap-server localhost:9093 --delete --topic cluster-topic
3、KRaft模式集群
在上述传统方案中,Kafka需要依赖Zookeeper完成元数据存放和共享,这样也就暴露出了一些问题:
- 搭建Kafka集群时还需要额外搭建Zookeeper,增加了运维成本
- Zookeeper是强一致性的组件(符合CP理论),如果集群中数据发生变化,那么必须要等到其它节点都同步,至少超过一半同步完成,这样节点数多性能差
KRaft模式是新版本Kafka中推出的集群模式,这种模式下就完全不需要Zookeeper了!只需要数个Kafka节点就可以直接构成集群,在这时集群中的Kafka节点既有可能是Controller节点也可能是Broker节点,在这个模式中,我们不仅可以手动配置某个节点的角色(是Controller还是Broker),还可以使其同时担任Broker和Controller角色(混合节点)。
在KRaft模式中,集群的节点会通过投票选举的方式,选择出一个主要的Controller节点,这个节点也称作领导者,它将负责维护整个集群的元数据和状态信息,那么其它的Controller节点或者混合节点就称之为追随者,它们会从领导者同步集群元数据和状态信息。如果领导者宕机了,所有的节点会重新投票选举一个新的领导者。
在选举过程中,所有的节点都会参与投票过程,而候选节点只会是Controller节点或者混合节点(即Broker节点不会被选举为领导者)。
需要注意的是,在默认情况下Kafka集群中的Broker节点和Controller节点通常会监听不同的端口:
- Broker节点是Kafka集群中的数据节点(消息队列),它们负责接收客户端的消息和传递消息给客户端,默认情况下,每个Broker节点会监听9092端口,该端口用于与客户端进行通信,客户端可以将消息发送到这个端口,或者从这个端口接收消息,这个端口可以称作客户端通信端口
- Controller节点是Kafka集群中的控制器节点,负责管理集群的状态和元数据,Controller节点监听的端口通常是9093,该端口用于集群中其他节点获取元数据或在混合节点选举新的Controller时进行通信,通过该端口,其他节点可以与Controller节点交互,获取集群的元数据信息或参与控制器的选举过程,这个端口可以称作控制器端口
- 混合节点(即同时担任Broker和Controller角色的节点)中,这两个端口都会被使用,默认情况下混合节点将监听9092端口接收和传递消息给客户端,并监听9093端口用于与其他节点进行元数据交换和控制器选举通信,可见混合节点会同时使用两个端口分别作为客户端通信端口与控制器端口
所以需要根据实际情况配置网络设置和防火墙规则,以确保Kafka集群中的节点能够在正确的端口上进行通信。上述提到的两种端口也是可以修改的,当然不建议修改。
同样地,就算是你只是搭建了一个Kafka节点,这一个节点也仍然被视为一个Kafka集群,并且KRaft模式下如果只需要建立一个节点,那么这个节点必须是混合节点。
单台主机模拟搭建三个Kafka节点构成的KRaft模式集群如下:
节点名 | 地址 | 节点类型 | 客户端通信端口 | 控制器端口 |
---|---|---|---|---|
Kafka节点1 | localhost | 混合节点 | 9092 | 9093 |
Kafka节点2 | localhost | 混合节点 | 9094 | 9095 |
Kafka节点3 | localhost | 混合节点 | 9096 | 9097 |
1、修改配置文件
在KRaft模式下,配置文件位于Kafka目录中的config/kraft/server.properties,使用文本编辑器打开并找到下列配置以修改:
- node.id 表示这个节点的id,一个集群中每个节点id不能重复,需要是不小于1的整数,这里三台虚拟机的配置分别为1,2和3(类似上述Zookeeper的broker.id配置)
- controller.quorum.voters 设定投票者列表,即需要配置所有的Controller节点id及其地址端口,配置格式为节点1的id@节点1地址:节点1端口,节点2的id@节点2地址:节点2端口,节点3的id@节点3地址:节点3端口…,这里的端口需要是控制器端口,默认都是9093,上面也提到过了,默认不需要修改
- advertised.listeners 表示这个Kafka节点的外网地址,这里分别配置为PLAINTEXT://localhost:9092,PLAINTEXT://localhost:9094和PLAINTEXT://localhost:9096(和上述Zookeeper模式中的一样,实际在服务器上搭建时替换为服务器的外网地址或者域名)
- process.roles 表示设定这个节点的类型,设定为broker表示设定这个节点为Broker节点,同样地设定controller表示设定为Controller节点,默认是broker,controller表示这个节点会自动切换节点类型
server1.properties
#节点类型,默认为混合节点
process.roles=broker,controller
# 节点id,为不小于1的整数
node.id=1
# 投票者列表:nodeId+地址端口
controller.quorum.voters=1@localhost:9093,2@localhost:9095,3@localhost:9097
# 内网地址
listeners=PLAINTEXT://:9092,CONTROLLER://:9093
inter.broker.listener.name=PLAINTEXT
# 外网地址
advertised.listeners=PLAINTEXT://localhost:9092
controller.listener.names=CONTROLLER
log.dirs=/tmp/kraft-combined-logs/log1
server2.properties
# 节点类型,默认为混合节点
process.roles=broker,controller
# 节点id,为不小于1的整数
node.id=2
# 投票者列表:nodeId+地址端口
controller.quorum.voters=1@localhost:9093,2@localhost:9095,3@localhost:9097
# 内网地址
listeners=PLAINTEXT://:9094,CONTROLLER://:9095
inter.broker.listener.name=PLAINTEXT
# 外网地址
advertised.listeners=PLAINTEXT://localhost:9094
controller.listener.names=CONTROLLER
log.dirs=/tmp/kraft-combined-logs/log2
server3.properties
# 节点类型,默认为混合节点
process.roles=broker,controller
# 节点id,为不小于1的整数
node.id=3
# 投票者列表:nodeId+地址端口
controller.quorum.voters=1@localhost:9093,2@localhost:9095,3@localhost:9097
# 内网地址
listeners=PLAINTEXT://:9096,CONTROLLER://:9097
inter.broker.listener.name=PLAINTEXT
# 外网地址
advertised.listeners=PLAINTEXT://localhost:9096
controller.listener.names=CONTROLLER
log.dirs=/tmp/kraft-combined-logs/log3
2、生成集群ID并使用集群ID格式化数据目录
在KRaft模式下,一个集群需要设定一个id,我们可以使用自带的命令生成,先进入上述任意一台虚拟机并使用终端进入Kafka目录中,执行下列命令生成一个UUID:
bin/kafka-storage.sh random-uuid
里记录下这个ID以备用。kilMbKEoRUq3Ha6nruW6Aw
这个集群ID事实上是一个长度16位的字符串通过Base64编码后得来的,因此你也可以不使用上述命令,直接自定义一个16位长度的纯英文和数字组成的字符串,然后将这个字符串编码为Base64格式作为这个集群ID也可以。可以使用菜鸟工具中的在线Base64编码工具。
然后,分别执行下列命令,配置集群元数据:
kafka-storage.sh format -t 生成的集群ID -c ../config/kraft/cluster/server1.properties
kafka-storage.sh format -t kilMbKEoRUq3Ha6nruW6Aw -c ../config/kraft/cluster/server2.properties
kafka-storage.sh format -t kilMbKEoRUq3Ha6nruW6Aw -c ../config/kraft/cluster/server3.properties
3、启动Kafka集群
使用终端,分别执行下列命令:
- kafka-server-start.sh -daemon ../config/kraft/cluster/server1.properties
- kafka-server-start.sh -daemon ../config/kraft/cluster/server2.properties
- kafka-server-start.sh -daemon ../config/kraft/cluster/server3.properties
4、创建topic测试
先在kafka1的端口(9092)上面再开一个终端并进入Kafka目录,执行下列命令创建cluster-topic,共3个分区,每个人去都分配3个副本:
./kafka-topics.sh --bootstrap-server localhost:9092 --create --topic cluster-topic --partitions 3 --replication-factor 3
然后在kafka2的端口(9094)查询该topic:
./kafka-topics.sh --bootstrap-server localhost:9094 --describe --topic cluster-topic
在kafka3的端口(9096)删除分区:
./kafka-topics.sh --bootstrap-server localhost:9096 --delete --topic cluster-topic
可见集群节点之间可以互相通信。
4、重要配置介绍
4.1、listeners
这个配置项用于指定Kafka服务器监听客户端连接的地址和端口,当 Kafka 服务器启动时,它将监听listeners配置项中指定的地址和端口,等待客户端的连接请求。
一般情况下这个配置以PLAINTEXT://或者CONTROLLER://开头,意义如下:
- 若这个节点是Broker节点,则以PLAINTEXT://开头
- 若这个节点是Controller节点,则以CONTROLLER://开头
- 若这个节点是混合节点,则需要同时配置两者开头的地址
这个配置项通常不需要修改,下面给出几个配置示例:
- PLAINTEXT://:9092 本节点作为Broker节点,监听本机所有可用网卡的9092端口(使用9092端口作为客户端通信端口),也是默认配置
- PLAINTEXT://127.0.0.1:9092 本节点作为Broker节点,监听本地的9092端口,这样仅接受来自本地的请求
- CONTROLLER://:10000 本节点作为Controller节点,监听本机所有可用网卡的10000端口(使用10000端口作为控制器端口)
- PLAINTEXT://:9092,CONTROLLER://:9093 本节点作为混合节点,监听本机所有可用网卡的9092和9093端口,其中9092作为客户端通信端口,9093作为控制器端口
4.2、advertise.listeners
这个配置容易和listeners混淆,事实上它们是有较大的区别的。
该配置项指定Kafka服务器广播给客户端的地址和端口,通常配置为Kafka所在服务器的外网地址。
当客户端(生产者或消费者)尝试连接到Kafka服务器时,它首先会获取Kafka服务器广播的地址和端口,也就是advertise.listeners配置所指定的地址和端口,然后才会使用advertise.listeners配置所指定的地址和端口来建立与Kafka服务器的连接。
相信这时大家会有个疑问:既然客户端要连接Kafka(例如Spring Boot集成Kafka客户端),那一定是已经知道了Kafka对外的地址端口了,那为什么连接的时候还需要获取一下广播的地址端口再进行连接呢?这样是不是有一些多此一举?
事实上,Kafka设计这个配置是为了解决下面较为复杂的网络场景:
- 多网络接口的主机部署:在一个多网络接口的主机部署Kafka时,Kafka服务器可能会监听多个地址和端口,这些地址和端口可能与客户端实际访问的地址和端口不同,advertise.listeners允许服务器指定一个公开的、可访问的地址和端口,以便客户端能够正确连接
- NAT/代理环境:在某些网络环境下,Kafka服务器位于一个私有网络中,客户端位于一个公共网络中,两者之间可能存在网络地址转换(NAT)或代理,在这种情况下,Kafka服务器的内部地址和端口对客户端来说是不可访问的。通过使用advertise.listeners,Kafka服务器可以将一个公共地址和端口广播给客户端,使得客户端能够通过公共网络连接到服务器
- 容器环境:例如你把Kafka放在Docker容器中运行,按照默认配置,Kafka服务端只会监听容器网络的9092端口,我们知道外部不能直接访问容器的网络,而是需要使用网络映射,假设你把Kafka容器的9092端口映射至了宿主机9095端口,也就是说外部需要通过9095端口访问到Kafka容器的9092端口,那么你就配置advertise.listeners为PLAINTEXT://服务器外网地址:9095,客户端就可以正确访问容器中的Kafka了
总之,这个配置设置为Kafka服务器所在的外网地址即可!例如PLAINTEXT://69.54.112.239:9092。
4.3、process.roles
这是KRaft模式下专门的配置,用于配置这个节点的类型,可以配置为下列值:
- broker 表示这个节点是Broker节点,充当消息队列的角色
- controller 表示这个节点是Controller节点,充当元数据存放和管理的角色
- broker,controller 表示这个节点同时担任Broker和Controller的角色,也称作混合节点
如果没有配置这个选项,则Kafka会以Zookeeper模式运行。
这里有下列注意事项:
- 如果设定节点为controller:
1. 则不能配置advertised.listeners,可以将其注释掉或者删掉
2. listeners需要配置为CONTROLLER://开头,建议配置为CONTROLLER://:9093
- 如果设定节点为broker:
1. 则需要配置advertised.listeners为服务器外网地址和端口,这和Zookeeper模式中相同
2.listeners需要配置为PLAINTEXT://开头,建议配置为PLAINTEXT://:9092
- 如果设定节点为混合节点:
1. 同样需要配置advertised.listeners为服务器外网地址和端口
l 2. isteners需要同时配置CONTROLLER://和PLAINTEXT://,建议配置为 PLAINTEXT://:9092,CONTROLLER://:9093
在开发环境或者小规模集群,可以全部使用混合节点,如果是生产环境就建议设定好每个节点的类型了!并且通常需要先启动Controller节点再启动Broker节点。
事实上,我们发现Kafka的KRaft配置目录config/kraft下有三个配置文件,其中server.properties是混合节点的配置模板,而broker.properties和controller.properties分别是Broker节点和Controller节点的配置模板,大家如果要设定节点类型,可以直接使用对应的配置文件,将对应配置文件需要修改的部分修改一下,然后将上述格式化数据目录命令和启动命令中的配置文件路径改变一下即可,这样可以省略我们设定process.roles和listeners或者控制器节点删除advertise.listeners配置的操作。
4.4、controller.quorum.voters
该配置项用于配置集群中Controller节点选举过程中的投票者,集群中所有的Controller节点都需要被罗列在这个配置项中,其配置格式为id1@host1:port1,id2@host2:port2,id3@host3:port3...。
有的同学可能认为这里需要把集群中所有节点都写进去,事实上这是错误的,这里只需要写所有的Controller节点和混合节点的id、地址和端口即可,这个配置中配置的端口当然是控制器端口。
上述集群搭建的例子中,由于所有的节点都是混合节点,因此就全部写在其中了!如果我们手动设定每个节点的类型,例如:
节点名 | 节点id | 地址 | 服务器通信端口 | 控制器端口 | 节点类型 |
---|---|---|---|---|---|
Kafka节点1 | 1 | kafka1 | / | 9093 | Controller |
Kafka节点2 | 2 | kafka2 | 9092 | / | Broker |
Kafka节点3 | 3 | kafka3 | 9092 | / | Broker |
那么所有节点的controller.quorum.voters都需要配置为1@kafka1:9093。
事实上,所有的节点都是通过这个配置中的节点列表,来得知所有的控制器节点信息(以获取集群元数据)并得到投票候选者的,因此集群中所有节点,不论是Broker还是Controller,还是混合节点,都需要配置这一项。
4.5、其它配置
除了上述我们涉及到的一些配置之外,还有下列配置大家可以进行修改:
- socket.send.buffer.bytes 每次发送的数据包的最大大小(单位:字节)
- socket.receive.buffer.bytes 每次接收的数据包的最大大小(单位:字节)
- socket.request.max.bytes 接收的最大请求大小(单位:字节)
- num.partitions 每个Topic的默认分区数
上述无论是哪个模式的集群,都可以在配置文件中找到这些配置,如果找不到可手动加入。除了修改配置文件之外,我们还可以在启动Kafka的命令中指定配置和值,例如:
bin/kafka-server-start.sh config/server.properties --override zookeeper.connect=127.0.0.1:2181 --override broker.id=1
上述命令在启动时通过命令指定了zookeeper.connect配置值为127.0.0.1:2181,以及broker.id为1,可见在后面追加–override 配置名=值即可,注意命令行中指定的配置值会覆盖掉配置文件中的配置值!
listeners 和 advertised.listeners 以及其他通信配置
listeners
侦听器列表,这里配置的监听器底层调用的是
ServerSocketAdaptor.bind(SocketAddress local)
那么这个说明什么意思呢?说明你配置的监听器将被用于监听网络请求。
简单理解就是你建立监听一个通道, 别人能够通过这个通道跟你沟通。
所以我们需要设置 IP:Port
.
这个属性的格式为:
listeners = listener_name://host_name:port,listener_name2://host_nam2e:port2
- 可以同时配置多个, 并且用逗号隔开
- 监听器的名称和端口必须是唯一的, 端口相同, 就冲突了
- host_name 如果为空, 例如 (
listeners = ://host_name:port
), 则会绑定到默认的接口 (网卡), 一般情况下是localhost
,底层调用的是
java.net.InetAddress.getCanonicalHostName()
- 将 host_name 设置为
0.0.0.0
则会绑定所有的网卡, 也就是说不管从哪个网卡进入的请求都会被接受处理。但是请注意, 假如你设置的是0.0.0.0
, 那么advertised.listeners
必须要设置, 因为advertised.listeners
默认请看下使用的是listeners
的配置发布到 zk 中, 发布到 zk 中是给其他 Brokers/Clients 来跟你通信的, 你设置0.0.0.0
, 谁知道要请求哪个 IP 呢, 所以它必须要指定并明确 IP:PORT。具体详情请看下面示例 3 - listener_name 是监听名, 唯一值, 他并不是安全协议 (大部分人都会搞错), 因为默认的 4 个安全协议已经做好了映射, 例如 :PLAINTEXT ==> PLAINTEXT . 所以你经常看到的配置
## 这个PLAINTEXT是监听名称,刚好他对应的安全协议就是 PLAINTEXT
## 当然这个是可以自定义的, 详细情况 后面的配置listener.security.protocol.map
listeners = PLAINTEXT://your.host.name:9092
advertised.listeners
发布公开的监听器, 啥叫发布公开的监听器?
就是, 让 Brokers 和 Clients 们都能够知道的监听器, 你想想看,listeners
是 Broker 用来监听网络请求的
那么, 其他 Broker 或者客户端想要与它通信, 则需要知道具体的 IP:PORT 吧?
所以, 为了让别人知道自己的监听器, 那么就需要公开出去, 当然这个公开的形式, 是通过 zk 来共享数据。
看看 broker 到 zk 节点/brokers/{brokerid}/
下面的信息示例
- 默认情况下,
advertised.listeners
不设置会自动使用listeners
属性 -
advertised.listeners
不支持0.0.0.0
这种形式, 所以如果listeners
属性设置成0.0.0.0
,则必须设置advertised.listeners
属性。具体请看示例 3
因为0.0.0.0
是表示的是监听 Broker 上任意的网卡的, 你将这个发布出去, 那么别的 Broker 和客户端怎么知道你具体的 ip 和端口呢? - 可以同时配置多个, 并且用逗号隔开
- 可动态配置该属性
一文搞懂 Kafka 中的 listeners 和 advertised.listeners 以及其他通信配置-CSDN博客
[root@localhost statefulset]# cat jettech-kafka-statefulset-prod.yaml
apiVersion: v1
kind: Service
metadata:labels: {name: jettech-kafka}name: jettech-kafkanamespace: jettech-prod
spec:ports:#- {name: t9092, nodePort: 9092, port: 9092, protocol: TCP, targetPort: t9092}- {name: t9092, port: 9092, protocol: TCP, targetPort: t9092}- {name: t9093, port: 9093, protocol: TCP, targetPort: t9093}selector: {name: jettech-kafka}#type: NodePort#type: ClusterIPclusterIP: None---
apiVersion: apps/v1
kind: StatefulSet
metadata:labels: {name: jettech-kafka}name: jettech-kafkanamespace: jettech-prod
spec:serviceName: "jettech-kafka"replicas: 1selector:matchLabels: {name: jettech-kafka}template:metadata:labels: {name: jettech-kafka}name: jettech-kafkaspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 172.16.10.49initContainers:#hostname: jettech-kafka-controller01#subdomain: p-kfk-con1containers:- name: jettech-kafkaimage: harbor.jettech.com/jettechtools/kafka:3.9.0env:- {name: KAFKA_KRAFT_MODE, value: 'true'}- {name: KAFKA_PROCESS_ROLES, value: 'broker,controller'}- {name: KAFKA_NODE_ID, value: '1'}- {name: KAFKA_LISTENERS, value: 'PLAINTEXT://:9092,CONTROLLER://:9093'}- {name: KAFKA_ADVERTISED_LISTENERS, value: 'PLAINTEXT://jettech-kafka.jettech.com:9092,CONTROLLER://jettech-kafka.jettech.com:9093'}- {name: KAFKA_INTER_BROKER_LISTENER_NAME, value: 'PLAINTEXT'}- {name: KAFKA_CONTROLLER_LISTENER_NAMES, value: 'CONTROLLER'}- {name: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP, value: 'PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT'}- {name: KAFKA_CONTROLLER_QUORUM_VOTERS, value: '1@jettech-kafka.jettech.com:9093'}- {name: KAFKA_LOG_DIRS, value: '/var/lib/kafka/data'}- {name: KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR, value: '1'}- {name: KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR, value: '1'}- {name: KAFKA_TRANSACTION_STATE_LOG_MIN_ISR, value: '1'}- {name: KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS, value: '1'}- {name: KAFKA_BROKER_ID, value: '1'}- {name: KAFKA_NUM_PARTITIONS, value: '1'}securityContext:privileged: trueports:- {containerPort: 9092, name: t9092, protocol: TCP}- {containerPort: 9093, name: t9093, protocol: TCP}volumeMounts:- name: jettech-kafka-datamountPath: /var/lib/kafka/data- name: host-timemountPath: /etc/localtimeimagePullPolicy: Always #[Always | Never | IfNotPresent]tolerations:- key: typeoperator: Equalvalue: dbeffect: NoSchedulehostNetwork: truednsPolicy: ClusterFirstWithHostNetrestartPolicy: Always #Nevervolumes:- name: jettech-kafka-data#nfs:# server: 192.168.99.42# path: /data/jettechproduct/jettech/prod/kafka8.0/datahostPath:path: /data/jettechproduct/jettech/prod/kafka/data- name: host-timehostPath:path: /etc/localtime
相关文章:
Kafka——两种集群搭建详解 k8s
1、简介 Kafka是一个能够支持高并发以及流式消息处理的消息中间件,并且Kafka天生就是支持集群的,今天就主要来介绍一下如何搭建Kafka集群。 Kafka目前支持使用Zookeeper模式搭建集群以及KRaft模式(即无Zookeeper)模式这两种模式搭…...
springboot使用websocket
文章目录 一、概述1、简介 二、 使用1、引包2、配置处理器3、前端测试 一、概述 1、简介 简介略,附上官方文档,spring5和spring6的官方文档内容大致是一样的: https://docs.spring.io/spring-framework/docs/5.2.25.RELEASE/spring-framewo…...

Redis的安装和配置、基本命令
一、实验目的 本实验旨在帮助学生熟悉Redis的安装、配置和基本使用,包括启动Redis服务、使用命令行客户端进行操作、配置Redis、进行多数据库操作以及掌握键值相关和服务器相关的命令。 二、实验环境准备 1. JAVA环境准备:确保Java Development Kit …...

Rnote:Star 8.6k,github上的宝藏项目,手绘与手写画图笔记,用它画图做笔记超丝滑,值得尝试!
嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 Rnote是一款开源的基于矢量的绘图应用,专为学生、教师以及绘图板用户设计。它支持草图绘制、手写笔记以及对文档和图片进行注释。Rnote提供…...

python如何解析word文件格式(.docx)
python如何解析word文件格式(.docx) .docx文件遵从开源的“Office Open XML标准”,这意味着我们能用python的文本操作对它进行操作(实际上PPT和Excel也是)。而且这并不是重复造轮子,因为市面上操作.docx的…...

「刘一哥GIS」系列专栏《GRASS GIS零基础入门实验教程(配套案例数据)》专栏上线了
「刘一哥GIS」系列专栏《GRASS GIS零基础入门实验教程》全新上线了,欢迎广大GISer朋友关注,一起探索GIS奥秘,分享GIS价值! 本专栏以实战案例的形式,深入浅出地介绍了GRASS GIS的基本使用方法,用一个个实例讲…...

使用nginx搭建通用的图片代理服务器,支持http/https/重定向式图片地址
从http切换至https 许多不同ip的图片地址需要统一进行代理 部分图片地址是重定向地址 nginx配置 主站地址:https://192.168.123.100/ 主站nginx配置 server {listen 443 ssl;server_name localhost;#ssl证书ssl_certificate ../ssl/ca.crt; #私钥文件ssl_ce…...

零基础构建最简单的 Tauri2.0 桌面项目 Star 88.4k!!!
目录 预安装环境 安装nodejs windows下安装 linux下安装 nodejs常遇问题 安装C环境 介绍 下载 安装 安装Rust语言 Tauri官网 安装 vscode 安装 rust 插件 安装 Tauri 插件 运行成果 预安装环境 安装nodejs windows下安装 NodeJs_安装及下载_哔哩哔哩_bilibi…...

智能科技与共情能力加持,哈曼重新定义驾乘体验
2025年1月6日,拉斯维加斯,2025年国际消费电子展——想象一下,当您步入一辆汽车,它不仅能响应您的指令,更能理解您的需求、适应您的偏好,并为您创造一个独特且专属的交互环境。作为汽车科技领域的知名企业和…...

猫贫血吃什么能快速补血?
各位铲屎官们,看到自家猫咪无精打采、小脸苍白,是不是特别心疼?贫血可是猫咪健康的大敌,今天就来给大家支支招,哪些食物和方法能让猫咪快速补血,恢复活力! 一、红肉及内脏类 红肉是补血的“主力…...

微服务拆分
微服务拆分 接下来,我们就一起将黑马商城这个单体项目拆分为微服务项目,并解决其中出现的各种问题。 熟悉黑马商城 首先,我们需要熟悉黑马商城项目的基本结构: 大家可以直接启动该项目,测试效果。不过,…...
Android SystemUI——车载CarSystemUI加载(八)
Android 系统早期的状态栏和导航栏对于手机设备来说那是相当重要的,但是随着手机版本的不断更新,状态栏和导航栏对于手机的重要性在逐渐降低,特别是在快捷手势出现之后,导航栏几乎变得可有可无。但是对于当前如火如荼的车载系统来说,状态栏和导航栏却几乎是必备的,谷歌自…...

2025年编程语言热度分析:Python领跑,Go与Rust崛起
TIOBE Index(TIOBE 编程语言指数)是一个衡量编程语言流行度的排名系统。它通过分析多种搜索引擎、在线编程社区、技术论坛、问答网站(如 Google、Bing、Yahoo、Wikipedia、Stack Overflow)等的搜索和讨论数据,评估不同…...

前缀和 (一维 二维)
前缀和作用: 快速求出原数组中一段数组的和 思路 1.预处理前缀和数组 2.用公式求区间和 公式: 二维前缀和: s [ i ] [ j ] s[ i - 1 ] [ j ] s[ i ] [ j - 1 ] - s [ i - 1 ] [ j - 1]; 题型 一维 二维 题解 一维 #include <iost…...
精选算法合集
一、BFS相关 1.1 最小步骤 给定一个数组,从第一个开始,正好走到数组最后,所使用的最少步骤数。要求: 第一步从第一元素开始,第一步小于<len/2(len为数组的长度)。从第二步开始,…...

HackMyVM-Klim靶机的测试报告
目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、Getshell 3、提权 CVE-2008-0166 四、结论 一、测试环境 1、系统环境 渗透机:kali2021.1(192.168.159.127) 靶 机:debian(192.168.159.27) 注意事…...
C++内存分布
小试牛刀: int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)malloc(sizeof(int)…...
mysql主从复制sql进程中断,报错Tablespace is missing for table ……
一 解决办法 关键执行1.2步,1.1/1.3结合实际环境操作。 1.1 如果从库只读开启了,要先关闭只读 show variables like %read_only%; set global super_read_onlyoff; set global read_onlyoff; 1.2 discart/import tablespace ALTER TABLE 表名 DISC…...
STM32 FreeRTOS 信号量
信号量的简介 reeRTOS中的信号量是一种用于任务间同步和资源管理的机制。信号量可以是二进制的(只能取0或1)也可以是计数型的(可以是任意正整数)。信号量的基本操作包括“获取”和“释放”。 比如动车上的卫生间,一个…...
Codemirror6个人使用心得总结
Codemirror6 包 用法总结 本次用到的 Codemirror6 有关的包如下 语法支持包语法支持包核心插件codemirror/lang-yaml 6.1.1codemirror/lang-less 6.0.2codemirror/autocomplete 6.16.0codemirror/lang-xml 6.1.0codemirror/lang-liquid 6.2.1codemirror/commands 6.5.0codemirr…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...