kafka详解

kafka:消息/存储/流处理

partition:offset(每message占1),分区内有序,分区数可考虑为 broker 的倍数
segment:baseOffset+file+offset index(relative offset-position)+timestamp index(timestamp - relative offset,注意后面到来的message如果timestamp更小则不入timestamp index)
offset查找message:找segment(skiplist),找offset index(二分,其实我觉得可以算出在offset index的位置)
timestamp查找message:找segment(每个segment的最大timestamp比较),找timestamp index(二分),找offset index(二分)

日志清理:log.cleanup.policy,默认delete,compact指同key的message保留最后一条
删除segment即delete:
1 时间:segment存在过长,默认7天
2 大小:segment超长
3 offset: segment内所有message的offset小于某值

删除topic:
delete命令/zk创建节点/删除数据和zk上的metadata

replica可增减,partition可增不可减(减那么partition数据怎么办,放其它partition那么数据乱序,数据乱timestamp,且迁移过程可用性怎么办)
replica:leader读写 follower拉取leader进行同步
preferred replica:AR的第一个,尽量保证preferred replica被选为leader(分区平衡,即定期重新选leader往preferred上靠,auto.leader.rebalance.enable,默认true),kafka会通过preferred replica均衡分布来保证leader均衡
分区重分配:增减broker,replica迁移

ISR:in-sync,时间控制(follower滞后leader时间超过阀值),AR=ISR+OSR
hw(high watermark):partition所有replica共享,代表consumer可消费的位置+1(即ISR内最小leo)
leo:每个replica都有,代表当前replica的写入位置+1
follower带leo请求leader,leader根据各follower的leo计算hw,返回message和hw给follower
数据一致性:如何保证老Leader 还是新选举的 Leader,Consumer 都能读到一样的数据?
基本所有副本都是ISR,但是ISR内Leader依然稍稍领先follower,如果直接读Leader最新消息那么Leader挂了在新Leader上却无法读取到此消息,不一致,所以只能读到hw

producer:producer interceptors - serializer - partitioner - record accumulator(每个partition多batch), sender thread发送
发后即忘/同步发送(future等待)/callback

consumer:poll拉取
subscribe 订阅topic (集合或正则)
assign 订阅partition (集合)
unsubscribe/subscribe(空)/assign(空) 取消订阅

__consumer_offsets: 此topic记录offset提交情况 committed offset=lastConsumedOffset+1,offset提交理解为ack
常见问题:重复消费(提交晚了)/数据丢失(提交早了)
自动提交:默认自动,enable.auto.commit
手动:commitSync/commitAsync

auto.offset.reset:consumer找不到offset怎么拉取?默认latest(分区尾部),earliest(分区起始),none(不消费)
seek:可在自己消费的partition上指定offset消费(重置offset),需先poll分配分区
再均衡:consumer增减导致partition的所有权变更,尽量避免(期间consumerGroup不可用,组内所有consumer不可读消息)

producer分区:
1 发送时指定partition
2 partitioner:DefaultPartitioner(存在key按key hash所有partition,否则轮询所有可用partition),也可自定义partitioner
consumer分区:partition.assignment.strategy 指定Assigner
同一group下各consumer订阅的topic列表可不同,找到group订阅的所有topic,对每一个topic,如何分配到订阅它的各consumer?
1 默认RangeAssigner: consumer均分所有分区(由于余数前面的consumer每个多分一个),c0:p0,p1,c1:p2,consumer分配到一个partition range
2 RoundRobinAssigner:各consumer订阅topic相同,所有topic的所有partition一起轮询,否则按单个topic的partition轮询分配,c0:p0,p2,c1:p1
3 StickyAssigner:尽量均匀且consumer下线重新分配尽量保证和以前一致
broker 分区副本分配
创建topic时replica-assignment指定,否则默认(1未指定机架信息,需所有broker未配置broker.rack或创建topic时disable-rack-aware 2指定机架信息 )

bootstrap.servers:指定broker集群的机器,最好2台以上,一台不行还有备用,客户端只是想先连上broker集群的任一机器
key(value).serializer/deserializer: producer和consumer需对应
group.id:consumer用来指定consumerGroup
acks:多少replica收到message才成功,-1(all)需ISR全部同步完才返回客户端应答(同步复制),1指leader写入即可(异步复制),0指发出即可不等响应

顺序性:partition写入有序,单partition只能被单个消费者消费
高性能/高吞吐
1 顺序写:不断append
2 page cache:file的inode含文件系统block列表,file的page cache含page的radix树结构,两者对应
所有read都过page cache(读不到缺页异常进行磁盘加载),所有write都写入page cache,手动fsync/周期fsync/操作系统自行fsync-自己决定
3 zero copy: 减少上下文切换和数据复制,linux底层通过sendfile,java中可以通过FileChannel.transferTo
非zero copy:disk-read buffer-app-socket buffer-nic buffer(网卡) 4次复制,4次上下文切换
zero copy:disk-read buffer-nic buffer(网卡) 2次复制,2次上下文切换
底层数据复制DMA(direct memory access)可完成,无需cpu:disk-read buffer, read/socket buffer-nic buffer
上层数据复制需cpu:read buffer-app,app-socket buffer
4 消息压缩/批量发送/分区分段+索引文件

幂等+事务实现exactly once
幂等: enable.idempotence,producer按照<producerId,partition>给message加seq number, partition收到某producer重复的seq丢弃,收到过大的seq则发生乱序,中间有message丢失
事务: 需开启幂等,保证多分区写入的原子性,幂等的增强(跨生产者会话),但不能保证committed transaction的所有消息都能被消费到

可靠性
多副本/acks=-1配合min.insync.replicas,若ISR只有leader,那么acks=-1即acks=1,需保证ISR的最小数量/手动提交/seek兜底

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Confluent Kafka 是一个流数据平台,它基于 Apache Kafka 构建,旨在简化企业对流式数据的管理和处理。Confluent Kafka 提供了许多功能和工具,可以帮助开发人员和企业更好地利用 Kafka 进行数据流的处理和分析。 首先,Confluent Kafka 提供了一个集中式控制面板,帮助用户更好地管理 Kafka 集群和主题。用户可以通过该控制面板监控和管理集群的状态、配置和性能指标,从而更好地了解数据流的情况,并做出相应的调整和优化。 其次,Confluent Kafka 还提供了一系列的工具和库,简化了对 Kafka 的开发和集成。其中最重要的是 Confluent Schema Registry,它可以用来管理和存储数据的 Avro 或其他序列化格式的 schema,方便开发人员在消费和生产数据时进行 schema 的验证和转换。此外,Confluent Kafka 还提供了一些开发工具和客户端库,如 Kafka Connect、Kafka Streams 和 KSQL,使得开发人员可以轻松地构建和处理流式数据应用。 另外,Confluent Kafka 还提供了一些高级功能,如 Exactly Once 处理和事务支持。这些功能使得在处理高吞吐量的数据时,确保不会丢失和重复处理数据变得更加可靠和简单。 综上所述,Confluent Kafka 是一个强大而全面的流数据平台,通过提供丰富的功能和工具,帮助企业更好地管理和处理流式数据。无论是开发人员还是数据工程师,都可以利用 Confluent Kafka 的各种功能和工具,构建可靠和高效的实时数据处理系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值