kafka acl+scram权限认证 topic前缀匹配与producer源码解读

本文介绍了Kafka的ACL与SCRAM权限认证配置注意事项,包括Zookeeper连接配置和命令操作。此外,讲解了Kafka的Topic前缀匹配模式,以及2.0之后的–resource-pattern-type参数的使用。最后,详细解读了Kafka Producer的源码,涵盖构造方法、消息发送流程、RecordAccumulator和Sender线程的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

kafka acl+scram权限认证

1.关于配置scram权限认证的文章网上很多,这里就不一一阐述了,下面说下注意的事项,在配置server.properties的时候,zookeeper.connect=127.0.0.1:2181,127.0.0.1:2181,127.0.0.1:2181/kafka,如果这项后面加上了/kafka,那么你之后的所有命令都要带上/kafka,否则认证不光出不来,还会出现各种各样的问题。当然/kafka这里是自己定义的,名字可以改变。配置这个的主要作用是防止kafka数据冲突,因为kafka的信息目前的版本还都是存储在zookeeper上,kafka官方说后续会用kafka内置的zookeeper,目前还没有实现。kafka的topic、users等信息默认是存储在/config下面的。

2.下面的kafka启动命令加上-daemon作用是以守护进程的方式启动,防止kafka异常终止

    ./bin/kafka-server-start-saal.sh -daemon config/server-saal.properties &

topic前缀匹配test---->

创建用户wuchao123

./kafka-configs.sh --zookeeper hadoop1:2181 --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=wuchao123],SCRAM-SHA-512=[password=wuchao123]' --entity-type users --entity-name wuchao123

普通topic增加权限

增加writer用户写权限

./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=hadoop1:2181 --add --allow-principal User:wuchao123 --operation Write --topic wuchao123

增加用户reader读权限

./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=hadoop1:2181/kafka --add --allow-principal User:wuchao123 --operation Read --topic wuchao123 --group reader-group

增加reader-group组权限

./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=hadoop1:2181/kafka --add --allow-principal User:wuchao123 --operation Read --group reader-group

查看配置的权限信息

./kafka-configs.sh --zookeeper hadoop1:2181 --describe --entity-type users  --entity-name wuchao123

生产消息

./kafka-console-producer-saal.sh --broker-list hadoop1:9092 --topic wuchao123  --producer.config /opt/kafka/config/producer.conf

消费消息

./kafka-console-consumer-saal.sh --bootstrap-server hadoop1:9092 --topic wuchao123 --consumer.config /opt/kafka/config/consumer.conf --from-beginning

查看zookeeper下kafka注册的用户信息

./zkCli.sh
ls /config/users/

topic前缀匹配模式

topic=* 表示所有topic

创建topic

./kafka-topics.sh --create --zookeeper hadoop1:2181 --create --topic chao_first --partitions 1 --replication-factor 1

./kafka-topics.sh --create --zookeeper hadoop1:2181 --create --topic chao_first_01 --partitions 1 --replication-factor 1

./kafka-topics.sh --create --zookeeper hadoop1:2181 --create --topic chao_first_02_03 --partitions 1 --replication-factor 1

查看topic

./kafka-topics.sh --list --zookeeper hadoop1:2181

在kafka2.0之后引入了–resource-pattern-type这个参数,可以针对特定的资源(topic)命名规则,例如前缀,来为某一类的topic添加规则。而之前的办法只能读完整的topic设置规则,字符’‘表示所有的,这不是规则表达式匹配任意字符的意思,而就是文本字符’’。
例如: Write 写权限 Read 读权限 All 所有权限

./kafka-acls.sh --authorizer-properties zookeeper.connect=hadoop1:2181 --add --allow-principal  User:wuchao123  --operation Write --resource-pattern-type prefixed --topic chao_

./kafka-acls.sh --authorizer-properties zookeeper.connect=hadoop1:2181 --add --allow-principal  User:wuchao123  --operation Read --resource-pattern-type prefixed --topic chao_

测试

./kafka-console-producer-saal.sh --broker-list hadoop1:9092 --topic chao_first_02_03  --producer.config /opt/kafka/config/producer.conf

./kafka-console-consumer-saal.sh --bootstrap-server hadoop1:9092 --topic chao_first_01 --consumer.config /opt/kafka/config/consumer.conf --from-beginning

producer源码解读

Kafka常用术语

Broker:Kafka的服务端即Kafka实例,Kafka集群由一个或多个Broker组成,主要负责接收和处理客户端的请求

Topic:主题,Kafka承载消息的逻辑容器,每条发布到Kafka的消息都有对应的逻辑容器,工作中多用于区分业务

Partition:分区,是物理概念,代表有序不变的消息序列,每个Topic由一个或多个Partion组成

Replica:副本,Kafka中同一条消息拷贝到多个地方做数据冗余,这些地方就是副本,副本分为Leader和Follower,角色不同作用不同,副本是对Partition而言的,每个分区可配置多个副本来实现高可用

Record:消息,Kafka处理的对象

Offset:消息位移,分区中每条消息的位置信息,是单调递增且不变的值

Producer:生产者,向主题发送新消息的应用程序

Consumer:消费者,从主题订阅新消息的应用程序

Consumer Offset:消费者位移,记录消费者的消费进度,每个消费者都有自己的消费者位移

Consumer Group:消费者组,多个消费者组成一个消费者组,同时消费多个分区来实现高可用(组内消费者的个数不能多于分区个数以免浪费资源

Reblance:重平衡,消费组内消费者实例数量变更后,其他消费者实例自动重新分配订阅主题分区的过程

下面用一张图展示上面提到的部分概念(用PPT画的图,太费劲了,画了老半天,有好用的画图工具欢迎推荐)

file

实例化

KafkaProducer构造方法主要是根据配置文件进行一些实例化操作

1.解析clientId,若没有配置则由是producer-递增的数字

2.解析并实例化分区器partitioner,可以实现自己的partitioner,比如根据key分区,可以保证相同key分到同一个分区,对保证顺序很有用。若没有指定分区规则,采用默认的规则(消息有key,对key做hash,然后对可用分区取模;若没有key,用随机数对可用分区取模【没有key的时候说随机数对可用分区取模不准确,counter值初始值是随机的,但后面都是递增的,所以可以算到roundrobin】)

3.解析key、value的序列化方式并实例化

4.解析并实例化拦截器

5.解析并实例化RecordAccumulator,主要用于存放消息(KafkaProducer主线程往RecordAccumulator中写消息,Sender线程从RecordAccumulator中读消息并发送到Kafka中)

6.解析Broker地址

7.创建一个Sender线程并启动

...
this.sender = newSender(logContext, kafkaClient, this.metadata);
this.ioThread = new KafkaThread(ioThreadName, this.sender, true);
this.ioThread.start();
...
消息发送流程

消息的发送入口是KafkaProducer.send方法,主要过程如下

KafkaProducer.send
KafkaProducer.doSend
// 获取集群信息
KafkaProducer.waitOnMetadata 
// key/value序列化
key\value serialize
// 分区
KafkaProducer.partion
// 创建TopciPartion对象,记录消息的topic和partion信息
TopicPartition
// 写入消息
RecordAccumulator.applend
// 唤醒Sender线程
Sender.wakeup
RecordAccumulator

RecordAccumulator是消息队列用于缓存消息,根据TopicPartition对消息分组

重点看下RecordAccumulator.applend追加消息的流程

// 记录进行applend的线程数
appendsInProgress.incrementAndGet();
// 根据TopicPartition获取或新建Deque双端队列
Deque<ProducerBatch> dq = getOrCreateDeque(tp);
...
private Deque<ProducerBatch> getOrCreateDeque(TopicPartition tp) {
   
    Deque<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值