我在kafka中有一个主题为 internal
。我使用以下命令创建了主题
/opt/kafka/bin/kafka-topics.sh
--create --zookeeper zookeeper:2181
--replication-factor 3 -partitions 6
--topic internal
我需要在三个不同的节点服务器中使用所有消息。因此,我将kafka-node模块用作具有不同使用者名称的使用者组。我创建了一个名为group1
,group2
,group3
的消费者组名称。
一切正常,我可以在所有使用者中使用所有消息。
但是,当任何经纪人破产时,消费者都不会收到任何消息。当我列出所有消费者组时,它没有显示特定的组ID。
(例如,如果nodeserver 1
处于关闭状态,则代理group1
中没有可用的组
即使重新启动节点服务器,它也不会在代理中创建任何组,也不会在相应的节点服务器中使用任何消息。但是,当代理启动时,节点服务器重新启动,它将在代理中创建组,并且节点服务器可以接收消息。
consumer.js
const options = {
kafkaHost: process.env.KAFKA_HOST,
groupId: group_id, //group1 (or) group2 (or) group3
autoCommit: true,
sessionTimeout: 15000,
protocol: ['roundrobin'],
fromOffset: 'latest',
outOfRangeOffset: 'earliest',
migrateHLC: false,
migrateRolling: true,
fetchMaxBytes: 1024 * 1024 * 10,
commitOffsetsOnFirstJoin: true,
onRebalance: (isAlreadyMember, callback) => {
log.info({"ALREADY_MEMBER_isAlreadyMember": isAlreadyMember});
callback();
}
};
const consumerGroup = new ConsumerGroup(options, process.env.KAFKA_TOPIC);
// On receiving message
consumerGroup.on("message", handMessage); //handMessage is where the message has been handled
// On error receiving message
consumerGroup.on('error', function(err) {
log.debug({"type": "KAFKA_CONSUMER_ERROR", "msg": err});
});
// On error receiving message
consumerGroup.on('offsetOutOfRange', function(err) {
log.debug({"type": "KAFKA_CONSUMER_RANGE_ERROR", "msg": err});
});
更新-1
即使我将offsets.topic.replication.factor
更新为2
或3
,也遇到了同样的问题。当任何代理关闭时,相应的节点服务器不会使用该消息。而且,当我显示代理中的组列表时,它仅显示group2
和group3
。但是当group1
断开时,broker1
不存在。即使重新启动节点使用者,也不会创建group1
。
server.properties
broker.id=1
listeners=INSIDE://:9092,OUTSIDE://:9094
advertised.listeners=INSIDE://:9092,OUTSIDE://:9094
listener.security.protocol.map=INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/kafka/kafka-logs-d3f14c9ddf0a
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
zookeeper.connection.timeout.ms=16000
group.initial.rebalance.delay.ms=0
inter.broker.listener.name=INSIDE
advertised.port=9094
port=9092
auto.create.topics.enable=false
更新-2
当代理关闭时,组协调器将被删除,并且不会自动重新当选。
你们能告诉我我做错了什么吗?还是我还需要更新?
答案 0 :(得分:1)
假设这至少是Kafka 1.x,则需要对internal
Kafka主题的HA进行一些更改。考虑来自server.properties
的以下代码段。复制的默认值设置为1。对于您的情况,对于3个代理,将它们设置为2可能是一个不错的起点。
# The replication factor for the group metadata internal topics "__consumer_offsets" and "__transaction_state"
# For anything other than development testing, a value greater than 1 is recommended for to ensure availability such as 3.
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
添加
根据我的理解,每个消费者组都有其组协调员。因此,如果某个主题使用了多个组,则该主题可以可以使用多个协调器(不同的代理)。经纪人可以充当多个消费者群体的group coordinator
。但是对于一个消费者群体,只有一位经纪人充当协调员。对于特定的消费者组,我们可以使用以下命令检查哪个经纪人是协调者:
./kafka-consumer-groups.sh --bootstrap-server <broker-host>:9092 --describe --group <consumer-group> --state
如果协调器失败,则将选择其他经纪人作为协调器。 here在第10节中详细介绍了故障转移策略。
答案 1 :(得分:1)
即使我将
offsets.topic.replication.factor
更新为2或3,也遇到相同的问题。当我的任何代理关闭时,相应的节点服务器不使用该消息
在创建offsets主题之后,更改此属性不会执行任何操作。
如果设置为 ,那么您现在需要to manually increase it