设为首页 加入收藏

TOP

(一)Kafka学习笔记之简介
2019-04-20 14:12:43 】 浏览:47
Tags:Kafka 学习 笔记 简介

简介

Kafka 简介

Apache Kafka 是一个发布/订阅消息系统。kafka官方定位是:一个分布式流处理处理。

Kafka 分布式流处理平台,包括 Kafka Core、Kafka connect、Kafka REST Proxy、KafKa Stream 四大模块,提供了 Producer API、Consumer API、Stream API、Connector API。

Kafka 中的数据具有持久化、有序存储、且可以重复读取等特点。此外,数据分布存储在系统中,可以提供数据可靠性和系统的扩展性。

Kafka集群架构

整体架构
在这里插入图片描述
Broker:kafka 节点,须由 Kafka 进行调控。
Producer:生产者,用于生成消息。
Consumer:消费者,用于获取消费消息。

Kafka 相关术语

  • Broker:一台 Kafka 服务器就是一个 Broker。一个集群由多个 Broker 组成,一个 Broker 可以容纳一个或多个 topic。
  • Topic:一类消息。例如 page View 日志、click 日志等都可以以 Topic 的形式存在。可以将其理解为一个队列。
  • Producer:消息生产者,向 Broker 推送消息的客户端。
  • Consumer:消息消费者,向 Broker 拉取消息的客户端。
  • Consumer Group (CG):这是 Kafka 用来是实现一个 Topic 消息的广播(发送给所有 Consumers)和单播(发送给任意一个 Consumer)的手段。一个 Topic 可以有多个 CG。Topic 会将消息发送到所有 CG ,但是每个 CG 中只有一个 Consumer 可以单独地消费一个消息队列(partition),而不能在一个 CG 中有一个以上的 Consumer 消息相同的消息队列。
  • Partition:为了实现扩展性,一个非常大的 Topic 可以分布到多个 Broker 上,一个 Topic 可以分成多个 Partition,每个 Partition 都是一个有序的队列。Partition 中的每条消息都会被分配一个有序的ID(offset)。 Kafka 可以保证一个 Partition 能有序的将消息发送给一个 Consumer,不能保证一个 Topic(多个 Partition 组成)的顺序。
  • Offset:每个 Partition 都由一系列有序的、不可变的消息组成,这些消息被连续的追加到 Partition 中。Partition 中的每个消息都由一个连续的序列号叫做 Offset,是 Partition 用于标识消息。

Message 和 Batch

Kafka 中的数据单位是 message。对比数据库而言,可以将消息看做是数据库中的记录。对Kafka 而言,一个消息就是一个字节数组,字节数组中的数据没有特定的格式或者意义。消息有一个可选的元数据信息,为 Key。Key 也是一个字节数组,与消息一样,没有特别的含义。Key 用于将消息写入特定的 Partition。当需要将数据推送到特定的 Partition 时就需要用到 Key。最简单的方式是生成键的 Hash 值,然后基于 Hash 值和 Partition 总数取模,以取模的结果来为该消息选择对应的 Partition。保证具有相同 Key 的消息可以写入到相同的 Partition 。

为了提高效率,消息以批量的形式写入 Broker。批量(Batch)消息是指消息的集合,这些消息会发送到同一个 Topic 和 Partition。如果每次发送一条消息,将导致过多的网络开销。因此需要将消息收集到一个批次后然后发送这个批次(batch)消息,可以减少网络开销。所以延迟和吐吞量的关系是:批次数据越大,延迟越高,批次可以进行压缩,以更高效的速度传输

Schema

消息对 Kafka 来说只是字节数组,但是在传输消息时,建议给消息增加额外的结构,便于消费端理解。这个结构就是消息的 Schema。可以根据业务场景来选择合适的 Schema,如 JSON、XML。但是 json、xml 格式的 Schema 缺乏强类型处理和 Schema 版本间的兼容。许多 Kafka 开发中倾向于使用 Apache Avro ---- 一 个序列化框架,最初开发的目的就是为了 Hadoop。Avro 提供了一个压缩的序列化格式。消息模式和消息负载分离,Schema 变化时,不需要修改已有代码。其强大的数据类型和模式演化,向后和向前兼容。

在 Kafka 中,一致的数据格式是非常重要的。这样可以实现读写消息的解耦。如果没有实现解耦,订阅消息的客户端必须经常更新,以兼容处理新旧消息的数据格式。

Topic 和 Partition

Kafka 中的消息分类存储在各自的 Topic 中,Topic 包含一系列的 Partition。一个 Partition 是一个 Log 日志,消息只能以追加(append)方式写入到 Log 中,以从头到尾的顺序进行顺序读取。需要注意的是:一个 Topic 包括多个 Partition,能保证在一个 Partition 的消息的时间顺序,但是不能保证整个 Topic 的消息的时间顺序。
在这里插入图片描述
如上图,展示了一个 Topic,其拥有三个 Partition,新写入的消息在每个 Partition 的结尾(end)处追加。Partition 为 Kafka 提供了冗余和伸缩性。每个 Partition 可以位于不同的 Broker 节点(server节点)上。也就是说:一个 Topic 可以在多台服务器上水平扩展,以此来提供超过单节点服务器的性能服务。

Producer 和 Consumer

Kafka 客户端就是使用 Kafka 集群的用户程序,其有两种基本类型的客户端:Producer 生产者和Consumer 消费者。还有高级客户端 API — Kafka Connect API 用于数据集成和 Kafka Stream API 用于流处理。高级客户端 API 使用 Producer 和 Consumer 作为构建块,在其之上提供更高级的功能。

Producer 创建新消息。在其它消息系统中,Producer 也被称为 Publisher 或者 Writer。一般情况下,一个消息会被生产到一个特定的 Topic 上。默认情况下,Producer 不关心消息发送到哪个 Partition 上,Producer 会使消息在所有 Partition 中均匀分布。在某些情况下,Producer 会将消息发送到特定的 Partition 上(可以使用 Key 或自定义Partitioner 来生成 Key 的 hash 值,从而将消息映射到一个指定的 Partition 上)。

Consumer 读取消息。在其它消息系统中可能被称为 Subscriber 或 Reader。Consumer 可以订阅一个或多个 Topic 中的消息,以消息产生的顺序来读取(从 begin 读取到 end )。Consumer 通过消息的 Offset 来跟踪消费的消息。Offset 是另一个元数据消息,是一个持续增加的整数值(类似于一个消息队列中的地址),Kafka 将消息添加到 Topic 中时,会为消息添加 Offset 元数据信息。通过存储每个 Partition 中最后消费的消息的 Offset 到 Zookeeper 或者 Kafka 中,Consumer可以通过 Offset 来停止消费消息或者重新消费消息。

(注:由于 Zookeeper 并不适合大批量的频繁写入操作,新版 Kafka 已推荐将 consumer 的位移信息保存在 Kafka 内部的 topic 中,即 __consumer_offsets topic,并且默认提供了kafka_consumer_groups.sh 脚本供用户查看 consumer 信息。)

Consumer 一般不是单独存在的。一般是由一个或多个 Consumer 组成的 Consumer Group(CG) 的。CG 用来消费一个 Topic 消息。CG 可以保证一个 Partition 只会被 CG 中的一个 Consumer 来消费。
在这里插入图片描述
如上图所示,CG 拥有是三个 Consumer,来消费一个 Topic 中的消息。其中 Consumer0 和 Consumer2 分别各自消费一个 Partition,Consumer1 消费剩余的两个 Partition。Consumer 与Partition 之间的映射关系叫做 Partition 的 Ownership。

Tips: 一个 Consumer group 内的 Consumer 消费 topic 中的 partition 是互斥的。一个 partition 只能保证 Consumer group 内的一个 consumer 来消费。

Broker 和 Cluster

一个 Kafka Server 叫做一个 Broker。Broker 接收 Producer 发送的消息,为消息设置 Offset,并将消息存储在磁盘上。Broker 同时为 Consumer 服务,响应 Consumer 读取 Partition 中消息的请求,并将写入磁盘的消息返回给 Consumer。根据特定硬件和其性能特点。单个 Broker 可以轻松处理数千个分区和每秒数百万条消息。

Kafka Broker 被设计成 Cluster 的组成部分。一个 Cluster 的 Brokers 中的某个 Broker 将成为集群的 Controller (从活动状态的集群成员中自动选举)。Controller 负责执行管理造作,包括为 Broker 分配 Partition、监控 Broker 是否可用。一个 Partition 属于一个 Broker,该 Broker 是这个 Partition 的 Leader。一个 Partition 可以属于多个 Brokers(partition 的副本)。
在这里插入图片描述
副本的设计,可以实现Partition中 Message 的冗余,如果一个 Broker 不可用,另一个 Broker 可以接管 Leader 角色,成为新的 Leader。

注意:所有 Consumer 和 Producer 在这个 Partition 上的操作,都必须连接在 Leader 上。

Apache Kafka 的一个关键特性是 retention(消息保留时间,Topic 消息的持久时间与用户设置 retention 有关)。即消息在一段时间内的持久存储。Kafka Broker 为 Topic 配置了一个默认的保留设置:要么保留一段时间(如:7天),或直到 Topic 中的消息达到一定的大小(如:1G)。一旦达到其中某一个设置(时间或大小)上限,消息过期并被删除,因此保留配置是任何时候可用的最小数据量。

可以为不同的 Topic 设置不同的保留值。例如,用户跟踪 Topic 中的消息可能会保留几天,而应用程序 Topic 中的度量消息可能只保留几个小时。Topic 还可以配置为日志压缩,这就意味着 Kafka 将只保留使用特定键生成的最后一条消息。这对于只对最后一次更新感新区的应用非常有用。— etention.ms

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Error while fetching metadata w.. 下一篇从Kafka读取数据

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目