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节点1localhost:9092
Kafka节点1localhost:9093
Kafka节点1localhost: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节点1localhost混合节点90929093
Kafka节点2localhost混合节点90949095
Kafka节点3localhost混合节点90969097

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节点11kafka1/9093Controller
Kafka节点22kafka29092/Broker
Kafka节点33kafka39092/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
  1. 可以同时配置多个, 并且用逗号隔开
  2. 监听器的名称和端口必须是唯一的, 端口相同, 就冲突了
  3. host_name 如果为空, 例如 (​​listeners = ://host_name:port​​​), 则会绑定到默认的接口 (网卡), 一般情况下是​​localhost​​,底层调用的是
java.net.InetAddress.getCanonicalHostName()
  1. 将 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
  2. 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}/ ​​下面的信息示例

  1. 默认情况下,​​advertised.listeners​​​不设置会自动使用​​listeners​​属性
  2. ​advertised.listeners​​​不支持​​0.0.0.0​​​这种形式, 所以如果​​listeners​​​属性设置成​​0.0.0.0​​​,则必须设置​​advertised.listeners​​属性。具体请看示例 3
    因为​​​0.0.0.0​​是表示的是监听 Broker 上任意的网卡的, 你将这个发布出去, 那么别的 Broker 和客户端怎么知道你具体的 ip 和端口呢?
  3. 可以同时配置多个, 并且用逗号隔开
  4. 可动态配置该属性

一文搞懂 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-kafka
  namespace: 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: ClusterIP
  clusterIP: None

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels: {name: jettech-kafka}
  name: jettech-kafka
  namespace: jettech-prod
spec:
  serviceName: "jettech-kafka"
  replicas: 1
  selector:
    matchLabels: {name: jettech-kafka}
  template:
    metadata:
      labels: {name: jettech-kafka}
      name: jettech-kafka
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - 172.16.10.49
      initContainers:
      #hostname: jettech-kafka-controller01
      #subdomain: p-kfk-con1
      containers:
      - name: jettech-kafka
        image: harbor.jettech.com/jettechtools/kafka:3.9.0
        env:
        - {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: true
        ports:
        - {containerPort: 9092, name: t9092, protocol: TCP}
        - {containerPort: 9093, name: t9093, protocol: TCP}
        volumeMounts:
        - name: jettech-kafka-data
          mountPath: /var/lib/kafka/data
        - name: host-time
          mountPath: /etc/localtime
        imagePullPolicy: Always #[Always | Never | IfNotPresent]
      tolerations:
      - key: type
        operator: Equal
        value: db
        effect: NoSchedule
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      restartPolicy: Always #Never
      volumes:
      - name: jettech-kafka-data
        #nfs:
        #  server: 192.168.99.42
        #  path: /data/jettechproduct/jettech/prod/kafka8.0/data
        hostPath:
          path: /data/jettechproduct/jettech/prod/kafka/data
      - name: host-time
        hostPath:
          path: /etc/localtime

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

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

相关文章

解锁 JMeter 的 ForEach Controller 高效测试秘籍

各位小伙伴们,今天咱就来唠唠 JMeter 里超厉害的 “宝藏工具”——ForEach Controller,它可是能帮咱们在性能测试的江湖里 “大杀四方” 哦! 一、ForEach Controller 是啥 “神器” 想象一下,你手头有一串神秘钥匙,每…

【已解决】【记录】2AI大模型web UI使用tips 本地

docker desktop使用 互动 如果需要发送网页链接,就在链接上加上【#】号 如果要上传文件就点击这个➕号 中文回复 命令它只用中文回复,在右上角打开【对话高级设置】 输入提示词(提示词使用英文会更好) Must reply to the us…

MySQL批量修改数据表编码及字符集为utf8mb4

​​​​​​MySQL批量修改数据表编码及字符集为utf8mb4 utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符。 采用utf8mb4编码的好处是:存储与获取数据的时候,不用再考虑表情字符的编码与解码问题。 更改数据库…

基于Spring Boot的房屋租赁系统源码(java+vue+mysql+文档)

项目简介 房屋租赁系统实现了以下功能: 基于Spring Boot的房屋租赁系统的主要使用者管理员可登录系统后台,登录后可对系统进行全面管理,包括个人中心、公告信息管理、租客管理、户主管理、房屋信息管理、看房申请管理、租赁合同管理、收租信…

Leetcode - 147双周赛

目录 一、3407. 子字符串匹配模式二、3408. 设计任务管理器三、3409. 最长相邻绝对差递减子序列四、3410. 删除所有值为某个元素后的最大子数组和 一、3407. 子字符串匹配模式 题目链接 字符串匹配问题,把字符串 p 分成两段 、,i 是 ’ * ’ 的下标&am…

数据预测2025年AI面试市场增幅超500%!

近年来,随着人工智能技术的迅猛发展,AI在各行各业的应用逐渐广泛,其中企业招聘领域也不例外。最新的数据显示,2025年AI面试市场将迎来前所未有的增长,预计增幅将超过500%。这一预测不仅揭示了AI技术在招聘领域的应用潜…

浅谈云计算08 | 基本云架构

浅谈基本云架构 一、负载分布架构二、资源池架构三、动态可扩展架构四、弹性资源容量架构五、服务负载均衡架构六、云爆发架构七、弹性磁盘供给架构八、冗余存储架构 在当今数字化时代,云计算已成为企业发展的核心驱动力,而其背后的一系列关键架构则是支…

【专题】2025年节日营销趋势洞察报告汇总PDF洞察(附原数据表)

原文链接: https://tecdat.cn/?p38813 在当今复杂多变且竞争激烈的消费市场环境下,节日营销已成为企业获取市场份额、提升品牌影响力的关键战略时机。我们深知深入洞察节日营销趋势对于企业决策的重要性。 本报告汇总基于对 2024 年多个关键消费节点及…

【Linux系统】权限位(mode bits)

这张图是使用结构体 struct stat 中的 st_mode 字段时画的,获取表示文件的类型和权限,它是典型的 POSIX 系统调用(如 stat() 和 fstat())返回的 struct stat 结构的一部分,用于描述文件的元数据。 在 Linux 和 Unix 系…

无源器件-电容

电容器件的参数 基本概念由中学大学物理或电路分析内容获得,此处不做过多分析。 电容的产量占全球电子元器件产品的40%以上。 单位:法拉 F;1F10^6uF;电路中常见的104电容就是10*10^4pF100nF0.1uF C为电容,Rp为绝缘电…

Go语言之路————go环境的初始化

Go语言之路————go环境的初始化 前言一、Go的安装二、环境配置三、初始化一个新项目四、常用的一些指令 前言 我是一名多年Java开发人员,因为工作需要现在要学习go语言,Go语言之路是一个系列,记录着我从0开始接触Go,到后面能正…

数据结构与算法之链表: LeetCode 234. 回文链表 (Ts版)

回文链表 https://leetcode.cn/problems/palindrome-linked-list/description/ 描述 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表如果是,返回 true ;否则,返回 false 示例 1 输入:head [1,2,2,1]…

Hive4.0.1集群安装部署(Hadoop版本为3.3.6)(详细教程)

前置环境 ​​​Linux环境Zookeeper集群安装(详细教程)-CSDN博客 Hadoop HA高可用集群3.3.6搭建(详细教程)-CSDN博客 MySQL8.0.40离线安装(详细教程)_mysql 8.0.40 ftp-CSDN博客 Hadoop3.3.6官网下载链接地…

Windows安装ES单机版设置密码

下载ES ES下载链接 我用的是7.17.26 启动前配置 解压之后打开D:\software\elasticsearch-7.17.26\bin\elasticsearch-env.bat 在elasticsearch-env.bat文件中修改jdk的路径 修改前 修改内容 if defined ES_JAVA_HOME (set JAVA"D:\software\elasticsearch-7.17.26\…

Wireshark抓包教程(2024最新版个人笔记)

改内容是个人的学习笔记 Wireshark抓包教程(2024最新版)_哔哩哔哩_bilibili 该课程笔记1-16 wireshark基础 什么是抓包工具:用来抓取数据包的一个软件 wireshark的功能:用来网络故障排查;用来学习网络技术 wireshark下…

云平台一键部署【Video-Background-Removal】视频换背景,无任何限制,随意换

Video-Background-Removal 是一款革命性的视频背景替换工具,旨在让用户轻松实现视频背景的快速更换。无论你是专业创作者还是普通用户,这款软件都能让你在几秒钟内改变背景,完全消除限制,随心所欲,随时随地想换就换&am…

2025年,华为认证HCIA、HCIP、HCIE 该如何选择?

眼看都到 2025 年啦,华为认证还吃香不? 把这问题摆在每个网络工程师跟前,答案可没那么容易说清楚。 到底考不考它值当不值当,重点在于您自己的职业规划,还有对行业走向的领会。 2025 年华为认证仍然值得一考&#…

使用 Docker 部署 Java 项目(通俗易懂)

目录 1、下载与配置 Docker 1.1 docker下载(这里使用的是Ubuntu,Centos命令可能有不同) 1.2 配置 Docker 代理对象 2、打包当前 Java 项目 3、进行编写 DockerFile,并将对应文件传输到 Linux 中 3.1 编写 dockerfile 文件 …

学习threejs,使用TrackballControls相机控制器

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.TrackballControls 相…

C# OpenCV机器视觉:转速测量

在一个看似平常却又暗藏神秘能量的日子里,阿杰正在他那充满科技感的实验室里,对着一堆奇奇怪怪的仪器发呆。突然,手机铃声如一道凌厉的剑气划破寂静,原来是工厂的赵厂长打来的紧急电话:“阿杰啊,咱们工厂新…