版本
kafka_2.13-3.9.0
安装
单机部署
这里使用Kraft代替zookeeper的方式部署kafka,单节点的情况下可以实现运行一个进程即可,配置可以用默认或根据需求进行调整。
tar zxf kafka_2.13-3.9.0.tgz
./bin/kafka-storage.sh random-uuid
# 这里的uuid使用上面生成的内容,如果是集群方式部署,则每个节点都使用相同的uuid去初始化
./bin/kafka-storage.sh format -t SqfZtGruT_G6fQWBCuQEbg -c ./config/kraft/server.properties
./bin/kafka-server-start.sh -daemon ./config/kraft/server.properties
集群部署
部署方式与单机的区别仅配置文件做部分调整。
主机规划
| kafka1 | kafka2 | kafka3 |
|---|---|---|
| 10.11.200.47 | 10.11.200.48 | 10.11.200.49 |
解压文件
tar -zxf kafka_2.13-3.9.0.tgz -C /usr
ln -s /usr/kafka_2.13-3.9.0 /usr/kafka
编辑配置
cd /usr/kafka/config/kraft
vi server.properties
这里以10.11.200.47为例
advertised.listeners=PLAINTEXT://10.11.200.47:9092,CONTROLLER://10.11.200.47:9093
controller.listener.names=CONTROLLER
controller.quorum.voters=1@10.11.200.47:9093,2@10.11.200.48:9093,3@10.11.200.49:9093
inter.broker.listener.name=PLAINTEXT
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
listeners=PLAINTEXT://10.11.200.47:9092,CONTROLLER://10.11.200.47:9093
log.dirs=/usr/kafka/datas/broker
metadata.log.dir=/usr/kafka/datas/controller
log.retention.check.interval.ms=300000
log.retention.hours=168
log.segment.bytes=1073741824
node.id=1
num.io.threads=8
num.network.threads=3
num.partitions=3
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=3
process.roles=broker,controller
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
socket.send.buffer.bytes=102400
transaction.state.log.min.isr=2
transaction.state.log.replication.factor=3
min.insync.replicas=2
default.replication.factor=3
注意:listeners用于broker本地监听使用, advertised.listeners用于客户端连接使用。因此,若要将集群暴露在公网访问,那么advertised.listeners需要配置为公网IP或域名。
其他节点配置
节点2修改如下配置,其他配置与节点1相同
node.id=2
advertised.listeners=PLAINTEXT://10.11.200.48:9092,CONTROLLER://10.11.200.48:9093
listeners=PLAINTEXT://10.11.200.48:9092,CONTROLLER://10.11.200.48:9093
节点3配置
node.id=3
advertised.listeners=PLAINTEXT://10.11.200.49:9092,CONTROLLER://10.11.200.49:9093
listeners=PLAINTEXT://10.11.200.49:9092,CONTROLLER://10.11.200.49:9093
初始化数据目录
bin/kafka-storage.sh random-uuid
EtlYelPSRZKCw3GtLJFZuA
bin/kafka-storage.sh format -t EtlYelPSRZKCw3GtLJFZuA -c /usr/kafka/config/kraft/server.properties
注意:集群部署模式下,所有节点需要使用相同的随机码进行格式化。
启动集群
在各节点依次启动
bin/kafka-server-start.sh -daemon /usr/kafka/config/kraft/server.properties
创建启动脚本
#!/bin/bash
cd `pwd`
bin/kafka-server-start.sh -daemon /usr/kafka/config/kraft/server.properties
Kraft+SASL+SCRAM部署
集群的部署和上面一致,这里主要区别在于部署认证鉴权的部分
服务端配置
vi /usr/kafka/config/kraft/server.properties
controller.quorum.voters=1@10.11.200.47:8093,2@10.11.200.48:8093,3@10.11.200.49:8093
######## 认证配置
listeners=SASL_PLAINTEXT://10.11.200.47:8092,CONTROLLER://10.11.200.47:8093
inter.broker.listener.name=SASL_PLAINTEXT
advertised.listeners=SASL_PLAINTEXT://10.11.200.47:8092
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
######## 认证机制 配置
sasl.enabled.mechanisms=SCRAM-SHA-512
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512
listener.name.sasl_plaintext.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="adminauth123";
######## ACL 账号限制 配置
super.users=User:admin;User:ANONYMOUS
# ACL 对于 KRaft 模式的授权方式(类名)
authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer
这里把ANONYMOUS用户加到了超级用户里面,是因为当前Kraft集群的CONTROLL节点之间通信不支持认证模式,默认使用该账号,不添加这个账号会出现如下错误。
[2025-01-06 16:51:06,801] INFO [MetadataLoader id=1] initializeNewPublishers: the loader is still catching up because we still don't know the high water mark yet. (org.apache.kafka.image.loader.MetadataLoader)
[2025-01-06 16:51:06,805] ERROR [ControllerApis nodeId=1] Unexpected error handling request RequestHeader(apiKey=VOTE, apiVersion=1, clientId=raft-client-2, correlationId=0, headerVersion=2) -- VoteRequestData(clusterId='vXi-iuLbS0GLr_cp021e
9w', voterId=1, topics=[TopicData(topicName='__cluster_metadata', partitions=[PartitionData(partitionIndex=0, candidateEpoch=1, candidateId=2, candidateDirectoryId=stfw7wSuwgKpeViTito0TQ, voterDirectoryId=AAAAAAAAAAAAAAAAAAAAAA, lastOffsetEpoch=0, lastOffset=0)])]) with context RequestContext(header=RequestHeader(apiKey=VOTE, apiVersion=1, clientId=raft-client-2, correlationId=0, headerVersion=2), connectionId='10.11.200.47:8093-10.11.200.48:49364-0', clientAddress=/10.11.200.48, principal=User:ANONYMOUS, listenerName=ListenerName(CONTROLLER), securityProtocol=PLAINTEXT, clientInformation=ClientInformation(softwareName=apache-kafka-java, softwareVersion=3.9.0), fromPrivilegedListener=false, principalSerde=Optional[org.apache.kafka.common.security.authenticator.DefaultKafkaPrincipalBuilder@a770ef2]) (kafka.server.ControllerApis)
但是这里可以对ANONYMOUS账号进行权限控制,仅允许访问元数据,admin-user-jass鉴权文件在文中后续配置客户端鉴权信息部分会提到。
#限制ANONYMOUS账号权限
bin/kafka-acls.sh --bootstrap-server 10.11.200.47:8092 --add --allow-principal User:ANONYMOUS --operation Read --topic __cluster_metadata --command-config config/admin-user-jaas
listener.name.sasl_plaintext.scram-sha-512.sasl.jaas.config这个配置项在server.properties中的作用是配置broker之间的通信鉴权信息,若单独配置了broker之间采用非鉴权方式PLANINTEXT通信,则理论上可以不配置该项,但若kafka启动报错,故需要像如下方式配置即可:
listener.name.sasl_plaintext.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;
集群初始化
格式化存储时添加管理账号,每一台都要执行
bin/kafka-storage.sh random-uuid
vXi-iuLbS0GLr_cp021e9w
bin/kafka-storage.sh format -t vXi-iuLbS0GLr_cp021e9w -c /usr/kafka/config/kraft/server.properties --add-scram 'SCRAM-SHA-512=[name=admin,iterations=8192,password=adminauth123]'
启动集群
在各节点依次启动
bin/kafka-server-start.sh -daemon /usr/kafka/config/kraft/server.properties
配置客户端鉴权信息
vi config/admin-user-jaas
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-512
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="adminauth123";
后续的访问操作都需要带上鉴权文件
创建普通用户
bin/kafka-configs.sh --bootstrap-server kafka1:8092 --alter --add-config 'SCRAM-SHA-512=[password=ghca123]' --entity-type users --entity-name ghca --command-config /usr/kafka/kafka_2.13-3.9.0/config/admin-user-jaas
用户赋权
这里做测试使用权限赋予的比较大
bin/kafka-acls.sh --bootstrap-server kafka1:8092 --add --producer --allow-principal User:ghca --topic * --command-config /usr/kafka/config/admin-user-jaas
bin/kafka-acls.sh --bootstrap-server kafka1:8092 --add --consumer --allow-principal User:ghca --topic * --group * --command-config /usr/kafka/config/admin-user-jaas
bin/kafka-acls.sh --bootstrap-server kafka1:8092 --list --operation all --command-config /usr/kafka/config/admin-user-jaas
创建普通用户鉴权信息
vim config/command_config
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-512
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="ghca" password="ghca123";
访问测试
访问集群的时候都需要带上鉴权文件
创建主题
./bin/kafka-topics.sh --bootstrap-server kafka1:8092 --create --topic test --partitions 3 --replication-factor 3 --command-config /usr/kafka/config/command_config
查看主题
./bin/kafka-topics.sh --bootstrap-server kafka1:8092 --list --command-config /usr/kafka/config/command_config
生产消息
bin/kafka-console-producer.sh --broker-list kafka1:8092 --topic test --producer.config /usr/kafka/config/command_config
消费消息
bin/kafka-console-consumer.sh --bootstrap-server kafka1:8092 --topic test --consumer.config /usr/kafka/config/command_config --from-beginning
问题总结
当前基于Kraft的集群在仅开启PLAIN认证方式的集群时,是没有任何问题的,但是缺点就是账号密码不能灵活变动。若开启SCRAM认证集群,账号密码信息都写在集群元数据中,此时需要开启ACL,就会影响到controller节点之间的通信。我查阅了很多资料以及尝试了多种组合配置方式,只要不添加ANONYMOUS账号到超级用户里,集群就不能正常启动。因此根据资源和最终实践的结果判断,controller节点之间不支持SASL认证方式。
资料
Kafka KRaft模式探索:https://www.cnblogs.com/smartloli/p/16430041.html
ACL认证鉴权配置:https://www.cnblogs.com/Sol-wang/p/17675535.html
SASL认证鉴权配置:https://blog.csdn.net/qq_27047215/article/details/126800578
浙公网安备 33010602011771号