一:概述
Kafka是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统,可以用于web/nginx日志、访问日志,消息服务等等。
Kafka是基于发布-订阅模式,即同一条数据可以被多个消费者消费,但是多个消费者必须处在不同分组中
二:优点:
1)解耦:
数据产生系统与数据处理系统分离,系统间影响降到最低,单个系统出现异常不影响整体环境。
2)冗余:(副本)
kafka创建多个分区副本存储消息,保证主分区出现通讯异常后,可以在其他节点访问副本消息。
3)扩展性:
通过zookeeper,可以实现动态变化节点数(broker),并同步分区副本。
4)灵活性&峰值处理能力:
producer,broker,consumer均采用负载均衡处理数据,避免单个broker,单个topic,单个partition处理过量的数据
5)可恢复性:
一个处理消息的进程挂掉,已经加入到队列中的消息仍然可以在系统恢复后被处理。
6)缓冲:
kafka消息优先写在pagecache中,消息处理增速,可以在O(1)的系统开销下进行消息持久化。
7)异步通信:
非立即处理数据,等待consumer从队列中poll消息。
三:组件
1)broker:
Kafka 集群包含一个或多个服务器,服务器节点称为broker。broker存储topic的数据。每一个topic可以切分成多个partiton,partition均匀分布在broker中,当partion>broker,会出现broker负载不均衡
2)Topic:
消息类别,由业务逻辑上定义,属于同一类别的消息,以相同的逻辑处理message。
3)Partition:
将topic中的消息分布式存储在一个或多个partition。每个独立的partition中的数据是有序的,同一个topic不同partition间的数据是无序。
4)Producer:
产生数据即造数据,为每个topic生成数据。
5)Consumer:
处理和加工数据,从topic中pull数据,加工成业务需要的数据。
6)Consumer Group:
为每个topic创建的,同属一个组的Consumer对topic中的消息消费一次。隶属不同组的Consumer可以重复消费同一个message,实现一个topic消息的广播和单播的手段。
7)Leader:
每个partition有多个副本,但是每个分区有且仅有一个作为Leader,Leader是当前负责数据的读写的partition。
8)Follower:
用于备份partition的副本,当leader失效时,上位,实现了高可用。
9)Offset:
偏移量,用来记录单个组中consumer对每个partition消费到的位置。可以实现重复或跳跃消费message。
四:为啥高性能
1)Push vs. Pull
push:是由broker收到消息后,主动推送给Consumer,不去考虑Consumer所承受的压力,会造成网络拥塞,网卡塞满,可以尽可能以最快速度传递消息。
pull:是由Consumer自主控制,随时决定消费消息(想什么时候处理就什么时候处理),以及消费处理快慢。kafka的consumer采用这种方式。
2)数据安全性
当Producer向broker发送消息时,通过配置ack参数配置分成三种级别:0-保证数据正确产生,并准备发送给broker,无法保证一定发送成功。1-发送数据到broker的leader中,但是未等副本保存结果。-1-等待副本保存成功后再确认消息commit成功。Producer可以失败尝试,可以生成一种类似于主键的东西,通过幂等性的重试多次,保证同一message只被commit一次。
当Consumer通过offset从broker读取消息后,1.可以选择立即commit,修改offset到下一条消息上。2.可以等待单个消息加工完成手动commit,保证了每条数据都被消费。3.批量消费消息加工后,手动commit,减少了offset修正次数,增加了重复消费几率。如果未提交offset,会重复消费。
通过参数enable-auto-commit参数配置是否开启自动提交,auto-offset-reset分为三个参数:earliest-获取上一次消费的offset继续消费或者从头开始消费(重复消费),必重复,latest-获取上一次消费的offset继续消费或者最新的offset消费(丢失消费),none-必须要有上次消费的offset,否则报错。
这个offset由Consumer控制。broker是无状态的,它不需要标记哪些消息被哪些消费过,也不需要通过broker去保证同一个Group只有一个Consumer能消费某一条消息,因此也就不需要锁机制,这也为Kafka的高吞吐率提供了有力保障
3)数据顺序性
在发送一条消息时,可以指定这条消息的key,Producer根据这个key和Partition机制来判断应该将这条消息发送到哪个Parition。相同的key会发送到同一个partition中,保证了数据顺序性,破坏了高性能。