Kafka入门

前言

笔者使用过kafka处理通知,但是未系统学习kafka,因此认真学习一遍《Kafka核心技术与实战》这门课程。课程作者也是《Apache Kafka实战》这本书的作者。

00 开篇词 为什么要学习Kafka?

专栏的知识体系

  • 专栏的第一部分我会介绍消息引擎这类系统大致的原理和用途,以及作为优秀消息引擎代表的Kafka在这方面的表现。
  • 第二部分则重点探讨Kafka如何用于生产环境,特别是线上环境方案的制定。
  • 在第三部分中我会陪你一起学习Kafka客户端的方方面面,既有生产者的实操讲解也有消费者的原理剖析,你一定不要错过。
  • 第四部分会着重介绍Kafka最核心的设计原理,包括Controller的设计机制、请求处理全流程解析等。
  • 第五部分则涵盖Kafka运维与监控的内容,想获得高效运维Kafka集群以及有效监控Kafka的实战经验?我必当倾囊相助!
  • 最后一个部分我会简单介绍一下Kafka流处理组件Kafka Streams的实战应用,希望能让你认识一个不太一样的Kafka。

01 消息引擎系统ABC

聪明人也要下死功夫。
在2015年那会儿,我花了将近1年的时间阅读Kafka源代码,期间多次想要放弃。你要知道阅读将近50万行源码是多么痛的领悟。我还记得当初为了手写源代码注释,自己写满了一个厚厚的笔记本。不过幸运的是我坚持了下来,之前的所有努力也没有白费,以至于后面写书、写极客时间专栏就变成了一件件水到渠成的事情。

Apache Kafka是一款开源的消息引擎系统。。通俗来讲,就是系统A发送消息给消息引擎系统,系统B从消息引擎系统中读取A发送的消息。

消息引擎系统要设定具体的传输协议,即我用什么方法把消息传输出去,常见的方法有2种:点对点模型;发布/订阅模型。Kafka同时支持这两种消息引擎模型。

系统A不能直接发送消息给系统B,中间还要隔一个消息引擎呢,是为了"削峰填谷"。

02 一篇文章带你快速搞定Kafka术语

kafka实现高可用的手段:broker分布式部署、备份机制、重平衡。

Kafka定义了两类副本:领导者副本(Leader Replica)和追随者副本(Follower Replica)。前者对外提供服务,这里的对外指的是与客户端程序进行交互;而后者只是被动地追随领导者副本而已,不能与外界进行交互。当然了,你可能知道在很多其他系统中追随者副本是可以对外提供服务的,比如MySQL的从库是可以处理读操作的,但是在Kafka中追随者副本不会对外提供服务。

副本的工作机制也很简单:生产者总是向领导者副本写消息;而消费者总是从领导者副本读消息。至于追随者副本,它只做一件事:向领导者副本发送请求,请求领导者把最新生产的消息发给它,这样它能保持与领导者的同步。

什么是伸缩性呢?我们拿副本来说,虽然现在有了领导者副本和追随者副本,但倘若领导者副本积累了太多的数据以至于单台Broker机器都无法容纳了,此时应该怎么办呢?一个很自然的想法就是,能否把数据分割成多份保存在不同的Broker上?如果你就是这么想的,那么恭喜你,Kafka就是这么设计的。

Kafka中的分区机制指的是将每个主题划分成多个分区(Partition),每个分区是一组有序的消息日志。生产者生产的每条消息只会被发送到一个分区中,也就是说如果向一个双分区的主题发送一条消息,这条消息要么在分区0中,要么在分区1中。如你所见,Kafka的分区编号是从0开始的,如果Topic有100个分区,那么它们的分区号就是从0到99。

刚才提到的副本如何与这里的分区联系在一起呢?实际上,副本是在分区这个层级定义的。每个分区下可以配置若干个副本,其中只能有1个领导者副本和N-1个追随者副本。生产者向分区写入消息,每条消息在分区中的位置信息由一个叫位移(Offset)的数据来表征。分区位移总是从0开始,假设一个生产者向一个空分区写入了10条消息,那么这10条消息的位移依次是0、1、2、......、9。

至此我们能够完整地串联起kafka的三层消息架构:

  • 第一层是主题层(Topic),每个主题可以配置M个分区,而每个分区又可以配置N个副本。
  • 第二层是分区层(Partition),每个分区的N个副本中只能有一个充当领导者角色,对外提供服务;其他N - 1个副本是追随者副本,只能提供数据冗余之用。
  • 第三层是消息层(Record),分区中包含若干条消息,每条消息的位移从0开始,一次递增。

Kafka Broker是如何持久化数据的?总的来说,Kafka使用消息日志(Log)来保存数据,一个日志就是磁盘上一个只能追加写(Append-only)消息的物理文件。因为只能追加写入,故避免了缓慢的随机I/O操作,改为性能较好的顺序I/O写操作,这也是实现Kafka高吞吐量特性的一个重要手段。

为避免耗尽所有的磁盘空间,Kafka必然要定期地删除消息以回收磁盘。怎么删除呢?简单来说就是通过日志段(Log Segment)机制。在Kafka底层,一个日志有进一步细分成多个日志段,消息被追加写到当前最新的日志段中,当写满了一个日志段后,Kafka会自动切分出一个新的日志段,并将老的日志段封存起来。Kafka在后台还有定时任务会定期地检查老的日志段是否能够被删除,从而实现回收磁盘空间的目的。

术语总结

  • 消息:Record。Kafka是消息引擎嘛,这里的消息就是指Kafka处理的主要对象。
  • 主题:Topic。主题是承载消息的逻辑容器,在实际使用中多用来区分具体的业务。
  • 分区:Partition。一个有序不变的消息序列。每个主题下可以有多个分区。
  • 消息位移:Offset。表示分区中每条消息的位置信息,是一个单调递增且不变的值。
  • 副本:Replica。Kafka中同一条消息能够被拷贝到多个地方以提供数据冗余,这些地方就是所谓的副本。副本还分为领导者副本和追随者副本,各自有不同的角色划分。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。
  • 生产者:Producer。向主题发布新消息的应用程序。
  • 消费者:Consumer。从主题订阅新消息的应用程序。
  • 消费者位移:Consumer Offset。表征消费者消费进度,每个消费者都有自己的消费者位移。
  • 消费者组:Consumer Group。多个消费者实例共同组成的一个组,同时消费多个分区以实现高吞吐。
  • 重平衡:Rebalance。消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。Rebalance是Kafka消费者端实现高可用的重要手段。

03 Kafka只是消息引擎系统吗?

Kafka在设计之初就旨在提供三个方面的特性:

  • 提供一套API实现生产者和消费者;
  • 降低网络传输和磁盘存储开销;
  • 实现高伸缩性架构。

Kafka流处理框架地位 。Kafka与其他主流大数据流式计算框架相比,优势有两点:更容易实现端到端的正确性;它自己对于流式计算的定位。

Apache Kafka是消息引擎系统,也是一个分布式流处理平台。除此之外,Kafka还能够被用作分布式存储系统(了解即可,无实际运用)。

04 我应该选择哪种Kafka?

  • Apache Kafka,是开发人数最多、版本迭代速度最快的Kafka。如果你仅仅需要一个消息引擎系统抑或是简单的流处理应用场景,同时需要对系统有较大把控度,那么我推荐你使用Apache Kafka。
  • Confluent Kafka,目前分为免费版和企业版两种。企业版提供了很多功能,最有用的当属跨数据中心备份和集群监控了。如果你需要用到Kafka的一些高级特性,那么推荐你使用Confluent Kafka。
  • CDH/HDP Kafka,如果你需要快速地搭建消息引擎系统,或者你需要搭建的是多框架构成的数据平台且Kafka只是其中一个组件,那么我推荐你使用这些大数据云公司提供的Kafka。

05 聊聊Kafka的版本号

  • 0.7版本:只提供了最基础的消息队列功能。
  • 0.8版本:引入了副本机制,至此Kafka成为了一个真正意义上完备的分布式高可靠消息队列解决方案。
  • 0.9.0.0版本:增加了基础的安全认证/权限功能;使用Java重写了新版本消费者API;引入了Kafka Connect组件。
  • 0.10.0.0版本:引入了Kafka Streams,正式升级成分布式流处理平台。
  • 0.11.0.0版本:提供了幂等性ProducerAPI以及事务API;对Kafka消息格式做了重构。
  • 1.0和2.0版本:主要还是KafkaStreams的各种改进。
相关推荐
import_random9 小时前
[kafka]伪集群搭建,各个节点配置文件中listeners参数的配置
kafka
Mr.朱鹏1 天前
SQL深度分页问题案例实战
java·数据库·spring boot·sql·spring·spring cloud·kafka
山沐与山1 天前
【MQ】Kafka与RocketMQ深度对比
分布式·kafka·rocketmq
yumgpkpm2 天前
Cloudera CDP7、CDH5、CDH6 在华为鲲鹏 ARM 麒麟KylinOS做到无缝切换平缓迁移过程
大数据·arm开发·华为·flink·spark·kafka·cloudera
树下水月2 天前
Easyoole 使用rdkafka 进行kafka的创建topic创建 删除 以及数据发布 订阅
分布式·kafka
Cat God 0072 天前
基于Docker搭建kafka集群
docker·容器·kafka
Cat God 0072 天前
基于 Docker 部署 Kafka(KRaft + SASL/PLAIN 认证)
docker·容器·kafka
KD2 天前
设计模式——责任链模式实战,优雅处理Kafka消息
后端·设计模式·kafka
原神启动12 天前
Kafka详解
分布式·kafka