- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
Kafka(Apache Kafka) 是一种分布式流数据平台,最初由LinkedIn开发,并于后来捐赠给Apache软件基金会,成为了一个Apache顶级项目。它被设计用于处理大规模、实时的数据流,并为构建高吞吐量、容错性强的数据流应用程序提供支持。Kafka的特点使得它在日志收集、实时处理、事件驱动架构、监控等领域得到广泛应用.
以下是Kafka的一些关键特点和概念:
总的来说,Kafka在大数据、实时处理和数据流领域具有重要地位,其强大的分布式架构和丰富的功能使其成为许多企业处理实时数据的首选平台.
Kafka是一个非常灵活和功能强大的分布式流数据平台,适用于多种业务场景。以下是一些Kafka常见的用途和业务场景:
哪些行业都在用kafka:
broker : kafka节点, 就是安装的每一个kafka服务 。
producer : 生产者, 发消息的 。
consumer : 消费者, 读消息的 。
zookeeper : 信息中心, 记录kafka的各种信息的地方 。
controller : 其中的一个broker, 作为leader身份来负责管理整个集群. 如果挂掉, 借助zk进行重新选主 。
副本分类
AR(Assigned Replicas) 是指为每个分区分配的副本集合。在Kafka中,每个分区可以有多个副本,其中一个副本被选举为leader,其他副本为follower。AR是指包括leader副本在内的所有副本的集合.
ISR(In-Sync Replicas): ISR是指与主副本保持同步的副本集合。在Kafka中,一个主题分区通常有多个副本,但只有与主副本保持同步的副本才能被认为是ISR中的成员。在正常情况下,ISR中的所有副本都已经同步了高水位之前的消息,因此可以确保消息的一致性和可靠性.
OSR(Out-of-Sync Replicas): OSR指的是已经落后于主副本的副本。这些副本的同步进度较慢,可能由于网络延迟或其他原因。当副本变得不再与主副本同步时,它将被移出ISR。这是为了确保ISR中的副本始终保持高水位之前消息的同步状态.
这些概念在Kafka中用于管理副本的分配和同步,以确保数据的可靠性和一致性.
AR = ISR + OSR 。
offset: 偏移量(索引),消息消费的具体位置,每个消费者都有自己的偏移量 。
HW(High Watermark): 高水位是一个标记,表示已被确认和提交的消息的位置。HW之前的所有消息都被认为是已经被处理并且已经提交的。在消费者的视角中,只有高水位之后的消息是尚未被处理的。高水位只记录在ISR(In-Sync Replicas)中,用于确保消息的一致性和可见性。在一组ISR中,每个Follower同步消息的速度可能不同,HW指向的始终是所有ISR中最慢的消息位置.
LEO(Log End Offset): 日志末尾偏移量是一个指示,表示当前分区的下一条消息的偏移量。LEO是分区中所有副本中最大的偏移量,包括ISR和OSR(Out-of-Sync Replicas)中的副本。LEO指示了分区中尚未被消费的消息的位置.
总结一下,HW是已被确认和提交的消息的位置,用于消息的一致性和可见性。LEO是分区中下一条消息的偏移量,用于指示尚未被消费的消息的位置。这两个偏移量在Kafka中起到了重要的作用,影响了消息的处理和消费.
那么这三者有什么关系呢?
比如在副本数等于3的情况下,消息发送到Leader A之后会更新LEO的值,Follower B和Follower C也会 实时拉取Leader A中的消息来更新自己,HW就表示A、B、C三者同时达到的日志位移,也就是A、B、 C三者中LEO最小的那个值。由于B、C拉取A消息之间延时问题,所以HW一般会小于LEO,即 LEO>=HW.
kafka每个主题可以有多个分区, 每个分区在它所在的broker上创建一个文件夹, 每个分区又分为多个段(Segment 相当于把海量消息拆分到了多个文件中, 防止消息文件过大导致检索速度缓慢), 每个段两个文件 log & index , log文件里顺序存消息, index文件里存消息的索引 段的命名直接以当前段的第一条消息的offset为名 。
日志(Log): Kafka使用日志来持久化存储消息,每个分区都有一个对应的日志。日志是一个有序的、不可变的消息序列。每当有新的消息到达,它们会被追加到分区的日志末尾,形成一个逐渐增长的日志段(Log Segment)。每个日志段都有一个固定的大小,一旦达到大小限制,就会被关闭并创建新的日志段.
日志的追加操作是高效的,因为它只需要将新的消息附加到日志段的末尾,不需要移动现有数据。由于日志是不可变的,一旦消息被写入,就不能更改或删除。这种特性使得Kafka的数据持久性和不变性得到了保证.
消息索引(Index): 消息索引是一个用于加速消息查找的关键组件。每个日志段都有一个对应的消息索引,它存储了一些重要的消息偏移量和物理偏移量的映射关系。索引使得Kafka能够快速定位特定偏移量的消息,而不需要逐个扫描整个日志.
消息索引通常存储在内存中,它分为两部分:内存索引和磁盘索引。内存索引包含了一部分消息偏移量和其在日志中的物理位置的映射,它使得最常见的消息查找可以在内存中完成,非常快速。磁盘索引包含了完整的索引信息,它使得整个索引数据不需要全部加载到内存中,而是按需加载,节省了内存空间.
通过消息索引,Kafka可以迅速定位消息,以便进行消费、回溯和处理。这对于支持高吞吐量的数据处理和实时消费非常重要.
Consumer获取offset = 6的Message 。
00000000000000000000
的分段中 00000000000000000000.index
中找到offset = 6的Position值 00000000000000000000.log
中直接找到字节偏移量为150的位置开始读取消息 segment.bytes
参数配置的大小)时,这个日志段会被关闭并被认为是"不活跃的"。不活跃的日志段会在不影响正在进行的写入的情况下,被删除。这样,旧的消息将会被清除,释放磁盘空间。 segment.ms
参数。当一个日志段被关闭后,如果它的创建时间超过了这个保留时间,它将会被删除。这样可以确保不再需要的旧数据会被及时清理。 retention.ms
参数。如果一个主题被设置了保留时间,并且消息的时间戳早于这个保留时间,那么这些消息将会被删除。这个策略确保了主题中不再需要的消息会被自动清理。 cleanup.policy
参数设置为 compact
),Kafka会保留每个键的最新消息,而旧的消息将被删除。这个策略保留了每个键的最新状态,适用于存储状态信息。 在Kafka中,删除策略的最小单位是日志段(Log Segment)。当满足某个删除条件时,Kafka会删除整个不再需要的日志段,包括其中的消息数据和对应的索引数据.
最后此篇关于Kafka-基础的文章就讲到这里了,如果你想了解更多关于Kafka-基础的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在 Windows 机器上启动 Kafka-Server 时出现以下错误。我已经从以下链接下载了 Scala 2.11 - kafka_2.11-2.1.0.tgz:https://kafka.ap
关于Apache-Kafka messaging queue . 我已经从 Kafka 下载页面下载了 Apache Kafka。我已将其提取到 /opt/apache/installed/kafka
假设我有 Kafka 主题 cars。 我还有一个消费者组 cars-consumers 订阅了 cars 主题。 cars-consumers 消费者组当前位于偏移量 89。 当我现在删除 cars
我想知道什么最适合我:Kafka 流或 Kafka 消费者 api 或 Kafka 连接? 我想从主题中读取数据,然后进行一些处理并写入数据库。所以我编写了消费者,但我觉得我可以编写 Kafka 流应
我曾研究过一些 Kafka 流应用程序和 Kafka 消费者应用程序。最后,Kafka流不过是消费来自Kafka的实时事件的消费者。因此,我无法弄清楚何时使用 Kafka 流或为什么我们应该使用
Kafka Acknowledgement 和 Kafka 消费者 commitSync() 有什么区别 两者都用于手动偏移管理,并希望两者同步工作。 请协助 最佳答案 使用 spring-kafka
如何在 Kafka 代理上代理 Apache Kafka 生产者请求,并重定向到单独的 Kafka 集群? 在我的特定情况下,无法更新写入此集群的客户端。这意味着,执行以下操作是不可行的: 更新客户端
我需要在 Kafka 10 中命名我的消费者,就像我在 Kafka 8 中所做的一样,因为我有脚本可以嗅出并进一步使用这些信息。 显然,consumer.id 的默认命名已更改(并且现在还单独显示了
1.概述 我们会看到zk的数据中有一个节点/log_dir_event_notification/,这是一个序列号持久节点 这个节点在kafka中承担的作用是: 当某个Broker上的LogDir出现
我正在使用以下命令: bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test.topic --property
我很难理解 Java Spring Boot 中的一些 Kafka 概念。我想针对在服务器上运行的真实 Kafka 代理测试消费者,该服务器有一些生产者已将数据写入/已经将数据写入各种主题。我想与服务
我的场景是我使用了很多共享前缀的 Kafka 主题(例如 house.door, house.room ) 并使用 Kafka 流正则表达式主题模式 API 使用所有主题。 一切看起来都不错,我得到了
有没有办法以编程方式获取kafka集群的版本?例如,使用AdminClient应用程序接口(interface)。 我想在消费者/生产者应用程序中识别 kafka 集群的版本。 最佳答案 目前无法检索
每当我尝试重新启动 kafka 时,它都会出现以下错误。一旦我删除/tmp/kafka-logs 它就会得到解决,但它也会删除我的主题。 有办法解决吗? ERROR Error while
我是 Apache Kafka 的新用户,我仍在了解内部结构。 在我的用例中,我需要从 Kafka Producer 客户端动态增加主题的分区数。 我发现了其他类似的 questions关于增加分区大
正如 Kafka 文档所示,一种方法是通过 kafka.tools.MirrorMaker 来实现这一点。但是,我需要将一个主题(比如 测试 带 1 个分区)(其内容和元数据)从生产环境复制到没有连接
我已经在集群中配置了 3 个 kafka,我正在尝试与 spring-kafka 一起使用。 但是在我杀死 kafka 领导者之后,我无法将其他消息发送到队列中。 我将 spring.kafka.bo
我的 kafka sink 连接器从多个主题(配置了 10 个任务)读取,并处理来自所有主题的 300 条记录。根据每个记录中保存的信息,连接器可以执行某些操作。 以下是触发器记录中键值对的示例: "
我有以下 kafka 流代码 public class KafkaStreamHandler implements Processor{ private ProcessorConte
当 kafka-streams 应用程序正在运行并且 Kafka 突然关闭时,应用程序进入“等待”模式,发送警告日志的消费者和生产者线程无法连接,当 Kafka 回来时,一切都应该(理论上)去恢复正常
我是一名优秀的程序员,十分优秀!