kafka介绍

kafka对于构建实时的数据管道和流应用是很有用的。

Apache Kafka是一个分布式的流平台。这是什么意思呢?

我们考虑流平台有三个关键的能力:

  1. 它可以发布订阅流。这一点和消息队列或者企业消息系统很类似。
  2. 它可以存储流,并且可以容错。
  3. 它可以处理流

Kafa有什么用呢?

它被用于两类应用:

  1. 在系统和应用之间构建实时的流管道
  2. 构建实时的流应用

那么Kafka是怎样做到这些事情的呢?

首先来看一些概念:

  • Kafka是以集群方式运行的
  • Kafka集群将流记录存储在被叫做topics的分类中
  • 每一条记录由一个key,一个value和一个timestamp组成

Kafka有四个核心的API:

  • Producer API允许一个应用发布一条流记录到一个或者多个topics中
  • Consumer API允许一个应用订阅一个或多个topics,并且处理记录流
  • Streams API允许一个应用充当流处理器的角色,从一个或多个topics那里消费一个输入流并且生产一个输出流到一个或多个topics,有效的将输入流转换为输出流
  • Connector API允许构建并运行可重用的可以将Kafka连接到已存在的应用或者数据系统上的producer或者consumer。例如,连接关系型数据库。

在Kafka中,客户端和服务器端的通信被做成是简单的、高性能的、基于TCP协议的。

 

Topics and Logs

让我们首先深入到核心抽象,Kafka提供a stream of records —— the topic

一个topic是一个分类,记录是被发布到这里面的。在Kafka中,topics总是有多个订阅者的;因此,一个topic可以有多个0个,1个,或者多个消费者来订阅的。

每个topic,Kafka集群维护一个partitioned log(分区日志),它们看起来是这个样子的:

每个分区都是一个有序的、不可变的序列,这些序列都是结构化的提交日志。分区中的每个记录都被指定了一个序列id编号,被称之为offset,而且它是分区中每条记录的唯一标识。

Kafka集群操持所有的发布记录,无论这些记录是否已经被消费,这一点是可以配置的。例如,如果这个保留策略设置的是2天,那么一个记录被发布过了2天以后它仍然可以被消费,但是为了腾出空间来,它可能会被丢弃。Kaka的性能是高效的稳定的,所有存储数据很长时间不是一个问题。

事实上,元数据是保存在每个消费者那里的,最基本的是offset或者叫position,它们都是以消费者日志形式保存的。offset是由消费者来控制的:通常一个消费者会增长它的偏移量,事实上,自从消费者可以控制位置它可以以任意顺序消费记录。例如,一个消费者可以重置到一个旧的offset以处理之前的记录。

这个特性就意味着,kafka的消费者是非常廉价的 —— 它们可以来去自如而不受集群和其它消费者的影响。

日志分区有几个目的。第一,允许日志是伸缩的,大小可以超过单个服务器,每一个独立的分区必须安装在它所在主机的那个服务器上,但是一个topic可以有多个分区,所有它可以处理任意数量的数据。第二,作为一个并行单元。

Distribution

日志分区是被分布在集群中的服务器上的,每个服务器处理数据和请求都共享这些分区。为了容错,每个分区会交叉复制,副本的数据是可以配置的。

每个分区中有一个服务器充当“leader”,有0个或者多个服务器充当“followers”。leader处理所有的读和写请求,而follower被动的从leader那里复制。如果leader失败了,其中一个follower将自动成为新的leader。每个充当leader的服务器可能是一些分区的leader,同时又是另一些分区的follower,所以在集群中负载是平衡的。

Producers

生成者发布数据到topics。生产者负责选择哪个记录指定到哪个分区。可以以一个轮询的方式简单的来实现负载均衡。

Consumers

消费者用一个“consumer group name”来标记它们自己,topic中的每个记录被投递到一个订阅者消费组中的一个消费者实例。每个消费者实例分开处理。

如果所有的消费者实例都在相同的消费者组中,那么记录有效的在消费者之间负载均衡。

如果所有的消费者实例在不同的消费者组中,那么每一条记录都会被广播给所有的消费者。

如图,一个Kafka集群有2个服务器,4个分区(P0—P3),2个消费者分组。消费者分组A有2个消费者实例,组B有4个。

通常,我们会发现,topic有许多消费者分组,每个组都是一个"logical subscriber"(逻辑订阅者)。每个组由许多消费者实例组成,实例是可伸缩的可容错的。

Kafka只提供分区中的记录的总的顺序,而不保证分区之间的顺序。

Guarantees

一个高级别的kafka给出下列保证:

  • 生产者发送到topic分区的消息是按照它们被发送的顺序追加的。因此,如果记录M1和M2都是被同一个生产者发送的,并且M1在前M2在后,那么M1在分区中的偏移量将比M2小,而且M1的日志也在M2的前面。
  • 一个消费者实例看到记录的顺序是按照记录存储在日志中的顺序的
  • 假设topic的副本因子是N,那么我们可以容忍N-1个服务失败,也不会丢失任何的提交日志

Kafka as a Messaging System

消息传统上有两种模型:queuing 和 publish-subscribe(点对点队列模型和发布订阅模型)。在队列模型中,每个消息只能被消费一次;在发布订阅模型中,消息可以广播给所有的消费者。这两种模型各有利弊。

Kafka中的消费者分组的概念就是在从这两种模型中衍生出来的。和队列模型一些,消费者分组允许你在处理集合之上分开处理。和发布订阅模型一样,kafka允许你广播消息给多个消费者分组。

Kafka的模型的优势在于它的每个topic有这样一些属性:它可以伸缩处理,而且它有多个订阅者

相对于传统的消息系统而言,Kakfa有更强的顺序保证。

传统的队列在服务器上按顺序保存记录,而且多个消费者从队列中消费记录是按照记录被存储的顺序来消费的。虽然服务器是按顺序处理记录的,但是记录是异步投递给消费者的,所以它们可能以不同的顺序到达消费者。也就是说,在并行消费的时候会丢失一定百分比的顺序。消息系统中一个概念叫"exclusive consumer"它允许只能有一个消费者来处理,也就意味着是串行处理。

Kafka做得更好。它有一个概念叫“parallelism—the partition—within the topics”(在topics的分区下的并行)。kafka既保证顺序同时还提供负载均衡。这一切都归功于给消费者分组中的消费者指定topic的分区,以至于每个分区都可以被一个消费者精确的消费。注意分组中的消费者数量不能比分区数还多。

Kafka as a Storage System

任何消息队列都允许发布消息和消费消息解耦,在这个过程中扮演一个存储系统的角色。写到kafka的数据被写到磁盘并且被复制。kafka允许生产者等待确认,以至于只有当数据被完全复制并且保证已经被持久化了才能认为这个写操作是完成的。

不管你是持久化50KB还是50TB的数据,kakfa执行的操作都是一样的。

你可以把kafka当做一种特别的分布式文件系统,它高性能、低延迟的提交日志存储、副本。

Kafka for Stream Processing

仅仅只是读写存储流数据是不够的,要能够实时处理流。

kafka的流处理器是从输入topic那里持续不断的接收流,然后对这些输入做一些处理,并且生成持续不断的流数据到输出topic。

例如,一个零售应用可能采集销售和物流的的数据作为输入流,然后基于这些数据进行计算,从而生成再次订购和价格调整的输出流。

 

参考  http://kafka.apache.org/intro

 

本节重点

1、kafka是一个分布式的流平台

2、kafka有什么用?

  • 构建实时的流数据管道
  • 构建实时的流应用

3、基本概念

  • kafka是以集群方式运行的,集群可以是一台或者多台服务器
  • 记录按照类别来存储,这些类别叫topics。可以简单的理解为,数据存储在topics中
  • 每条记录由key、value、timestamp组成

4、核心API

  • Producer:生产者,发布记录(消息)到一个或多个topics中
  • Consumer:消费者,订阅一个或者多个topics
  • Streams:流处理器,从一个或多个topics那里消费输入流并且生成输出流到一个或多个topics
  • Connector:构建可以连接到外部的应用或者数据系统的可重用的生产者或消费者

5、主题和日志

  5.1、一个主题就是一个分类,记录被发布到某个主题中,主题总是有多个订阅者,一个主题可以有0个或1个或多个消费者

  5.2、每个主题都有一个分区日志。每个分区都是一个有序的、不可变的记录序列,记录被持续不断的追加到分区中

  5.3、记录是一个结构化的提交日志(a structured commit log)

  5.4、分区中的每条记录都被指定了一个唯一的id号,叫做offset。offset是由消费者控制的。

  5.5、kafka保存所有已发布的记录,不管它们是不是已经被消费。保留的周期是可配置的。

  5.6、为什么要分区呢?分区可以突破单台服务器的限制。

6、分布

  6.1、日志分区被分布在集群中的服务器之上,这些分区之下的每个服务器处理数据和请求的时候共享此分区,每个分区会被复制到其它服务器上,副本的数量可配置。

  6.2、每个分区中,有一个服务器充当"leader"的角色,有0个或者多个充当"follower"的角色。leader负责处理所有读写请求,而follower被动的从leader那里复制。如果leader死了,其中一个follower会自动成为leader。一个服务器可能是它所在的那些分区的其中一个分区的leader的同时也可能是其它分区的follower。(PS:这段话的意思是,一个分区可能有1台或者多台服务器组成,在组成个分区的服务器中有一个服务器是leader角色,其余是follower角色,leader角色负责这个分区的所有读写操作,而follower则被动的从leader那里复制数据。而且,一个服务器可能在这个分区的leader,但同时也可能是别的分区的follower。)

7、生产者

  生产者负责指定记录发布到哪个topic的哪个分区中

8、消费者

  8.1、消费者用消费者组名来标记它们自己,每个消费者分组都是topics的一个逻辑订阅者

  8.2、被发布到topics中的每一条记录会被投递到每个订阅的消费者分组中的一个消费实例

  8.3、每个消费者分组由多个消费者实例组成,而且实例的数量是可伸缩的

9、保证

  • 同一个消费者发送的同一个topic同一个分区中的消息会按照它们发送的顺序依次追加。假设M1和M2都是由同一个分区发送的消息,而且M1先被发送,那么M1的offset必定比M2小
  • 消费者是按照消息存储的顺序看到消息的
  • 假设副本因子是N,那么即使有N-1个服务器挂了也不会丢失任何记录

10、kafka作为消息系统

  10.1、topics中的每条记录只会被投递到每个订阅的消费者分组中的一个消费者实例。也就是说,假设有2个消费者分组都订阅了这个topics,并且每个分组都有3个消费者实例,那么这个topics中的每条记录只会投递2份分别给这两个分组,每个分组收到这条记录以后只能由该分组中的一个消费者实例消费。

  10.2、基于第一点,那么,如果订阅这个topics的所有消费者都属于同一个分组,那么这就相当于点对点队列模型;如果订阅的所有消费者都属于不同的消费者分组,那么这就相当于是发布订阅模型。

  10.3、kafka保证同一个生产者发送到同一个topics下的同一个分区的消息的存储顺序和它们发送的顺序一致,而且消费这个分区的消费者看到消息的顺序和它们存储的顺序是一样的。

  10.4、主题下分区中并行,kafka既保证顺序又能够负载均衡。这一切都归功于指定分区到分组中的消费者,以至于每个分区只能被消费者分组中的一个消费者消费。通过这样做,就可以确保消费者只能按顺序消费数据。

11、两张很重要的图

   

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读4.1k次。kafka认证_kafka认证
文章浏览阅读4.8k次,点赞4次,收藏11次。kafka常用参数_kafka配置
文章浏览阅读1.4k次,点赞25次,收藏10次。Kafka 生产者发送消息的流程涉及多个步骤,从消息的创建到成功存储在 Kafka 集群中。_kafka发送消息流程
文章浏览阅读854次,点赞22次,收藏24次。点对点模型:适用于一对一的消息传递,具有高可靠性。发布/订阅模型:适用于广播消息给多个消费者,实现消息的广播。主题模型:适用于根据消息的主题进行灵活的过滤和匹配,处理复杂的消息路由需求。
文章浏览阅读1.5k次,点赞2次,收藏3次。kafka 自动配置在KafkaAutoConfiguration
文章浏览阅读1.3w次,点赞6次,收藏33次。Offset Explorer(以前称为Kafka Tool)是一个用于管理和使Apache Kafka ®集群的GUI应用程序。它提供了一个直观的UI,允许人们快速查看Kafka集群中的对象以及存储在集群主题中的消息。它包含面向开发人员和管理员的功能。二、环境信息系统环境:windows 10版本:2.2Kafka版本:Kafka2.0.0三、安装和使用3.1 下载Offset Explorer 和安装下载到本地的 .exe文件Next安装路径 ,Next。_offset explorer
文章浏览阅读1.3k次,点赞12次,收藏19次。kafka broker 在启动的时候,会根据你配置的listeners 初始化它的网络组件,用来接收外界的请求,这个listeners你可能没配置过,它默认的配置是listeners=PLAINTEXT://:9092就是告诉kafka使用哪个协议,监听哪个端口,如果我们没有特殊的要求的话,使用它默认的配置就可以了,顶多是修改下端口这块。
文章浏览阅读1.3k次,点赞2次,收藏2次。Kafka 是一个强大的分布式流处理平台,用于实时数据传输和处理。通过本文详细的介绍、使用教程和示例,你可以了解 Kafka 的核心概念、安装、创建 Topic、使用生产者和消费者,从而为构建现代分布式应用打下坚实的基础。无论是构建实时数据流平台、日志收集系统还是事件驱动架构,Kafka 都是一个可靠、高效的解决方案。_博客系统怎么使用kafka
文章浏览阅读3.5k次,点赞42次,收藏56次。对于Java开发者而言,关于 Spring ,我们一般当做黑盒来进行使用,不需要去打开这个黑盒。但随着目前程序员行业的发展,我们有必要打开这个黑盒,去探索其中的奥妙。本期 Spring 源码解析系列文章,将带你领略 Spring 源码的奥秘。本期源码文章吸收了之前 Kafka 源码文章的错误,将不再一行一行的带大家分析源码,我们将一些不重要的分当做黑盒处理,以便我们更快、更有效的阅读源码。废话不多说,发车!
文章浏览阅读1.1k次,点赞14次,收藏16次。一、自动提交offset1、概念Kafka中默认是自动提交offset。消费者在poll到消息后默认情况下,会自动向Broker的_consumer_offsets主题提交当前主题-分区消费的偏移量2、自动提交offset和手动提交offset流程图3、在Java中实现配置4、自动提交offset问题自动提交会丢消息。因为如果消费者还没有消费完poll下来的消息就自动提交了偏移量,那么此时消费者挂了,于是下一个消费者会从已经提交的offset的下一个位置开始消费消息。_kafka中自动提交offsets
文章浏览阅读1.6k次。如果生产者发送消息的速度超过发送到服务器的速度,则会导致生产者空间不足,这个时候KafkaProducer的send()方法调用要么被阻塞,要么抛出异常,这个取决于参数max.block.ms的配置,此参数的默认值为60000,即60秒。在默认情况下,生产者发送的消息是未经压缩的。如果应用程序调用send()方法的速度超过生产者将消息发送给服务器的速度,那么生产者的缓冲空间可能会被耗尽,后续的send()方法调用会等待内存空间被释放,如果在max.block.ms之后还没有可用空间,就抛出异常。_kafka producer 参数
文章浏览阅读2.9k次,点赞3次,收藏10次。kafka解决通信问题_kafka3.6
文章浏览阅读1.5k次,点赞9次,收藏11次。上面都配置完了之后可以先验证下,保证数据最终到ck,如果有问题,需要再每个节点调试,比如先调试nginx->rsyslog ,可以先不配置kafka 输出,配置为console或者文件输出都可以,具体这里就不写了。这里做了一个类型转换,因为nginx,request-time 单位是s,我想最终呈现在grafana 中是ms,所以这里做了转换,当然grafana中也可以做。kafka 相关部署这里不做赘述,只要创建一个topic 就可以。
文章浏览阅读1.4k次,点赞22次,收藏16次。Kafka中的enable-auto-commit和auto-commit-interval配置_auto-commit-interval
文章浏览阅读742次。thingsboard规则链调用外部 kafka_thingsboard kafka
文章浏览阅读1.3k次,点赞18次,收藏22次。Kafka_简介
文章浏览阅读1.1k次,点赞16次,收藏14次。在数据库系统中有个概念叫事务,事务的作用是为了保证数据的一致性,意思是要么数据成功,要么数据失败,不存在数据操作了一半的情况,这就是数据的一致性。在很多系统或者组件中,很多场景都需要保证数据的一致性,有的是高度的一致性。特别是在交易系统等这样场景。有些组件的数据不一定需要高度保证数据的一致性,比如日志系统。本节从从kafka如何保证数据一致性看通常数据一致性设计。
文章浏览阅读1.4k次。概述介绍架构发展架构原理类型系统介绍类型hive_table类型介绍DataSet类型定义Asset类型定义Referenceable类型定义Process类型定义Entities(实体)Attributes(属性)安装安装环境准备安装Solr-7.7.3安装Atlas2.1.0Atlas配置Atlas集成HbaseAtlas集成SolrAtlas集成KafkaAtlas Server配置Kerberos相关配置Atlas集成HiveAtlas启动Atlas使用Hive元数据初次导入Hive元数据增量同步。_atlas元数据管理
文章浏览阅读659次。Zookeeper是一个开源的分布式服务管理框架。存储业务服务节点元数据及状态信息,并负责通知再 ZooKeeper 上注册的服务几点状态给客户端。
文章浏览阅读1.4k次。Kafka-Kraft 模式架构部署_kafka kraft部署