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)模式这两种模式搭…...
OPT: Open Pre-trained Transformer语言模型
摘要 大规模语言模型通常需要数十万计算日的训练时间,展现了在零样本和小样本学习中的显著能力。鉴于其计算成本之高,这些模型在没有大量资本投入的情况下难以复现。对于那些通过API提供的少数模型,研究者无法获取完整的模型权重,…...
开源模型应用落地-LangChain高阶-记忆组件-RedisChatMessageHistory正确使用(八)
一、前言 LangChain 的记忆组件发挥着至关重要的作用,其旨在协助大语言模型(LLM)有效地留存历史对话信息。通过这一功能,使得大语言模型在对话过程中能够更出色地维持上下文的连贯性和一致性,进而能够像人类的记忆运作方式那样,进行更为自然、流畅且智能化的交互。 它仿佛…...
http和https有哪些不同
http和https有哪些不同 1.数据传输的安全性:http非加密,https加密 2.端口号:http默认80端口,https默认443端口 3.性能:http基于tcp三次握手建立连接,https在tcp三次握手后还有TLS协议的四次握手确认加密…...
UML系列之Rational Rose笔记七:状态图
一、新建状态图 依旧是新建statechart diagram; 二、工作台介绍 接着就是一个状态的开始:开始黑点依旧可以从左边进行拖动放置: 这就是状态的开始,和活动图泳道图是一样的;只能有一个开始,但是可以有多个…...
一个使用 Golang 编写的新一代网络爬虫框架,支持JS动态内容爬取
大家好,今天给大家分享一个由ProjectDiscovery组织开发的开源“下一代爬虫框架”Katana,旨在提供高效、灵活且功能丰富的网络爬取体验,适用于各种自动化管道和数据收集任务。 项目介绍 Katana 是 ProjectDiscovery 精心打造的命令行界面&…...
mycat介绍与操作步骤
文章目录 1.分库分表2.mycat 入门2.1 概述2.2 案例:水平分表1)准备工作2)配置3)启动并测试 3.mycat 配置详解3.1 schema.xml3.2 rule.xml3.3 server.xml 4.mycat 分片:垂直拆分1)准备工作2)配置…...
【Go】:图片上添加水印的全面指南——从基础到高级特性
前言 在数字内容日益重要的今天,保护版权和标识来源变得关键。为图片添加水印有助于声明所有权、提升品牌认知度,并防止未经授权的使用。本文将介绍如何用Go语言实现图片水印,包括静态图片和带旋转、倾斜效果的文字水印,帮助您有…...
R语言的语法糖
R语言的语法糖 引言 在编程语言中,所谓的“语法糖”是指那些使得程序员能够以更简洁、直观的方式书写代码的语法形式。R语言作为一种用于统计分析和数据可视化的编程语言,具有丰富的功能和灵活的语法。本文将深入探讨R语言中的语法糖,帮助读…...
乙游的尽头是虚拟偶像吗?
眼花了,竟然看到二次元乙游男主角走红毯了。 12月20日,某国际知名奢侈品品牌宣布,《恋与深空》四位男主将受邀出席品牌在上海举办的TF戏瘾之夜活动,并公开了四位男主的红毯照片。 没有真人实体的乙游男主走红毯?这是…...
【源码+文档+调试讲解】农产品研究报告管理系统
摘 要 农产品研究报告管理系统是一个旨在收集、整理、存储和分析农产品相关研究数据的综合性平台。农产品研究报告管理系统通常包含一个强大的数据库,它能够处理大量的研究数据,并对这些数据进行有效的管理和备份。农产品研究报告管理系统是现代农业科学…...
SQL UNION 操作符
SQL UNION 操作符 SQL UNION 操作符用于合并两个或多个 SELECT 语句的结果集。它将多个结果集组合成一个单独的结果集,并去除重复的行。为了使用 UNION,每个 SELECT 语句必须具有相同的列数,并且对应列的数据类型必须兼容。 语法 SELECT c…...
springboot vue uniapp 仿小红书 1:1 还原 (含源码演示)
线上预览: 移动端 http://8.146.211.120:8081/ 管理端 http://8.146.211.120:8088/ 小红书凭借优秀的产品体验 和超高人气 目前成为笔记类产品佼佼者 此项目将详细介绍如何使用Vue.js和Spring Boot 集合uniapp 开发一个仿小红书应用,凭借uniapp 可以在h5 小程序 app…...
扩散模型学习
扩散模型学习 DDPM(参考1) DDIM(参考1,参考2)...
【面试】MySQL 最左匹配原则
MySQL的最左匹配原则是在使用联合索引时非常重要的概念,理解并合理运用该原则能显著提升查询性能。以下从多个方面详细介绍: 1. 联合索引结构基础 联合索引是对多个列创建的索引。在MySQL中,联合索引以多列值的组合形式,按照创建…...
Mac 删除ABC 输入法
参考链接:百度安全验证 Mac下删除系统自带输入法ABC,正解!_mac删除abc输入法-CSDN博客 ABC 输入法和搜狗输入法等 英文有冲突~~ 切换后还会在英文状态,可以删除 ;可能会对DNS 输入有影响,但是可以通过复…...
Nginx代理同域名前后端分离项目的完整步骤
前后端分离项目,前后端共用一个域名。通过域名后的 url 前缀来区别前后端项目。 以 vue php 项目为例。直接上 server 模块的 nginx 配置。 server{ listen 80; #listen [::]:80 default_server ipv6onlyon; server_name demo.com;#二配置项目域名 index index.ht…...
21、Transformer Masked loss原理精讲及其PyTorch逐行实现
1. Transformer结构图 2. python import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_printoptions(precision3, sci_modeFalse)if __name__ "__main__":run_code 0batch_size 2seq_length 3vocab_size 4logits torch.randn(batch…...
CNN张量输入形状和特征图
CNN张量输入形状和特征图 这个是比较容易理解的张量的解释,比较直观 卷积神经网络 在这个神经网络编程系列中,我们正在逐步构建一个卷积神经网络(CNN),所以让我们看看CNN的张量输入。 在最后两篇文章中&…...
RK3399开发板Linux实时性改造
本次测试基于NanoPC-T4开发板(国产化处理器RK3399),4.19.111内核Xenomai实时性改造测试。 Xenomai下载网站:https://xenomai.org/downloads/ NanoPC-T4网站:https://wiki.friendlyarm.com/wiki/index.php/NanoPC-T4/z…...
ASP.NET Core 中的高效后台任务管理
一、引言 在当今快速发展的 Web 开发领域,ASP.NET Core 凭借其卓越的性能、强大的功能和高度的灵活性,已然成为众多开发者构建现代 Web 应用程序的首选框架。它不仅能够高效地处理各种复杂的业务逻辑,还为开发者提供了丰富多样的工具和功能&…...
Spring Boot 2 学习指南与资料分享
Spring Boot 2 学习资料 Spring Boot 2 学习资料 Spring Boot 2 学习资料 在当今竞争激烈的 Java 后端开发领域,Spring Boot 2 凭借其卓越的特性,为开发者们开辟了一条高效、便捷的开发之路。如果你渴望深入学习 Spring Boot 2,以下这份精心…...
知识追踪模型DKT,DLKT详解及代码复现
定义与应用 知识追踪是一种 教育技术领域的重要方法 ,旨在通过分析学生的学习行为和表现,预测其掌握特定知识点的程度。这种方法的核心在于建立能够反映学习者认知状态的动态模型,从而实现对学生学习进度的实时监控和个性化指导。 DKT模型 DKT模型 是最早的知识追踪模型之…...
一类特殊积分的计算
一类特殊积分的计算 前言一、第一个引理二、第二个引理三、积分的计算后记 前言 今天讨论的这类积分是十分有趣的,在 Mathematics Stack Exchange 看见后,便打算在此将其中的计算过程完善一下。在本篇文章中,我们重点考虑求解如下积分&#…...
VScode 配置 C语言环境
遇到的问题集合 mingw官方下载网站(https://sourceforge.net/projects/mingw-w64/files/)更新之后,与网上大多数教程上写的界面不同了。 网上大多数教程让下载这个: 但是现在找不到这个文件。 写hello.c文件时,报错&…...
spring mvc源码学习笔记之十一
pom.xml 内容如下 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…...
小结:路由器和交换机的指令对比
路由器和交换机的指令有一定的相似性,但也有明显的区别。以下是两者指令的对比和主要差异: 相似之处 基本操作 两者都支持类似的基本管理命令,比如: 进入系统视图:system-view查看当前配置:display current…...
ffmpeg7.0 aac转pcm
#pragma once #define __STDC_CONSTANT_MACROS #define _CRT_SECURE_NO_WARNINGSextern "C" { #include "libavcodec/avcodec.h" }//缓冲区大小(缓存5帧数据) #define AUDIO_INBUF_SIZE 40960 /*name depthu8 8s16 …...
C#读取本地网络配置信息全攻略
一、引言 在当今数字化时代,网络已深度融入我们生活与工作的方方面面。对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键。想象一下,你正在开发一款网络诊断工具,需要精准定位网络连接问题,此时 IP 地址、…...
解决aerich init -t xx 报错ModuleNotFoundError: No module named ‘tomli_w‘
今天在学习fastapi的时候,发现一款数据库迁移工具,通过这个工具可以根据模型类来对数据库做出改变。 随跟着学: 在执行 aerich init -t settings.TORTOISE_ORM的时候, 彼其娘之。。 报了一些错误: Traceback (most recent ca…...
python检测gitlab中某个标签在一个月内添加和移除了多少次
可以通过 Python 脚本和 GitLab API 检测一个标签在一个月内被添加和移除的次数。以下是实现的步骤和示例代码: 步骤 获取 GitLab API 访问令牌:在 GitLab 中生成一个 Personal Access Token。设置时间范围:确定一个月的时间范围。调用 Git…...
学习模板之一
学习目标: 提示:这里可以添加学习目标 例如: 一周掌握 Java 入门知识 学习内容: 提示:这里可以添加要学的内容 例如: 搭建 Java 开发环境掌握 Java 基本语法掌握条件语句掌握循环语句 学习时间&#x…...
2025-微服务—SpringCloud-1~3
2025-微服务—SpringCloud 第一章、从Boot和Cloud版本选型开始说起1、Springboot版本2、Springcloud版本3、Springcloud Alibaba4、本次讲解定稿版 第二章 关于Cloud各种组件的停更/升级/替换1、微服务介绍2、SpringCloud是什么?能干吗?产生背景…...
centos7.6 安装nginx 1.21.3与配置ssl
1 安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel2 下载Nginx wget http://nginx.org/download/nginx-1.21.3.tar.gz3 安装目录 mkdir -p /data/apps/nginx4 安装 4.1 创建用户 创建用户nginx使用的nginx用户。 #添加www组 # groupa…...
PL/SQL语言的数据库交互
PL/SQL语言的数据库交互 引言 在当今的信息化时代,数据库管理系统(DBMS)在各行各业中扮演着至关重要的角色。为了高效地与数据库进行交互,许多程序员、数据库管理员和系统分析师选择使用PL/SQL(Procedural Language/…...
ARP欺骗
文章目录 ARP协议ARP欺骗原理断网攻击ARP欺骗(不断网) ARP协议 在局域网中,网络传输的是帧,帧里面有目标主机的MAC地址。arp协议负责将IP地址解析成对应的MAC地址 ARP欺骗原理 即通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量…...
Genymotion配套VirtualBox所在地址
在 Genymotion打开虚拟机前需要先打开VirtualBox中的虚拟机 C:\Program Files\Oracle\VirtualBox\VirtualBox.exe 再开启genymotion中的虚拟机开关...
TPS61022 PFM的机制以及TPS61xxx转换器的PFM与PWM之间的负载阈值
引言 TI 的大多数 TPS61xxx 低压升压转换器都配备了 PSM(省电模式),以帮助提高轻负载效率。但是,当它处于重负载状态时,输出纹波通常会高于 PWM。此外,PSM 和 PWM 之间的负载电流阈值不会直观地写入数据表中…...
1. npm 常用命令详解
npm 常用命令详解 npm(Node Package Manager)是 Node.js 的包管理工具,用于安装和管理 Node.js 应用中的依赖库。下面是 npm 的一些常用命令及其详细解释和示例代码。 镜像源 # 查询当前使用的镜像源 npm get registry# 设置为淘宝镜像源 …...
黑马linux入门笔记(01)初始Linux Linux基础命令 用户和权限 实用操作
B站 黑马程序员 的视频 BV1n84y1i7td 黑马程序员新版Linux零基础快速入门到精通,全涵盖linux系统知识、常用软件环境部署、Shell脚本、云平台实践、大数据集群项目实战等 增强自控力 冥想慢呼吸绿色锻炼充分休息减少决策次数优先做重要的事情(早晨)融入强自控群控…...
Markdown中甘特图的使用
Markdown中甘特图的使用 1. 前言2. 语法详解2.1 甘特图语法 3. 使用场景及实例4. 小结5. 其他文章快来试试吧🖊️ Markdown中甘特图的使用 👈点击这里也可查看 1. 前言 Markdown 的原生语法不支持绘制图形,但通过扩展模块,我们可…...
Django创建数据表、模型、ORM操作
1、创建项目 django-admin startproject PersonInfosProject 2、创建项目应用,进入PersonInfosProject文件夹,新建index应用,使用命令 cd PersonInfosProject python manage.py startapp 新建完成之后的目录结构 3、新建数据模型…...
No. 31 笔记 | Web安全-SQL手工注入技术学习 Part 2
一、研究背景 背景介绍 SQL注入是一种常见且高危的Web安全漏洞。攻击者可以通过构造恶意SQL查询语句来绕过验证机制,执行未授权操作,如获取敏感信息、篡改数据库内容甚至控制服务器。 研究内容 本笔记探讨以下数据库的手工注入技术: MySQLAc…...
Spring Boot中的扫描注解如何使用
在 Spring Boot 中,扫描注解是指通过注解来告诉 Spring 框架应该扫描哪些包、哪些类或哪些特定的组件,并将其作为 Spring 容器中的 bean 进行管理。Spring Boot 主要通过以下几种注解来实现自动扫描: ComponentScanSpringBootApplicationCom…...
用 Python 从零开始创建神经网络(十九):真实数据集
真实数据集 引言数据准备数据加载数据预处理数据洗牌批次(Batches)训练(Training)到目前为止的全部代码: 引言 在实践中,深度学习通常涉及庞大的数据集(通常以TB甚至更多为单位)&am…...
深入探讨 Vue.js 的动态组件渲染与性能优化
Vue.js 作为一款前端领域中备受欢迎的渐进式框架,以其简单优雅的 API 和灵活性受到开发者的喜爱。在开发复杂应用时,动态组件渲染是一项极其重要的技术,它能够在页面中动态地加载或切换组件,从而显著提升应用的灵活性与用户体验。…...
qml TextArea、TextEdit、TextField、TextInput的区别于联系
在 QML 中,TextArea、TextEdit、TextField 和 TextInput 都是用来接收用户输入的控件,但它们之间有一些区别和联系。 区别: TextArea:用于多行文本输入,可以接收多行文本输入。TextEdit:也用于多行文本输入…...
《探索 PC 端的开源神经网络多模态模型宝藏》
《探索 PC 端的开源神经网络多模态模型宝藏》 一、多模态模型:开启智能交互新纪元二、主流 PC 端开源多模态模型大赏1. Obsidian:轻量级多模态先锋2. GLM-Edge 系列:移动端与 PC 端的全能选手3. Minicpm-llama3-v2.6:紧凑高效的多…...
centos 搭建nginx+配置域名+windows访问
准备工作:一个完整的centos环境,nginx安装包(可以从官网下载)nginx: download 一:centos可能有精简版,部分环境没有相关依赖包, 需要检查以下项: 1.gcc检查:gcc -v(回车后应当有版…...
docker的数据卷和自定义镜像
docker的数据卷: 容器与宿主机之间,或者容器和容器之间的数据共享(目录)。 创建容器的时间,通过指定目录,实现容器于宿主机之间,或者容器和容器之间的数据共享。 容器的生命周期有限,…...