kafka的特性
kafka的使用场景
思考1:为什么 0.8 版本之后,生产者不在依赖于zookeeper?
答:为了防止zookeeper被过多的客户端连接。
思考2:为什么消费端要依赖于zookeeper?
答:因为消费端是主动拉取,而不是被动推送,所以需要实时监控节点的变化信息。所以不能省略。
zookeeper的作用主要是存储kafka集群的元数据信息。
Kafka中每个partition被划分成多个segment来组织数据。
如下面zookeeper集群
其它的Follower会通过选举产生新的Leader。
2.如果Follower宕机
Leader会动态感知,然后将原来的partition副本进行下线;在其恢复之后,才将已经下线的副本上线。
同步复制
1、生产者联系zookeeper,找到leader;
2、生产者向leader发送消息;
3、leadr收到消息写入到本地log;
4、follower从leader pull(拉取)消息;
5、follower向本地写入log;
6、follower向leader发送ack(确认)消息;
7、leader收到所有follower的ack(确认)消息;
8、leader向生产者回传ack(确认)消息;
异步复制
和同步复制的区别在与leader写入本地log之后,直接向生产者回传ack(确认)消息,不需要等待所有follower复制完成,这样做的缺点是,副本复制过程可能会出现异常。
1、集群分片分配算法
建设有n个broker, i个Partition;
原理:负载均衡,将Leader分区散落到不同的broker上(Leader负责读写,Follower只是负责同步数据);
2、分区平衡
言下之意就是当一个broker中leader分区过多的时候,就会进行重分区;
1、按时间周期进行清除
按照我们数据的最后的offset的数据写入时间作为该offset的最后修改时间;如果当前时间 - 最后offset的时间 > 配置时间周期 就会对segment进行清除。
2、压缩清除法
本质是只保留所有key的最后一个版本的数据。
1、kafka生产者在本地会存在一个缓存队列,当满足发送条件的时候,会将一整批数据发送到相应的分区中;
2、当满足一定的时长或者队列存满的情况都会触发发送条件;
1、消息发送前,先通过分区器Partitioner进行数据路由,选择某一个Topic分区。如果没有指定key,消息会被均匀的分配到所有分区。
2、可通过实现 Partitioner 接口扩展分区策略。
1、同步:生产者发一条消息时,立马发送到某个分区。每个follower同步leader消息,确认成功后,leader再向客户端发送确认。特点:低延迟、低吞吐率、无数据丢失。
2、异步:生产者发一条消息时,先写到缓冲区,缓冲区里的数据还没写到broker集群的某个分区时,就返回发送成功。特点:高延迟、高吞吐率、可能会有数据丢失。
AR: assinged replica 某一个分区已经分配的副本列表;
ISR: in-sync replica 跟主副本保持同步的副本列表;
Leader副本: AR的第一个副本;
1、如果一个Follower比Leader落后太多,或者超过一定时间未发起数据复制请求,则Leader将其从ISR中移除。
2、Leader写入数据后并不会告诉Producer消息发送成功(Commit),只有ISR列表中的所有 Folower 同步之后才会 Commit。
3、设置ISR主要是为了broker宕掉之后,将从ISR列表中重新选举partition的leader。
1、一个Consumer只能属于一个Consumer Group(消费组),Consumer Group是整个Kafka集群唯一的。
2、对于每一条消息,在同一个Consumer Group里只会被一个Consumer消费。
3、消息被消费后,并不会删除,只是相应的offset加一,消费者从某个Partition读取的最后一条消息的offset(偏置量)存于Zookeeper中(0.10.1.1版本后默认存于 Kafka 服务器 Topic:__consumer_offsets 中)。
4、一个partition只能对应一个消费组中的消费者,内置的Partition分配策略:Range与RoundRoboin。
因篇幅问题不能全部显示,请点此查看更多更全内容