kafka 知识点小结

本文总结了Kafka的关键技术,包括利用MMAP进行高效磁盘写入,sendfile的零拷贝提高数据传输效率,以及数据过期策略。此外,还探讨了High WaterMarker、生产者负载均衡、消费者群组、Leader选举和副本复制(同步与异步)等核心概念,深入理解Kafka的高性能和高可用性机制。
摘要由CSDN通过智能技术生成

1. kafka利用MMAP内存映射磁盘文件技术,利用操作系统内存自我调度,而不是显式调用操作系统内核写数据(但有生产者同步参数ack=all/-1同步写入指定副本数会主动调用内核写数据到磁盘,性能会降低,指定副本数并不是设置的topic副本数,一般指定副本数超过一半就行,例如topic设置副本3(ISR中正常3个brokerid),同步写入副本数2,ack=all/-1就是与两份数据就返回给生产者客户端,设置的ack=1就是写入leader节点一份就返回了,默认ack=0,生产者只发数据管你写没写成功),再加上只能顺序写入磁盘,来达到高效率写数据

2. kafka利用操作系统内核的sendfile的零拷贝技术,减少从内核空间到用户空间,再从用户空间到内核空间数据拷贝消耗,直接磁盘顺序读(此处也是顺序读所以效率高)到内核空间,内核空间中数据用socket来发送数据到消费者客户端.

3.设置(日志)数据过期策略,有两种,①过期时间,②保留指定大小数据

copyOnWrite思想不阻塞生产与消费,定期(默认60000ms)另起线程检查时删除过期数据,按segment删除(先标记-1不再允许消费,同一时间只删除一个segment保证生产与消费高吞吐量),最近的segment包含不过期与过期数据怎么都不会删除的;

若果是指定超过大小的清除,最近的segment超过大小也不会删除??[此处存疑,以后看源码确定]

4.低版本的High WaterMarker高水位表明能读取到的数据位置,因为是顺序读写,真实写入数据到了Log End Offset (LEO),高水位<=LEO,中间follower节点与leader节点复制数据时,也有自己的高水位和LEO:

关系ack=0/1 生产客户端只发送数据不等待ack:follower高水位<=follower的LEO;    leader高水位<=leader的LEO

关系: ack=-1/all 生产客户端只管发送局不等待ack:follower的高水位<=leader的高水位<=follower的LEO<=高水位的LEO, #要指定的(写入副本数-1)个follower节点即可 (例如设置副本3个,设置ack等待副本是2(超一半),则是1个follower满足上面即可,[注意区别hdfs的流水写复制写和达到副本数ack机制的区别,之前记混了])

中间异常故障可能会出现著名的ABA问题,和java的cas(compaireAndSet)自旋锁一样的机制,后来kafka改为epoch方案,每次比对版本,follower节点去复制数据时只有版本是期望的版本才会写入数据.

5.生产者写入数据负载均衡策略:一般默认轮询策略,也有版本是hash,但是用户可自定义实现策略实现同一个key发想同一个partition分区;可缓存后批量发给broker提高效率

6.消费群组: 消费者是消费群组的一部分,一个或多个消费者共同读取一个主题,群组保证每个分区只能被一个消费者使用(多于partition个数的消费者只能空等待)。

---

7.kafka的leader election方案选举方案解决脑裂与羊群效应问题,它在所有的broker中选出一个controller,所有的partition的leader选举都有controller决定。controller会将leader的改变直接通过RPC的方式(比zookeeper Queue的方式更高效)通知需要为此作为响应的broker。

1、不用zk选举,使用controller(Controller会将leader的改变通过rpc方式通知给follower),没有zk负载过重问题
2、也没有注册watch不会触发任何事件-惊群效应
3、leader失败是由一个Controller进行选举并不会产生任何通信,所以不会有脑裂的情况

(1)Controller是如何选举出来的
每一个broker都会在Controller path(/controller)上注册一个watch。当前controller失败时,对应的Controller path会自动消失(临时节点)。此时该watch被触发,所有活着的broker都会去竞选成为新的Controller(创建新的controller path),但是只有一个会竞选成功。竞选成功者成为新的leader。竞选失败则重新在新的Controller path上注册watch,因为zk的watch是一次性的,被触发一次之后即失效,所以需要重新注册。
(2)如何使用Controller进行partition选举
a、从zk中读取当前分区的所有ISR(in-sync-replicas)集合
b、调用配置的分区算法选择分区的leader
kafka选择分区算法:
i、NoOpLeaderSelector–偏爱分区(SR中的第一个),并将leader发送给为此做出改变的broker,
ii、offlinePartitionLeader–也是选择偏爱分区作为leader
iii、reassignedPartitionLeader
iii、preferredReplicaPartitionLeader
iiii、ControlledShutdownLeader
上面五中算法都使用偏爱分区作为leader,区别是选择leader之后所做的操作不同。

---

8. kafka创建副本的2种模式——同步复制和异步复制

Kafka动态维护了一个同步状态的副本的集合(a set of In-Sync Replicas),简称ISR,在这个集合中的节点都是和leader保持高度一致的,任何一条消息只有被这个集合中的每个节点读取并追加到日志中,才会向外部通知说“这个消息已经被提交”。

    只有当消息被所有的副本加入到日志中时,才算是“committed”,只有committed的消息才会发送给consumer,这样就不用担心一旦leader down掉了消息会丢失。

    消息从leader复制到follower, 我们可以通过决定Producer是否等待消息被提交的通知(ack)来区分同步复制和异步复制,设置为1表示需要确认,那么只需要生产者把消息写到leader分区即可;设置为0表示不需要确认。

同步复制流程:

              1.producer联系zk识别leader

              2.向leader发送消息

              3.leadr收到消息写入到本地log

              4.follower从leader pull消息

              5.follower向本地写入log

              6.follower向leader发送ack消息

              7.leader收到所有follower的ack消息

              8.leader向producer回传ack

       异步复制流程:

              和同步复制的区别在于,leader写入本地log之后,

              直接向client回传ack消息,不需要等待所有follower复制完成。

卡夫卡支持副本模式,那么其中一个Broker里的挂掉,一个新的leader就能通过ISR机制推选出来,继续处理读写请求。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值