什么是kafka
kafka是一个开源流处理平台,由java和scala编写。是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。kafka的目的是通过hadoop的并行加载机制来同意线上和离线的消息处理,也是为了通过集群来提供实时的消息。简单的来说,它就是一个消息中间件,天然分布式、支持集群的,专注于数据吃的存放缓存的。
相关术语
broker(经纪人):kafka服务器,用户存储消息的。kafka集群中一台或多台服务器被称为broker
topic(话题):每条发布到kafka集群中的消息都有一个类别,这个类别被称为topic。(物理上不同Topic 的消息分开存储。逻辑上一个 Topic 的消息虽然保存于一个或多个broker上,但用户只需指定消息的 Topic 即可生产或消费数据而不必关心数据存于何处)
producer(生产者):负责把消息发送到broker。
consumer(消费者):消息消费者,想kafka读取消息的客户端。
partition(分区):Partition是物理上的概念,每个Topic包含一个或多个Partition,例如:“kafka-test”这个Topic下可以分为6个分区,分别由两台服务器提供,那么通常可以配置为让每台服务器提供3个分区,假如服务器ID分别为0、1,则所有的分区为0-0、0-1、0-2和1-0、1-1、1-2。Topic物理上的分组,一个 topic可以分为多个 partition,每个 partition 是一个有序的队列。partition中的每条消息都会被分配一个有序的 id(offset)。
offset(偏移量):消息存储在Kafka的Broker上,消费者拉取消息数据的过程中需要知道消息在文件中的偏移量,这个偏移量就是所谓的Offset。
特性
kafka是一种高吞吐量的分布式发布订阅消息系统有如下特性:
1 同时为发布和订阅提供高吞吐量:通过I/O的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。即使是非常普通的硬件kafka也支持每秒数百万的消息。
2 消息持久化:将消息持久化到磁盘,可用于批量消费。
3 分布式支持server间的消息分区及分布式消费,同时保证每个partition内的消息顺序传输。这样易于向外扩展,所有的producer,broker,consumer都会有多个均为分布式的,无需停机即可展开机器。
4消费者消息采用pull(拉取)模式:消息被处理的状态实在consumer端维护,而不是由server端维护,broker无状态,consumer自己保存offset。
5 支持online(在线)和offline(离线)的场景:同时支持离线数据处理和实施数据处理
kafka运行流程
首先启动zookeeper和broker(kafka服务器),broker先去zookeeper中注册成为 leader(领导人)。如果brokers同时去zookeeper中注册,那么zookeeper将会通过投票选举出leader,其余的broker成为follower(跟随者),zookeeper必须为单数。如果broker是排队注册的话,则第一个注册的broker为leader。
生产者发布消息给指定的话题,如果话题不存才则zookeeper创建一个新话题,接着推送数据给broker。
消费者消费数据的话需要先去zookeeper中获得授权,才能在broker中拉取数据。
topic和part'ition
消息发送时需要指定topic,topic由是由一些Partition Logs(分区日志)组成。partition的名称规则为:topic名称+有序序号,第一个序号从0开始计。partition是实际物理上的概念,而topic是逻辑上的概念。其组织结构如下图所示:
以Partition的形式存放日志由两个好处:
1 方便在集群中扩展,一个topic可以由多个分区组层,每个分区可以放在多个borker上,可以做到适合任意大小的消息量。
2 可以提高并发,消费时是针对consumer消费的,通过增加partation、consumer可以提升性能。