在数据传输过程中用于暂存消息的队列
消息生产者与消息消费者之间直接通过一条消息队列连接,当消息生产者生产了一条数据,然后将数据上传到消息队列,然后消息消费者将消息队列中的消息取出数据进行消费,然后数据也随之从队列中消失,也就是说,消息生产者生产的每一条数据只给与其相连接的消息消费者消费,并且在消费之后删除队列中的数据。
消息生产者将生产出来的消息发送到消息队列中,同时有多个消费者对消息对类中的消息进行消费,而且数据在被消费者消费之后也不会消失,而是在消息队列中落盘(保留到磁盘上),默认保存七天。
(1)减少响应时间:当遇到处理起来比较耗时但是时效性不强的数据时,可以将数据先存到消息队列中,消息消费者可以任何时间去处理这条数据,但是消息队列先给消息生产者发送确认收到的消息,让消息生产者继续生产数据,减少了消息生产者的等待时间
(2)解耦:减少了消息生产者与消息消费者之间的耦合度
Kafka就是一个分布式的基于订阅/发布的消息队列,用于处理大数据实时应用数据

1.架构概述
(1)producer:消息生产者,向Kafka消息队列中发送数据。
(2)consumer:消息消费者,从Kafka消息队列中拉取数据。
(3)consume group:消费者组,当消费者组订阅一个topic的数据时,消费者组内的每个消费者只能消费不同分区的数据,也就是在一个消费者组内,一分区只能由一个消费者消费,但是消费者组与组之间互不干涉。(消费者组是逻辑上的订阅者)
(4)broker:一台Kafka服务器就是一个broker,一个集群有多个broker,一个broker可以有多个topic。
(5)topic A :处理A种类型数据的消息队列,生产者和消费者都是面向topic进行传输数据,topic是逻辑上的概念,而partition是物理上的概念,每个partition对应一个log文件
log文件中保存的就是生产者生产的数据,生产者生产的数据不断被追加到log文件的尾部,,每条数据都有自己的offset,消费者会实时记录自己消费到哪个offset,当断开连接恢复后,能够继续进行消费。
(6)partition:分区,一个topic可以分为多个partition,如果一个topic分布在多个broker上,则可以根据broker分为几个分区,每个分区是一个有序的队列
(7)replica:备份副本,保存在其他的broker上,防止某个节点发生故障时,节点的数据可以恢复,topic的每个分区都有若干个副本,一个leader若干个follower
①分区的原因:
a.提高拓展性:partition和topic的大小具有弹性。
b.提高并发性:每个分区可以并行工作
②分区的原则
a. 指明 partition 的情况下,直接将指明的值直接作为 partiton 值;
b.没有指明 partition 值但有 key 的情况下,将 key 的 hash 值与 topic 的 partition 数进行取余得到 partition 值;
c.既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到 partition 值,也就是常说的 round-robin 算法。
步骤:
① 为保证producer发送的数据,能可靠的发送到指定的topic,topic的每个partition收到producer发送的数据后,都需要向producer发送ack(acknowledgement确认收到),如果producer收到ack,就会进行下一轮的发送,否则重新发送数据。
②partition中的leader先收到数据,然后partition中的leader开始对其副本follower进行同步,当leader对所有副本全部同步完之后,才给produce发送数据
②副本数据同步策略:
a.副本同步半数以上就开始发送ack,这一策略会降低数据传送的延迟,但是当出现leader故障时,当有2n+1个副本时,最多能容忍n个节点出现故障
b.副本全部同步完之后,才发送ack,这样当leader出现故障时,只要有一台副本没有出现故障就可以恢复即(n+1个副本能够容忍n台节点的故障),缺点是延迟比较高,但是对于Kafka来说,Kafka的每个分区都会有大量的数据,如果是第一种方案的话会产生大量的数据冗余,而网络延迟对于Kafka来说影响比较小。
③ 当leader收到数据开始同步时,出现follower故障:Leader维护了一个动态的in-sync replica set (ISR),意为和leader保持同步的follower集合。当ISR中的follower完成数据的同步之后,leader就会给producer发送ack。如果follower长时间未向leader同步数据,则该follower将被踢出ISR,该时间阈值由replica.lag.time.max.ms参数设定。Leader发生故障之后,就会从ISR中选举新的leader。
Kafka为用户提供了三种可靠性级别,用户可以根据对可靠性和延迟的要求来进行ack返回时机的配置。
① 0:producer不等待broker的ack。当broker发生故障时会丢失数据。
② 1: partition中的leader将数据落盘之后返回ack,如果在leader同步副本之前发生故障,就会丢失数据
③ -1:等待数据全部落盘之后才返回ack,容易造成数据重复。
保证每条消息被发送且仅被发送一次。
在0.11版本之后,Kafka Producer引入了幂等性机制(idempotent),配合acks = -1时的at
least once语义,实现了producer到broker的exactly once语义。
idempotent + at least once = exactly once
使用时,只需将enable.idempotence属性设置为true,kafka自动将acks属性设为-1,并将retries属性设为Integer.MAX_VALUE。
consumer采用pull模式(拉取数据)从队列中读取数据,因为如果依靠消息队列推送数据,很难适应不同需求的消费者,可能会造成拒绝服务和网络拥堵的问题,但是采用pull模式可能会出现消息队列中没有数据,消费者一直循环请求数据的情况,所以给消费者设置等待时间timeout减少循环次数。
Kafka对于确定哪个分区由哪个customer消费有两种分配策略
①:roundrobin:
②:range:
Kafka 0.9版本之前,consumer默认将offset保存在Zookeeper中,从0.9版本开始,consumer默认将offset保存在Kafka一个内置的topic中,该topic为__consumer_offsets。
①顺序写磁盘
Kafka的producer生产数据,要写入到log文件中,写的过程是一直追加到文件末端,为顺序写。官网有数据表明,同样的磁盘,顺序写能到到600M/s,而随机写只有100k/s。这与磁盘的机械机构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间
LSM-tree 就是利用了磁盘的顺序写,比往内存中随机读写都要快。
②零复制技术
Kafka集群中有一个broker会被选举为Controller,负责管理集群broker的上下线,所有topic的分区副本分配和leader选举等工作。
Controller的管理工作都是依赖于Zookeeper的。
原文:https://www.cnblogs.com/myjade/p/11164220.html