由于消费者速度慢,Kafka 重新平衡主题中的数据
Kafka rebalance the data in a topic due to slow(er) consumer
举个例子,假设我有一个包含 4 个分区的主题。我向该主题发送 4k 消息。每个分区获得 1k 条消息。由于外部因素,有 3 个消费者分别处理了他们所有的 1k 条消息。但是,第 4 个分区只能处理 200 条消息,还有 800 条消息需要处理。有没有一种机制允许我 "rebalance" 主题中的数据说给分区 1-3 200 的分区 4s 数据让所有分区有 200 条消息一个进程?
我不是在寻找向消费者组添加额外节点并让 kafka 平衡分区的方法。
添加了重新分配分区的输出:
当前分区副本分配
{
"version": 1,
"partitions": [
{
"topic": "MyTopic",
"partition": 0,
"replicas": [
0
],
"log_\ndirs": [
"any"
]
},
{
"topic": "MyTopic",
"partition": 1,
"replicas": [
0
],
"log_dirs": [
"any"
]
},
{
"topic": "MyTopic",
"partition": 4,
"replicas": [
0
],
"log_dirs": [
"any"
]
},
{
"topic": "MyTopic",
"partition": 3,
"replicas": [
0
],
"log_dirs": [
"any"
]
},
{
"topic": "MyTopic",
"p\nartition": 2,
"replicas": [
0
],
"log_dirs": [
"any"
]
},
{
"topic": "MyTopic",
"partition": 5,
"replicas": [
0
],
"log_dirs": [
"any"
]
}
]
}
提议的分区重新分配配置
{
"version": 1,
"partitions": [
{
"topic": "MyTopic",
"partition": 3,
"replicas": [
0
],
"log_ dirs": [
"any"
]
},
{
"topic": "MyTopic",
"partition": 0,
"replicas": [
0
],
"log_dirs": [
"any"
]
},
{
"topic": "MyTopic",
"partition": 5,
"replicas": [
0
],
"log_dirs": [
"any"
]
},
{
"topic": "MyTopic",
"partition": 2,
"replicas": [
0
],
"log_dirs": [
"any"
]
},
{
"topic": "MyTopic",
"p artition": 4,
"replicas": [
0
],
"log_dirs": [
"any"
]
},
{
"topic": "MyTopic",
"partition": 1,
"replicas": [
0
],
"log_dirs": [
"any"
]
}
]
}
生成消息时分配分区。它们永远不会在分区之间自动移动。通常,对于每个分区,可以有多个消费者(具有不同的消费者组 ID)以不同的速度消费,因此代理无法根据消费者(组)的速度在分区之间移动消息。不过,您可以尝试一些方法:
- 更多分区,希望更公平地分配负载(您可以拥有比消费者更多的分区)
- 让生产者在每条消息上明确设置分区,以在分区之间生成消费者可以更好地应对的分布
- 让消费者监控自己的滞后,在落后时主动退订分区,让其他消费者接载。
您可以采取一些措施来提高性能
- 增加分区数
- 增加消费分区的消费者组。
第一个将重新平衡分区上的负载,第二个将增加分区上的并行度以快速使用消息。
希望对您有所帮助。可以参考这个link 了解更多
https://xyu.io/2016/02/29/balancing-kafka-on-jbod/
Kafka消费者是消费者群体的一部分。一个组中有一个或多个消费者。每个分区都分配给一个消费者。
如果你的消费者多于分区,那么你的一些消费者将会闲置。如果您的分区多于消费者,则可能会将多个分区分配给一个消费者。
每当有新消费者加入时,就会启动重新平衡,并为新消费者分配一些先前分配给其他消费者的分区。
例如,如果有 20 个分区都被一个消费者消费,而另一个消费者加入,则会重新平衡。
重新平衡期间,消费者组"pauses"。
举个例子,假设我有一个包含 4 个分区的主题。我向该主题发送 4k 消息。每个分区获得 1k 条消息。由于外部因素,有 3 个消费者分别处理了他们所有的 1k 条消息。但是,第 4 个分区只能处理 200 条消息,还有 800 条消息需要处理。有没有一种机制允许我 "rebalance" 主题中的数据说给分区 1-3 200 的分区 4s 数据让所有分区有 200 条消息一个进程?
我不是在寻找向消费者组添加额外节点并让 kafka 平衡分区的方法。
添加了重新分配分区的输出:
当前分区副本分配
{
"version": 1,
"partitions": [
{
"topic": "MyTopic",
"partition": 0,
"replicas": [
0
],
"log_\ndirs": [
"any"
]
},
{
"topic": "MyTopic",
"partition": 1,
"replicas": [
0
],
"log_dirs": [
"any"
]
},
{
"topic": "MyTopic",
"partition": 4,
"replicas": [
0
],
"log_dirs": [
"any"
]
},
{
"topic": "MyTopic",
"partition": 3,
"replicas": [
0
],
"log_dirs": [
"any"
]
},
{
"topic": "MyTopic",
"p\nartition": 2,
"replicas": [
0
],
"log_dirs": [
"any"
]
},
{
"topic": "MyTopic",
"partition": 5,
"replicas": [
0
],
"log_dirs": [
"any"
]
}
]
}
提议的分区重新分配配置
{
"version": 1,
"partitions": [
{
"topic": "MyTopic",
"partition": 3,
"replicas": [
0
],
"log_ dirs": [
"any"
]
},
{
"topic": "MyTopic",
"partition": 0,
"replicas": [
0
],
"log_dirs": [
"any"
]
},
{
"topic": "MyTopic",
"partition": 5,
"replicas": [
0
],
"log_dirs": [
"any"
]
},
{
"topic": "MyTopic",
"partition": 2,
"replicas": [
0
],
"log_dirs": [
"any"
]
},
{
"topic": "MyTopic",
"p artition": 4,
"replicas": [
0
],
"log_dirs": [
"any"
]
},
{
"topic": "MyTopic",
"partition": 1,
"replicas": [
0
],
"log_dirs": [
"any"
]
}
]
}
生成消息时分配分区。它们永远不会在分区之间自动移动。通常,对于每个分区,可以有多个消费者(具有不同的消费者组 ID)以不同的速度消费,因此代理无法根据消费者(组)的速度在分区之间移动消息。不过,您可以尝试一些方法:
- 更多分区,希望更公平地分配负载(您可以拥有比消费者更多的分区)
- 让生产者在每条消息上明确设置分区,以在分区之间生成消费者可以更好地应对的分布
- 让消费者监控自己的滞后,在落后时主动退订分区,让其他消费者接载。
您可以采取一些措施来提高性能
- 增加分区数
- 增加消费分区的消费者组。
第一个将重新平衡分区上的负载,第二个将增加分区上的并行度以快速使用消息。
希望对您有所帮助。可以参考这个link 了解更多
https://xyu.io/2016/02/29/balancing-kafka-on-jbod/
Kafka消费者是消费者群体的一部分。一个组中有一个或多个消费者。每个分区都分配给一个消费者。
如果你的消费者多于分区,那么你的一些消费者将会闲置。如果您的分区多于消费者,则可能会将多个分区分配给一个消费者。
每当有新消费者加入时,就会启动重新平衡,并为新消费者分配一些先前分配给其他消费者的分区。
例如,如果有 20 个分区都被一个消费者消费,而另一个消费者加入,则会重新平衡。
重新平衡期间,消费者组"pauses"。