1. Kafka架构

Kafka

Kafka 中文官方文档

一、介绍

Apache Kafka® 是 一个分布式流处理平台,构造实时流数据管道。

1.Kafka作为一个集群,运行在一台或者多台服务器上.
2.Kafka 通过 topic 对存储的流数据进行分类。
3.每条记录中包含一个key,一个value和一个timestamp(时间戳)。

kafka的核心API

Producer API:允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。
Consumer API:允许一个应用程序订阅一个或多个 topic ,并且对发布给他们的流式数据进行处理。
Streams API:允许一个应用程序作为一个流处理器,消费一个或者多个topic产生的输入流,然后生产一个输出流到一个或多个topic中去,在输入输出流中进行有效的转换。
Connector API:允许构建并运行可重用的生产者或者消费者,将Kafka topics连接到已存在的应用程序或者数据系统。连接到一个关系型数据库,捕捉表(table)的变更内容。

Topic与Offset

Topic 就是数据主题,是数据记录发布的地方,可以用来区分业务系统。

Kafka中的Topics总是多订阅者模式,一个topic可以拥有一个或者多个消费者来订阅它的数据。消费者可以采取修改Offset的方式来控制消费数据的位置。

对于每一个topic, Kafka集群都会维持一个分区日志,如图所示:
[图片上传失败...(image-90ecbe-1575963276366)]

每个分区都是有序且顺序不可变的记录集,并且不断地追加到结构化的commit log文件。分区中的每一个记录都会分配一个id号来表示顺序,我们称之为offset,offset 用来唯一的标识分区中每一条记录。

kafka的数据存储时效--Kafka的性能和数据大小无关,所以长时间存储数据没有什么问题
Kafka 集群保留所有发布的记录—无论他们是否已被消费—并通过一个可配置的参数——保留期限来控制。
    如果保留策略设置为2天,一条记录发布后两天内,可以随时被消费,两天过后这条记录会被抛弃并释放磁盘空间。

[图片上传失败...(image-3bb679-1575963276366)]

二、Kakfa 架构

kafka 集群:一个kafka集群由多台服务器组成,也就是多个broker。

Broker:一个kafka服务器是一个broker。一个broker有多个Topic。

Topic:相当于消息系统中的一个队列queue,也是数据主题。一个topic有多个partition。

Partition:每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序。

Offset:某个Topic下的某个Partition分区数据被某个消费者组所消费的位置。kafka的存储文件都是按照offset.kafpartition可能对应多个broker。没有Replcation的情况下,一旦broker宕机,其上所有的broker都不可以被消费,同时producer也不能再将数据存于其上的patition。引入replication之后,同一个partition可能会有多个replication,而这时需要在这些replication之间选出一个leader,producer和consumer只与这个leader交互,其它replication作为follower从leader 中复制数据。
Producer :消息生产者,就是向kafka broker发消息的客户端。

Consumer :消息消费者,向kafka broker取消息的客户端。

[图片上传失败...(image-86267a-1575963276367)]

若一个Topic的分区数为5,副本数为3。则需要放置共15个分区的数据。Broker的数量为5,则分布为
第一个分区(编号为0)的第一个副本放置位置是随机从 brokerList 选择的。
其他分区的第一个副本放置位置相对于第0个分区依次往后移。也就是如果我们有5个Broker,5个分区。
    假设第一个分区放在第四个 Broker 上
    那么第二个分区将会放在第五个 Broker 上
    第三个分区将会放在第一个 Broker 上
    第四个分区将会放在第二个 Broker 上
    依次类推...
剩余的副本相对于第一个副本放置位置其实是由 nextReplicaShift 决定的,而这个数也是随机产生的。
第一个放置的分区副本一般都是 Leader,其余的都是 Follow 副本。
如果我们考虑机架的话,Leader与Follow会在不同的机架上。

Kafka消息的消费顺序保证

Kafka的topic中的partition是一个并行的概念。

Kafka能够为一个消费者池提供顺序保证和负载平衡,是通过将topic中的partition分配给消费者组中的消费者来实现的, 以便每个分区由消费组中的一个消费者消耗。通过这样,我们能够确保消费者是该分区的唯一读者,并按顺序消费数据。 众多分区保证了多个消费者实例间的负载均衡。但请注意,消费者组中的消费者实例个数不能超过分区的数量。

Kafka 作为存储系统

数据写入Kafka后被写到磁盘,并且进行备份以便容错。直到完全备份,Kafka才让生产者认为完成写入,即使写入失败Kafka也会确保继续写入

生产者

生产者可以将数据发布到所选择的topic(主题)中。生产者负责将记录分配到topic的哪一个 partition(分区)中。可以使用循环的方式来简单地实现负载均衡,也可以根据某些语义分区函数(例如:记录中的key)来完成。

消费者

消费者使用一个 消费组 名称来进行标识,发布到topic中的每条记录被分配给订阅消费组中的一个消费者实例.消费者实例可以分布在多个进程中或者多个机器上。

如果所有的消费者实例在同一消费组中,消息记录会负载平衡到每一个消费者实例.

如果所有的消费者实例在不同的消费组中,每条消息记录会广播到所有的消费者进程.
[图片上传失败...(image-2a0944-1575963276367)]

如图,这个 Kafka 集群有两台 server 的,四个分区(p0-p3)和两个消费者组。消费组A有两个消费者,消费组B有四个消费者。

通常情况下,每个 topic 都会有一些消费组,一个消费组对应一个"逻辑订阅者"。一个消费组由许多消费者实例组成,便于扩展和容错。这就是发布和订阅的概念,只不过订阅者是一组消费者而不是单个的进程。

你可能感兴趣的:(1. Kafka架构)