远程消费者 运行 卡夫卡慢

remote consumer running slow for kafka

背景: 我们试图 运行 mirrormaker 尝试将一些数据从我们的一个数据中心复制到 aws。在尝试这样做时,我们 运行 遇到了一个问题,我们似乎在每个分区的吞吐量方面遇到了瓶颈。我们在某些主题中遇到了一个问题,这些主题具有较大的消息大小和不错的吞吐量。我们在 aws 端 运行ning mirrormaker 以及我们的备份 kafka 集群[在不同的机器上]。

我们如何断定每个分区的吞吐量存在瓶颈?

当我们增加主题中的分区数时,吞吐量增加。此外,当在具有一堆分区的主题中生成单个分区时,吞吐量很低。

为了进一步调试,我们尝试在 aws 端使用 consumer-perf-test 来尝试找出消费者是否可能是瓶颈[考虑到理想情况下它应该是那里的消费者或生产者]。

与在我们的数据中心上启动相比,我们发现 aws 上的消费者吞吐量急剧下降。此外,另一个调整一堆属性的观察结果似乎根本不会影响 aws 端消费者的批量大小。

我们试过的属性供参考- fetch.min.bytes=4000000

max.partition.fetch.bytes=33554432

max.poll.records=20000

所以只是想知道是否有一些我可能在这里遗漏的配置会导致这种下降?

编辑 1:

好的,调整代理上的套接字缓冲区确实对消费者性能测试脚本产生了相当大的积极影响。但似乎 mirrormaker 仍然在某处遇到瓶颈。我注意到的一件奇怪的事情是 -

consumer-fetch-manager-metrics:fetch-latency-avg:{client-id=consumer-perf-consumer-4331-1}:145.250

此指标在性能测试脚本中约为 145 毫秒。但是当通过 jmx 统计数据检查 mirromaker 时,对于同一个主题,这个统计数据大约是 1300 毫秒,考虑到两者应该有些相似,这是非常奇怪的。

编辑 2:

所以我看到了一些非常奇怪的东西。似乎 mirrormaker 没有为 mirrormaker 创建的用于复制数据的消费者选择我覆盖的配置。

org.apache.kafka.common.config.AbstractConfig [2022-03-19 00:06:34,709] INFO ConsumerConfig values: 
    allow.auto.create.topics = true
    auto.commit.interval.ms = 5000
    auto.offset.reset = earliest
    bootstrap.servers = [hidden.ip:9092]
    check.crcs = true
    client.dns.lookup = use_all_dns_ips
    client.id = consumer-null-6
    client.rack = 
    connections.max.idle.ms = 540000
    default.api.timeout.ms = 60000
    enable.auto.commit = false
    exclude.internal.topics = true
    fetch.max.bytes = 52428800
    fetch.max.wait.ms = 500
    fetch.min.bytes = 1
    group.id = null
    group.instance.id = null
    heartbeat.interval.ms = 3000
    interceptor.classes = []
    internal.leave.group.on.close = true
    internal.throw.on.fetch.stable.offset.unsupported = false
    isolation.level = read_uncommitted
    key.deserializer = class org.apache.kafka.common.serialization.ByteArrayDeserializer
    max.partition.fetch.bytes = 1048576
    max.poll.interval.ms = 300000
    max.poll.records = 500
    metadata.max.age.ms = 300000
    metric.reporters = []
    metrics.num.samples = 2
    metrics.recording.level = INFO
    metrics.sample.window.ms = 30000
    partition.assignment.strategy = [class org.apache.kafka.clients.consumer.RangeAssignor]
    **receive.buffer.bytes = 65536**
    reconnect.backoff.max.ms = 1000
    reconnect.backoff.ms = 50
    request.timeout.ms = 30000
    retry.backoff.ms = 100
    sasl.client.callback.handler.class = null
    sasl.jaas.config = null
    sasl.kerberos.kinit.cmd = /usr/bin/kinit
    sasl.kerberos.min.time.before.relogin = 60000
    sasl.kerberos.service.name = null
    sasl.kerberos.ticket.renew.jitter = 0.05
    sasl.kerberos.ticket.renew.window.factor = 0.8
    sasl.login.callback.handler.class = null
    sasl.login.class = null
    sasl.login.refresh.buffer.seconds = 300
    sasl.login.refresh.min.period.seconds = 60
    sasl.login.refresh.window.factor = 0.8
    sasl.login.refresh.window.jitter = 0.05
    sasl.mechanism = GSSAPI

根据消费者部分下的 jmx 统计信息,我了解到这应该是命名的客户端 ID,它实际上正在执行繁重的工作和移植数据。 -

我已经设置了 https://cwiki.apache.org/confluence/display/KAFKA/KIP-382%3A+MirrorMaker+2.0 的 mirrormaker kip 中提到的属性。根据日志,这些反映的是生产者方面的事情,但似乎根本不是我的消费者。我正在使用 2.7.1 发行版中的 mirrormaker 2。

好的,我明白了。在卡夫卡 2.7 中。分布,似乎有一个错误,其中消费者属性没有被核心消费者选择,而核心消费者实际上轮询源集群的数据。他们奇怪地被选为农产品。

我升级到3.1,分享改进,供参考- 正在复制的数据 - 平均消息大小为 ~100kb

的单个分区主题

从具有默认发送缓冲区字节的集群复制时,吞吐量增加了原来的 3 倍[对缓冲区、轮询记录等使用了推荐的更高设置]

在调整了 send.buffer.bytes [1 mb 而不是默认的 100kb] 的集群上,我的吞吐量增加了 30 倍。

数据中心之间的延迟约为 70 毫秒以供参考。