kafka的经典问题有这几个:
1.kafka节点之间如何备份?
2.kafka消息是否会丢失?为什么?
3.kafka最合理的配置是什么?
4.kafka的leader选举机制是什么?
5.kafka对硬件有什么要求?
6.kafka的消息保证有几种方式
经过网上的查阅资料,几个问题的粗略答案如下:
1.Kafka允许用户为每个topic设置副本数量,副本数量决定了有几个broker来存放写入的数据。如果你的副本数量为3,那么一份数据就会被存放在3台不同的机器上,在所有备份节点中,有一个节点作为lead节点,这个节点保存了其它备份节点列表,并维持各个备份间的状态同步
副本以topic的分区为单位。在正常情况下,kafka每个分区都有一个单独的leader,0个或者多个follower。副本的总数包括leader。所有的读取和写入到该分区的leader。通常,分区数比broker多,leader均匀分布在broker。Follow的日志完全等同于leader的日志-相同的顺序相同的偏移量和消息(当然,在任何一个时间点上,leader比follower多几条消息,尚未同步到follower)
Follower作为普通的消费者从leader中消费消息并应用到自己的日志中。并允许follower从leader拉取批量日志应用到自己的日志,这样具有良好的性能。
2.消息不是特殊情况并不会丢失,在Producer端,当一个消息被发送后,producer会等待broker成功接收到消息的反馈(可通过参数控制等待时间),如果消息在途中丢失或是其中一个broker挂掉,producer会重新发送(可以通过参数控制是否等待所有备份节点都收到消息)
在Consumer端看,broker端记录了partition中的一个offset值,这个值指向Consumer下一个即将消费message。当consumer收到了消息,但在处理过程中挂掉,此时consumer可以通过这个offset值重新找到上一个消息再进行处理,consumer还有权限控制这个offset值,对持久化到broker端的消息做任意处理
4.kafka动态维护了一个同步状态的副本合集,简称ISR,在这个集合中的节点都是和leader保持高度一致,任何一条消息必须被这个集合中的每个节点读取并追加到日志中,才会通知外部这个消息已经被提交了。因此这个集合中任何一个节点随时都可以被选为leader.ISR在Zookeeper中维护。ISR中有f+1个节点,就可以允许在f个节点down掉的情况下不会丢失消息并正常提供服务。ISR的成员是动态的,如果一个节点被淘汰了,当它重新达到“同步中”的状态时,他可以重新加入ISR,这种leader的选择方式是非常快速的,适合kafka的应用场景。
6.
有多种可能的消息传递保证可以提供:
At most once—Messages may be lost but are never redelivered.
最多一次 — 消息可能丢失,但绝不会重发。
At least once—Messages are never lost but may be redelivered.
至少一次 — 消息绝不会丢失,但有可能重新发送。
Exactly once—this is what people actually want, each message is delivered once and only once.
正好一次 — 这是人们真正想要的,每个消息传递一次且仅一次
kafka默认是保证“至少一次”传递,并允许用户通过禁止生产者重试和处理一批消息前提交它的偏移量来实现 “最多一次”传递。而“正好一次”传递需要与目标存储系统合作,但kafka提供了偏移量,所以实现这个很简单
3和5的问题还没有什么好的答案,如果想要知道,可以在下面网站查阅资料,这也是我上面这些答案找到的地方
http://orchome.com/
http://www.aboutyun.com/thread-19665-1-1.html