写点什么

Kafka 权威指南(一):初识 Kafka

  • 2020-03-29
  • 本文字数:3581 字

    阅读完需:约 12 分钟

Kafka权威指南(一):初识Kafka

编者按:本文节选自图灵程序设计丛书 《Kafka 权威指南》一书中的部分章节。

Kafka 登场

Kafka 就是为了解决上述问题而设计的一款基于发布与订阅的消息系统。它一般被称为“分布式提交日志”或者“分布式流平台”。文件系统或数据库提交日志用来提供所有事务的持久记录,通过重放这些日志可以重建系统的状态。同样地,Kafka 的数据是按照一定顺序持久化保存的,可以按需读取。此外,Kafka 的数据分布在整个系统里,具备数据故障保护和性能伸缩能力。

消息和批次

Kafka 的数据单元被称为 消息。如果你在使用 Kafka 之前已经有数据库使用经验,那么可以把消息看成是数据库里的一个“数据行”或一条“记录”。消息由字节数组组成,所以对于 Kafka 来说,消息里的数据没有特别的格式或含义。消息可以有一个可选的元数据,也就是键。键也是一个字节数组,与消息一样,对于 Kafka 来说也没有特殊的含义。当消息以一种可控的方式写入不同的分区时,会用到键。最简单的例子就是为键生成一个一致性散列值,然后使用散列值对主题分区数进行取模,为消息选取分区。这样可以保证具有相同键的消息总是被写到相同的分区上。第 3 章将详细介绍键的用法。


为了提高效率,消息被分批次写入 Kafka。批次 就是一组消息,这些消息属于同一个主题和分区。如果每一个消息都单独穿行于网络,会导致大量的网络开销,把消息分成批次传输可以减少网络开销。不过,这要在时间延迟和吞吐量之间作出权衡:批次越大,单位时间内处理的消息就越多,单个消息的传输时间就越长。批次数据会被压缩,这样可以提升数据的传输和存储能力,但要做更多的计算处理。

模式

对于 Kafka 来说,消息不过是晦涩难懂的字节数组,所以有人建议用一些额外的结构来定义消息内容,让它们更易于理解。根据应用程序的需求,消息 模式(schema)有许多可用的选项。像 JSON 和 XML 这些简单的系统,不仅易用,而且可读性好。不过,它们缺乏强类型处理能力,不同版本之间的兼容性也不是很好。Kafka 的许多开发者喜欢使用 Apache Avro,它最初是为 Hadoop 开发的一款序列化框架。Avro 提供了一种紧凑的序列化格式,模式和消息体是分开的,当模式发生变化时,不需要重新生成代码;它还支持强类型和模式进化,其版本既向前兼容,也向后兼容。


数据格式的一致性对于 Kafka 来说很重要,它消除了消息读写操作之间的耦合性。如果读写操作紧密地耦合在一起,消息订阅者需要升级应用程序才能同时处理新旧两种数据格式。在消息订阅者升级了之后,消息发布者才能跟着升级,以便使用新的数据格式。新的应用程序如果需要使用数据,就要与消息发布者发生耦合,导致开发者需要做很多繁杂的工作。定义良好的模式,并把它们存放在公共仓库,可以方便我们理解 Kafka 的消息结构。第 3 章将详细讨论模式和序列化。

主题和分区

Kafka 的消息通过 主题 进行分类。主题就好比数据库的表,或者文件系统里的文件夹。主题可以被分为若干个 分区,一个分区就是一个提交日志。消息以追加的方式写入分区,然后以先入先出的顺序读取。要注意,由于一个主题一般包含几个分区,因此无法在整个主题范围内保证消息的顺序,但可以保证消息在单个分区内的顺序。图 1 所示的主题有 4 个分区,消息被追加写入每个分区的尾部。Kafka 通过分区来实现数据冗余和伸缩性。分区可以分布在不同的服务器上,也就是说,一个主题可以横跨多个服务器,以此来提供比单个服务器更强大的性能。



图 1:包含多个分区的主题表示


我们通常会使用 这个词来描述 Kafka 这类系统的数据。很多时候,人们把一个主题的数据看成一个流,不管它有多少个分区。流是一组从生产者移动到消费者的数据。当我们讨论流式处理时,一般都是这样描述消息的。Kafka Streams、Apache Samza 和 Storm 这些框架以实时的方式处理消息,也就是所谓的流式处理。我们可以将流式处理与离线处理进行比较,比如 Hadoop 就是被设计用于在稍后某个时刻处理大量的数据。第 11 章将会介绍流式处理。

生产者和消费者

Kafka 的客户端就是 Kafka 系统的用户,它们被分为两种基本类型:生产者和消费者。除此之外,还有其他高级客户端 API——用于数据集成的 Kafka Connect API 和用于流式处理的 Kafka Streams。这些高级客户端 API 使用生产者和消费者作为内部组件,提供了高级的功能。


生产者 创建消息。在其他发布与订阅系统中,生产者可能被称为 发布者写入者。一般情况下,一个消息会被发布到一个特定的主题上。生产者在默认情况下把消息均衡地分布到主题的所有分区上,而并不关心特定消息会被写到哪个分区。不过,在某些情况下,生产者会把消息直接写到指定的分区。这通常是通过消息键和分区器来实现的,分区器为键生成一个散列值,并将其映射到指定的分区上。这样可以保证包含同一个键的消息会被写到同一个分区上。生产者也可以使用自定义的分区器,根据不同的业务规则将消息映射到分区。第 3 章将详细介绍生产者。


消费者 读取消息。在其他发布与订阅系统中,消费者可能被称为 订阅者读者。消费者订阅一个或多个主题,并按照消息生成的顺序读取它们。消费者通过检查消息的偏移量来区分已经读取过的消息。偏移量 是另一种元数据,它是一个不断递增的整数值,在创建消息时,Kafka 会把它添加到消息里。在给定的分区里,每个消息的偏移量都是唯一的。消费者把每个分区最后读取的消息偏移量保存在 Zookeeper 或 Kafka 上,如果消费者关闭或重启,它的读取状态不会丢失。


消费者是 消费者群组 的一部分,也就是说,会有一个或多个消费者共同读取一个主题。群组保证每个分区只能被一个消费者使用。图 2 所示的群组中,有 3 个消费者同时读取一个主题。其中的两个消费者各自读取一个分区,另外一个消费者读取其他两个分区。消费者与分区之间的映射通常被称为消费者对分区的 所有权关系


通过这种方式,消费者可以消费包含大量消息的主题。而且,如果一个消费者失效,群组里的其他消费者可以接管失效消费者的工作。第 4 章将详细介绍消费者和消费者群组。



图 2:消费者群组从主题读取消息

broker 和集群

一个独立的 Kafka 服务器被称为 broker。broker 接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。broker 为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘上的消息。根据特定的硬件及其性能特征,单个 broker 可以轻松处理数千个分区以及每秒百万级的消息量。


broker 是 集群 的组成部分。每个集群都有一个 broker 同时充当了 集群控制器 的角色(自动从集群的活跃成员中选举出来)。控制器负责管理工作,包括将分区分配给 broker 和监控 broker。在集群中,一个分区从属于一个 broker,该 broker 被称为分区的 首领。一个分区可以分配给多个 broker,这个时候会发生分区复制(见图 3)。这种复制机制为分区提供了消息冗余,如果有一个 broker 失效,其他 broker 可以接管领导权。不过,相关的消费者和生产者都要重新连接到新的首领。第 6 章将详细介绍集群的操作,包括分区复制。



图 3:集群里的分区复制


保留消息(在一定期限内)是 Kafka 的一个重要特性。Kafka broker 默认的消息保留策略是这样的:要么保留一段时间(比如 7 天),要么保留到消息达到一定大小的字节数(比如 1GB)。当消息数量达到这些上限时,旧消息就会过期并被删除,所以在任何时刻,可用消息的总量都不会超过配置参数所指定的大小。主题可以配置自己的保留策略,可以将消息保留到不再使用它们为止。例如,用于跟踪用户活动的数据可能需要保留几天,而应用程序的度量指标可能只需要保留几个小时。可以通过配置把主题当作 紧凑型日志,只有最后一个带有特定键的消息会被保留下来。这种情况对于变更日志类型的数据来说比较适用,因为人们只关心最后时刻发生的那个变更。

多集群

随着 Kafka 部署数量的增加,基于以下几点原因,最好使用多个集群。


  • 数据类型分离

  • 安全需求隔离

  • 多数据中心(灾难恢复)


如果使用多个数据中心,就需要在它们之间复制消息。这样,在线应用程序才可以访问到多个站点的用户活动信息。例如,如果一个用户修改了他们的资料信息,不管从哪个数据中心都应该能看到这些改动。或者多个站点的监控数据可以被聚集到一个部署了分析程序和告警系统的中心位置。不过,Kafka 的消息复制机制只能在单个集群里进行,不能在多个集群之间进行。


Kafka 提供了一个叫作 MirrorMaker 的工具,可以用它来实现集群间的消息复制。MirrorMaker 的核心组件包含了一个生产者和一个消费者,两者之间通过一个队列相连。


消费者从一个集群读取消息,生产者把消息发送到另一个集群上。图 4 展示了一个使用 MirrorMaker 的例子,两个“本地”集群的消息被聚集到一个“聚合”集群上,然后将该集群复制到其他数据中心。不过,这种方式在创建复杂的数据管道方面显得有点力不从心。第 7 章将详细讨论这些案例。



图 4:多数据中心架构


图书简介https://www.ituring.com.cn/book/2067



2020-03-29 10:003244

评论

发布
暂无评论
发现更多内容

这可能是全网关于Camera慢动作录像(SlowMotion)介绍最全的文章了

小驰笔记

android 音视频 camera 引航计划

tensorflow实现CNN模型垃圾分类算法

AI_robot

tensorflow实现像素级图像分割算法

AI_robot

iOS开发:git上传代码到开源中国的步骤,以及pod的更新方法

花花

ios

寻找音乐API接入正版音乐曲库?了解HIFIVE音乐开放平台!

HIFIVE音加加

音乐api 正版曲库 音乐sdk

在项目启动时(无request)获取Tomcat端口号

waitmoon

Java

tensorflow实现两种图像风格融合 即神经风格迁移

AI_robot

民国最出名的女作家,为什么是她?

了了Vita

最新阿里蚂蚁金服四面(已拿offer)Java技术面经总结

钟奕礼

Java 编程 程序员 架构 面试

专访孙立坚:印度经济发展实力几何 ?

了了Vita

面对不可避免的故障,我们造了一个“上帝视角”的控制台

阿里巴巴云原生

容器 微服务 云原生 监控 应用服务中间件

UUID不失精度,长度改进

waitmoon

Java uuid

阿里天猫3面(Java研发):GC回收+Redis Hash算法+架构部署+秒杀等

钟奕礼

Java 编程 程序员 架构 面试

tensorflow实现cifar10彩色图像多类别分类

AI_robot

keras深度学习框架

AI_robot

云图说|将源端MongoDB业务搬迁至华为云DDS的几种方式

华为云开发者联盟

mongodb 数据迁移 华为云文档数据库服务 DDS 文档数据库

tensorflow实现低分辨率灰度图像分类算法

AI_robot

看完这篇文章,你起码对分析视频卡顿有点思路了

小驰笔记

android 音视频 camera 引航计划

如何在游戏中快速集成聊天功能

LeanCloud

游戏开发 即时通讯 聊天室 sdk

最全Java架构师技能树:Java编程+网络+设计模式+数据库+分布式

钟奕礼

Java 编程 程序员 架构 面试

《月亮与六便士》:给你500万,你会用它买套房子还是周游世界?

了了Vita

NodeJs 介绍

小风以北

nodejs 新特性

推荐16款强大的Twitter视频下载器(2021精选)

科技猫

twitter 软件 网站 分享 视频下载

深入分析小程序运行环境框架原理

小风以北

小程序 编译原理 框架 工作原理

区块链底层Baas平台搭建,区块链政务底层平台开发

Java面试过了京东五面之后,发现掌握了这些技术也没有那么难

钟奕礼

Java 编程 程序员 架构 面试

NodeJs中Buffer与Stream理解

小风以北

stream 原理 Node buffer

【译】ECMAScript 2021: 最终功能集确定

清秋

JavaScript ecmascript 翻译 ES6 新闻

Android 高通Camx架构学习 - 第1章

小驰笔记

android 音视频 camera 引航计划

tensorflow实现深度卷积生成对抗网络(DCGAN)生成手写数字图片

AI_robot

阿里巴巴研究员叔同:云原生是企业数字创新的最短路径

阿里巴巴中间件

云计算 Serverless 容器 云原生 Faas

Kafka权威指南(一):初识Kafka_架构_Neha Narkhede_InfoQ精选文章