kafka
2020-06-23 18:47:54 80 举报
AI智能生成
登录查看完整内容
kafka简介
作者其他创作
大纲/内容
kafka
设计特点
高吞吐量,每秒百万级的消息读写
持久化存储,并有replication副本防止丢失
分布式,producer,broker,consumer都为分布式实现
磁盘系统
kafka的高吞吐量主要得益于磁盘系统的使用设计,broker基于内存映射文件技术,将消息先写入系统的页缓存中,页缓存直接映射到磁盘文件
架构
图
Kafka强依赖于ZooKeeper
brocker
broker就是kafka server,每一台kafka服务器都是一个brocker
选举
通过在zk上创建临时节点/controller临时节点来实现leader选举,并在该节点上写入当前brocker信息,利用zk的强一致性特性,一个节点只能被一个客户端创建成功,创建成功的broker即为leader,即先到先得原则,其他节点会监听watch /controller节点
producer
主要负责序列化消息并发送
consumer
consumerGroup
消费者组,含有一个组名,partition在一个组内只能有一个consumer消费,可以用来实现消息广播,多个CG同时订阅一个topic
子主题
topic
每条消息属于且仅属于一个Topic
发送和订阅消息都必须指定topic
partition
topic的组成单元,可以水平扩容,是kafka高吞吐量的保障
消息持久化时,每条消息都是根据一定的分区规则路由到对应的partition中,并append到log文件的尾部
在同一个partition中消息是顺序写入且有序的,但不同partiton之间不能保证消息的有序性
个数最好与服务器个数相当
多个大小相等的segment file (段)组成了一个partition
副本 replication
partition可以有指定数据的副本,主从模式,producer和consumer只与leader交互follower从leader复制
ISR
in-sync replica,已同步的副本
Kafka会在Zookeeper上针对每个Topic维护一个ISR,持有partition的已同步的副本信息,如果某个分区的Leader不可用,Kafka就会从ISR集合中选择一个副本作为新的Leader。\u000B
setment file
每个partition 就相当于一个巨型的文件 里面由多个大小相等的segment file小文件组成,但是每个segment file 的消息数量并不一定相等,
组成
.index 索引文件
包含若干索引条目,每个条目表示数据文件中一条message的索引
.log 数据文件
offset
位移
partition中的每个消息都有一个连续的序号,用于partition唯一标识一条消息。Offset记录着下一条将要发送给Consumer的消息的序号。Offset从语义上来看拥有两种:Current Offset和Committed Offset。
current offset
Current Offset保存在Consumer中,它表示Consumer希望收到的下一条消息的序号。它仅仅在poll()方法中使用。例如,Consumer第一次调用poll()方法后收到了20条消息,那么Current Offset就被设置为20。这样Consumer下一次调用poll()方法时,Kafka就知道应该从序号为21的消息开始读取。这样就能够保证每次Consumer poll消息时,都能够收到不重复的消息。
Committed Offset
已提交位移,保存在Broker上,表示Consumer已经确认消费过的消息的序号,举个例子,Consumer通过poll() 方法收到20条消息后,此时Current Offset就是20,经过一系列的逻辑处理后,并没有调用consumer.commitAsync()或consumer.commitSync()来提交Committed Offset,那么此时Committed Offset依旧是0。
总结
Current Offset是针对Consumer的poll过程的,它可以保证每次poll都返回不重复的消息;而Committed Offset能够保证新的Consumer能够从正确的位置开始消费一个partition,从而避免重复消费。
存储模型
groupid-topic-partition -> offset的方式保存。实际上保存在__consumers_offsets这个topic中。
参数配置
ACKS
影响消息持久化
auto.offset.reset
表示如果Kafka中没有存储对应的offset信息的话(有可能offset信息被删除),消费者从何处开始消费消息。它拥有三个可选值:
earliest:从最早的offset开始消费latest:从最后的offset开始消费none:直接抛出exception给consumer
场景
Consumer消费了5条消息后宕机了,重启之后它读取到对应的partition的Committed Offset为5,因此会直接从第6条消息开始读取。此时完全依赖于Committed Offset机制,和auto.offset.reset配置完全无关。
新建了一个新的Group,并添加了一个Consumer,它订阅了一个已经存在的Topic。此时Kafka中还没有这个Consumer相应的Offset信息,因此此时Kafka就会根据auto.offset.reset配置来决定这个Consumer从何处开始消费消息。
producer配置
table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"1165\" style=\"border-collapse: collapse;width:671pt;mso-yfti-tbllook:1536\" span style=\
consumer配置
table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"1206\" style=\"border-collapse: collapse;width:695pt;mso-yfti-tbllook:1536\" span style=\
0 条评论
回复 删除
下一页