生产者push时ack配置:0,不需要接受到确认;1需要leader确认;-1需要follower确认。
幂等性:每个新的 Producer 在初始化的时候会被分配一个唯一的 PID,该PID对用户完全透明而不会暴露给用户。在底层,它和 TCP 的工作原理有点像,每一批发送到 Kafka 的消息都将包含 PID 和一个从 0 开始单调递增序列号。
同一分区内保证生产者的幂等性:如果消息序号比 Broker 维护的序号大 1 以上,说明中间有数据尚未写入,也即乱序,此时 Broker 拒绝该消息;如果消息序号小于等于 Broker 维护的序号,说明该消息已被保存,即为重复消息,Broker直接丢弃该消息。
事务性保证(生产者重启后跨分区写):应用程序必须提供一个稳定的(重启后不变)唯一的ID,也即Transaction ID。Transactin ID与PID可能一一对应。区别在于Transaction ID由用户提供,而PID是内部的实现对用户透明。
另外,为了保证新的Producer启动后,旧的具有相同Transaction ID的Producer即失效,每次Producer通过Transaction ID拿到PID的同时,还会获取一个单调递增的epoch。由于旧的Producer的epoch比新Producer的epoch小,Kafka可以很容易识别出该Producer是老的Producer并拒绝其请求。
Kafka对于offset的处理有两种提交方式:(1) 自动提交(默认的提交方式) ,参数:enable_auto_commit和auto_commit_interval_ms (2) 手动提交(可以灵活地控制offset):同步提交(失败的话一直重试,会阻塞消费)、异步提交(失败不重试)、同步+异步(失败时同步重试至成功)。
broker:kafka集群中的单个实例,启动后会生成一个controller用于brokerId注册到zk等;
controller:所有的broker中选出一个controller,负责与集群中其他broker协调通信,所有的partition的leader选举都有controller决定。
topic:生产者推,有分区键分区;分区partition有备份replica,其中一个replica为leader,其余为follower。
ISR:in-sync-replica; OSR:out-sync-replica
zookeeper:代理节点信息、Kafka集群信息、旧版消费者信息及其消费偏移量信息、主题信息、分区状态信息、分区副本分配方案信息、动态配置信息等。
高吞吐量:Kafka 将数据写到磁盘,充分利用磁盘的顺序读写。零拷贝技术:数据读取完全在内核中完成,内核缓存区直接将数据给socket缓存区,减少内存缓存和用户缓存的交互;支持数据压缩及批量发送;分区,类似于多线程消费。
消费者并发消费:(单个消费者实例注册多个消费者)在创建容器时,会根据Id进行区分,每个Id的ConcurrentMessageListenerContainer容器又会根据concurrency的值,循环创建KafkaMessageListenerContainer容器,即循环创建concurrency个消费者, 每个分区对应一个消费者,实现并发消费。
HW:high watermark,即主节点和副本中最小的log值(可能部分副本没有追上主节点),消费者能消费到的最大log位置。
LW:AR中logStartOffset日志最小位置
LEO:logEndOffset,数据可写入位置
LSO:LastStableOffset,如果生产者没有提交事务(执行CommitTransaction),那么对于isolation.level=read_committed的消费者而言是看不到这些消息的,而isolation.level=read_uncommitted则可以看到(即可能看到未提交的数据)。如果设置事务,消费者只能只能消费到LSO位置,如果不设置事务,可以消费到HW位置。
kafka log文件存储机制:kafka在我们指定的log.dir目录下,会创建一些文件夹;名字是【topic名字-partition名】所组成的文件夹用于持久化消息。
segment file组成:由两个部分组成,分别为index file和data file,此两个文件一一对应且成对出现; 后缀.index和.log分别表示为segment的索引文件、数据文件。
segment文件命名规则:partion全局的第一个segment从0开始,后续每个segment文件名为上一个全局 partion的最大offset(偏移message数)。数值最大为64位long大小,19位数字字符长度,没有数字就用0 填充。
索引方法:index file是稀疏存储,为了数据创建索引,但范围并不是为每一条创建,而是为某一个区间创建;键值对形式,例如1:20表示第1条消息的offset为20,定位某一条消息需要二次索引。