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画的图,太费劲了,画了老半天,有好用的画图工具欢迎推荐)

实例化
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 serialize
KafkaProducer.partion
TopicPartition
RecordAccumulator.applend
Sender.wakeup
RecordAccumulator
RecordAccumulator是消息队列用于缓存消息,根据TopicPartition对消息分组
重点看下RecordAccumulator.applend追加消息的流程
appendsInProgress.incrementAndGet();
Deque<ProducerBatch> dq = getOrCreateDeque(tp);
...
private Deque<ProducerBatch> getOrCreateDeque(TopicPartition tp) {
Deque<