【问题标题】:Apache Kafka for Time Series Data Persistence用于时间序列数据持久性的 Apache Kafka
【发布时间】:2016-04-15 09:49:03
【问题描述】:

我们有一个系统(比如系统 A)通过 HTTP 接收时间序列数据,并且这些数据通过 OpenTSDB 的 REST 接口被持久化在 OpenTSDB 中。我现在想将 Apache Kafka 引入系统。我的想法是让 Kafka 服务器运行,其中系统 A 一旦接收到时间序列消息,就会将此消息发布到 Apache Kafka 服务器。

然后我可以让消费者从主题中读取数据并将此数据写入 OpenTSDB。我对这种方法有几个问题:

关于构建生产者和消费者:

  1. 我可以有一个独立的客户端,我将在其中编写仅从 Kafka 主题消费并将消息写入 OpenTSDB 的消费者

  2. 生产者将成为系统 A 的一部分,并将向相应主题发布消息

关于Kafka主题,时间序列数据是一些具有键和值的指标,示例如下:

 "metric.metricType.tagName"

我将拥有数百甚至数千个这些不同的标记名。如何构建这些信息并将其表示为 Apache Kafka 中的主题。我不确定我可以创建的主题数量是否有限制。

我应该为每个 tagName 设置一个主题吗?划分主题有什么用?

关于 Apache Kafka 分区,我有以下问题:

  1. 如果我有一个主题“主题 A”,并且为此主题设置了 4 个分区,并且如果我的生产者写入此分区,那么此消息将在该主题的哪个分区中可用?同一主题内的每个分区是否都提供相同的消息?

  2. 如果我为这个分区主题编写一个消费者,它的行为会如何,我的意思是,这个消费者会收到来自分区的消息吗?

  3. 如果此分区主题有多个消费者,所有这些消费者都会收到相同的消息吗?我的意思是如果主题中有 4 个分区(TP1、TP2、TP3、TP4)并且我有 4 个消费者组(CG1、CG2、CG3、CG4),在每个消费者组中,我有一个消费者从各自的主题分区(C1 从 TP1 读取,C2 从 TP2 读取等等)。如果我的所有消费者组都将收到的消息写入同一个数据库,我最终会收到重复的消息吗?

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    我可以有一个独立的客户端,我将在其中编写消费者 从 Kafka 主题消费并将消息写入 OpenTSDB?

    是的,我就是这样做的。一个独立的 Java 应用程序(您可以称它为“Java 服务器应用程序”)。

    我应该为每个 tagName 设置一个主题吗?

    如果您想以不同于其他标签的方式处理带有一个标签的消息,例如保留、消息大小(和other topic-level settings)那么有一个单独的主题是有意义的,但如果你要拥有数千个标签,我宁愿不这样做。它可以只是消息中的一个简单字段。您可以将一个主题用于您的指标,然后,当您想要添加其他类型的消息时(一旦您看到好处,您肯定会想要这样做:)您可以为那。您可以粗略地将主题视为数据库中的实体,但这是一个相当弱的比较,因为它取决于许多因素,如大小、传入率和类似的东西。没有一刀切的方法,因此您必须提出一个单独的、具体的问题,以及您拥有的所有参数。

    如何划分主题?

    分区是 Kafka 的消费并行机制(它们也有助于冗余,因为每个分区都跨代理复制,具体取决于您选择的复制因子)。由于分区不能被多个消费者线程使用,因此您首先需要创建更多分区(并开始使用较少数量的线程进行消费),以便以后可以将线程数增加到分区数。 (这个限制可能在最新的 Kafka 版本 0.9 中已经解除。这条规则适用于 v0.8 的低级消费者)。

    如果我有一个主题“主题 A”并且为此设置了 4 个分区 主题,如果我的生产者写入这个分区,在哪个分区 本主题的该消息是否可用?

    如果您像您描述的那样发布消息,您将不知道消息将在哪个分区结束。 这是由生产者端的哈希决定的,默认的哈希机制是随机的(类似于“循环”)。 您可以通过确定将用于散列的属性来控制分区。例如。如果您将tag 包含在哈希中,则具有相同标签的所有消息将始终进入同一分区。当您想确保具有相同标签的消息以它们放入 Kafka 的相同顺序(即生产)被使用时,这一点很重要。

    同一主题内的每个分区中是否都有相同的消息?

    不,分区总是包含大致相等的主题消息子集(如果默认,使用随机散列)。

    如果我为这个分区主题写一个消费者,这将如何 行为,我的意思是,这个消费者会收到来自 分区?

    消息将被随机消费,因为消费者线程之间没有协调。当然,这是可以理解的,因为这会导致巨大的性能损失。

    如果我有多个消费者用于这个分区主题,所有的 那些消费者收到相同的消息?

    这取决于消费者群体。同一组中的所有消费者线程总共接收 100% 的消息(例如,4 个消费者线程中的每一个将从该主题获得 25% 的消息)。另一方面,如果您有 2 个具有不同组的消费者,那么他们每个人都会消耗来自该主题的 100% 的消息。我想你可以从中推断出你最后两个问题的答案,对吧?

    【讨论】:

    • 1.我猜你的意思是一个独立的客户端应用程序?
    • “Kafka 消费者客户端”意义上的客户端,但通常看起来它就像一个小型服务器,因为它是一项长时间运行的任务。我的也有 REST 接口,可用于获取一些消费指标,在特定偏移处提取单个消息并控制一些配置参数(可以动态更改)。
    • 我不太明白你的说法“不,分区总是包含大致相等的主题子集......”你能详细说明一下吗?
    • 主题由(拆分)分区组成,所以假设您有 2 个分区。随机散列生产者将大约 50% 的消息发送到 partition0,另外 50% 发送到 partition1。更一般地说,如果你有 N 个分区,每个分区将包含该主题中消息总数的 1/N(当使用循环,即使用随机散列时)。
    • 这种分区应该如何处理时间序列数据?假设 T1、T2...Tn 是时间序列数据,并且我有一个包含 2 个分区的主题。现在随着 T 的到来,假设 T1 进入主题分区 P1,T2 进入 P2,依此类推。当我使用我的消费者阅读这些 T 时,它将在 Cassandra 中持久化数据,我最终可能会在 T2 之前持久化 T3。我绝对不想落入这种境地。您能对此发表评论吗?
    猜你喜欢
    • 2016-10-27
    • 2017-09-05
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    相关资源
    最近更新 更多