代理关闭时,节点kafka使用者组未收到消息

时间:2018-12-24 09:37:46

标签: node.js apache-kafka kafka-consumer-api

我在kafka中有一个主题为 internal 。我使用以下命令创建了主题

/opt/kafka/bin/kafka-topics.sh 
     --create --zookeeper zookeeper:2181 
     --replication-factor 3 -partitions 6 
     --topic internal

我需要在三个不同的节点服务器中使用所有消息。因此,我将kafka-node模块用作具有不同使用者名称的使用者组。我创建了一个名为group1group2group3的消费者组名称。

一切正常,我可以在所有使用者中使用所有消息。

但是,当任何经纪人破产时,消费者都不会收到任何消息。当我列出所有消费者组时,它没有显示特定的组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更新为23,也遇到了同样的问题。当任何代理关闭时,相应的节点服务器不会使用该消息。而且,当我显示代理中的组列表时,它仅显示group2group3。但是当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

当代理关闭时,组协调器将被删除,并且不会自动重新当选。

你们能告诉我我做错了什么吗?还是我还需要更新?

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