Kafka-分布式发布-订阅消息系统,最初是由LinkedIn公司所开发,Scala语言编写,之后加入Apache旗下,成为了Apache的子项目。
Kafka具有以下特性:
1. 消息持久化:采用时间复杂度O(1)的磁盘存储结构,即使TB级以上数据也能保证常数时间的访问速度。
2. 高吞吐:Kafka拥有很高的吞吐量,即使是在单节点性能比较低下的商用集群中,也能保证单节点每秒10万条消息的传输。
3. 高容错:Kafka在设计上支持多分区、多副本的策略,拥有很强的容错性。
4. 易扩展:在进行集群扩展时,集群无需停机,就可以轻松完成对集群规模的扩展,新增加的节点自动感知,加入集群。
5. 多种处理模式:支持离线、实时的处理模式,应对各种生产环境。
应用场景
作为一个消息队列,Kafka避免了交叉信息传递中消息传递混乱的现象,作为一个中间数据收集、汇总层,对多种消息传递场景进行解耦,并且自身具有相当优越的冗余机制和高扩展性,并且根据自身的设计,也具备非常强的消息传递灵活性以及很好的峰值处理能力,在大数据领域的各种数据采集场景中,都有很广泛的应用。基本概念
Broker:一个Broker就是Kafka集群中的一个节点,多个Broker组成了Kafka集群。
Topic:Topic只是一个逻辑上的概念。Kafka把同一类数据进行汇总,每一类数据的集合就是一个Topic。生产者Producer将同一类型的数据写入同一个Topic,消费者Consumer从同一个Topic中消费该同类数据。
Partition:分区是一个物理概念,每一个Topic都可以包含很多个Partition。是一个有序的不可修改的消息队列,每个分区内消息是有序的,并且每个分区对应一个文件夹,用来存储分区的数据以及索引。
Replication:分区的副本,每个副本存储在不同的Broker中。
Producer:消息生产者,是Kafka中向Broker发布消息的客户端。
Consumer:消息消费者,是消费Broker中信息的客户端。
Consumer Group:Kafka中支持将多个消费者作为一个群体,就是Consumer Group消费者组。每一个Consumer都隶属于一个特定的消费者组,并且一条消息可以发送给多个不同的消费者组,但是每一个消费者组中只能有一个消费者消费该消息。
Zookeeper:Zookeeper负责保存Kafka的元数据,同时也负责Kafka的集群管理。
工作机制
1 一些Producer向Kafka集群发布消息,之后由多个Consumer从Kafka集群中消费消息,Zookeeper为Kafka集群提供了相应的协调服务2 消息在Broker中按照Topic进行分类,并且在每个Topic中有多个Partition分区,每个分区又可以有多个Replication副本,这些副本存放在不同的Broker中。
3 Kafka中Partition是一个FIFO队列(先进先出),所以写入某个Partition中的消息是采用在队列末尾追加的形式,而消费消息是从队列头部来顺序进行读取。
一个Topic可分为多个Partition,仅保证同一分区内消息有序存储,不保证Topic整体(多个分区之间)有序
4 Consumer Group消费者组是为了加快消费的读取速度的一个模型,一个消费者组中的多个Consumer可以并行消费同一个Topic中的数据。
并且多个Consumer Group可以消费同一个Topic,这些消费者组之间是平等的,即同一条消息可同时被多个消费者组消费。
同一个Consumer Group消费者组中的多个Consumer消费者之间是竞争关系,也就是说同一条消息在一个消费者组中只能被一个消费者所消费。
数据存储
Partition是一个物理结构,它的实际存储在一个文件夹目录内,目录中包含若干个Segment文件。
Segment文件是Kafka中的最小存储单元,它是由以Message在Partition中的起始偏移量命名的数据文件(.log)和索引文件(.index, *.timeindex)组成,如图所示。
Offset(偏移量)是定位消息在Partition分区队列中位置的分区编号。也是消息在分区队列中的唯一标识,它是由Zookeeper来负责维护的。
Kafka为了提高消息写入和查询的速度,会为每一个Partition创建索引,索引文件存储在Partition文件夹下。
Kafka中的索引包括两类:
偏移量索引:它是由Offset偏移量作为文件名称,以.index作为后缀的一个文件。其文件内部的内容格式是offset,position的形式。该偏移量索引采用了稀疏存储的存储方式。
时间戳索引:该文件是以.timestamp作为后缀的文件,内容格式是timestamp,offset的形式。该文件同样采用了稀疏存储的存储方式。
首先在按照偏移量查询数据的时候,会查找Kafka偏移量索引,缩小要查找数据的范围,然后在小范围中进行快速扫描,即可加快查询的速度。
时间戳索引也是一样,缩小要查找的范围,然后在小范围中进行查询。
kafka高可用
早期的Kafka版本里并没有副本的概念,这样一旦某个节点宕机,那么这台节点上存储的所有数据都有可能丢失,为了解决这个问题,在之后的版本更新中提出了Replication副本的概念。
之前讲到过,一个Topic主题中可以有多个Partition分区,并且每个分区都可以有多个副本,这是Kafka的一个数据冗余机制。除此之外,Kafka为了保证多个副本的数据一致性,从同一个分区的多个副本中选举出一个Partition Leader,由这个Leader来负责读写,其他的副本作为Follower从Leader中同步消息,通过这样一个副本同步机制,保证了多副本的数据一致性。
同样的Kafka中的Broker也会有这样的一个选举机制。每个Broker在启动时都会创建一个Kafka Controller进程。由这个Kafka Controller以及Zookeeper来选举出一个Kafka Controller Leader。Kafka Controller Leader负责管理Kafka集群的分区和副本状态,避免了分区副本直接在Zookeeper上注册Watcher和竞争创建临时Znode,导致Zookeeper集群的负载过重。
kafka命令
Kafka的命令操作以对Topic为主,通过PPT中的例子可以创建一个带有Partition以及制定了Replication的Topic,注意,在创建Topic时要制定Topic的名字以及Kafka对应的节点以及端口。
可以使用PPT中的命令查看Topic,然后创建一个控制台生产者(Producer)和一个控制台消费者(Consumer)。