尽管配置正确,Kafka transactionLog仍然会因NotEnoughReplicasException而失败

时间:2018-05-03 17:06:47

标签: apache-kafka

我在单节点开发环境中遇到Kafka读取失败的问题

我们正在运行单节点kafka实例和单节点Zookeeper - 因为这是一个开发环境,我们并不真正关心复制。

我们正在使用Kafka作为Akka持久性的事件存储。当我们尝试阅读消息时(即使是空话题),我们也会提出NotEnoughReplicasException

[2018-05-03 16:57:00,880] ERROR [ReplicaManager broker=0] Error processing append operation on partition __transaction_state-7 (kafka.server.ReplicaManager)
org.apache.kafka.common.errors.NotEnoughReplicasException: Number of insync replicas for partition __transaction_state-7 is [1], below required minimum [2]
[2018-05-03 16:57:00,889] INFO [Transaction State Manager 0]: TransactionalId akka-journal-message-AkkaJavaSpring-4 append transaction log for TxnTransitMetadata(producerId=6000, producerEpoch=0, txnTimeoutMs=60000, txnState=Empty, topicPartitions=Set(), txnStartTimestamp=-1, txnLastUpdateTimestamp=1525366620855) transition failed due to COORDINATOR_NOT_AVAILABLE, resetting pending state from Some(Empty), aborting state transition and returning COORDINATOR_NOT_AVAILABLE in the callback (kafka.coordinator.transaction.TransactionStateManager)

我已配置以下设置:

"min.insync.replicas": 1
"offsets.topic.replication.factor": 1
"transaction.state.log.replication.factor": 1
"transaction.state.log.min.isr" : 1

在启动时记录的配置输出中确认:

[2018-05-03 16:33:34,381] INFO KafkaConfig values: 
    ...snip...
    min.insync.replicas = 1
    num.io.threads = 8
    num.network.threads = 3
    num.partitions = 1
    ...snip...
    transaction.state.log.load.buffer.size = 5242880
    transaction.state.log.min.isr = 1
    transaction.state.log.num.partitions = 50
    transaction.state.log.replication.factor = 1
    transaction.state.log.segment.bytes = 104857600

但是,查询__transactionLog主题似乎会将其min.insync.replicas报告为2:

/usr/bin/kafka-topics --zookeeper zookeeper:2181 --describe

Topic:__transaction_state       PartitionCount:50       ReplicationFactor:1     Configs:segment.bytes=104857600,unclean.leader.election.enable=false,compression.type=uncompressed,cleanup.policy=compact,min.insync.replicas=2
        Topic: __transaction_state      Partition: 0    Leader: 0       Replicas: 0     Isr: 0
        Topic: __transaction_state      Partition: 1    Leader: 0       Replicas: 0     Isr: 0
        Topic: __transaction_state      Partition: 2    Leader: 0       Replicas: 0     Isr: 0
        Topic: __transaction_state      Partition: 3    Leader: 0       Replicas: 0     Isr: 0

我正在使用Kafka 1.0.0,如日志所示:

 INFO Kafka version : 1.0.0-cp1 (org.apache.kafka.common.utils.AppInfoParser)

导致这种情况的原因是什么,以及防止发生这些异常的正确配置是什么?

7 个答案:

答案 0 :(得分:2)

我建议不要将主题min.insync.replicas__transaction_state(或如果还有其他主题)的__transactionLog减小为1,而不是删除zookeeper实例并重新开始。通过使用kafka-configs.sh实用程序就可以实现。

bin/kafka-configs.sh --bootstrap-server [host]:[port] --alter --entity-type topics --entity-name __transaction_state --add-config min.insync.replicas=1

min.insync.replicas = 2的主题执行此操作。当主题的异步副本的值降至1时,Kafka会再次检查该主题的最小异步副本应等于设置的值的标准。配置,这次制作人将能够毫无问题地写主题。

答案 1 :(得分:1)

上面发布的配置证明是正确的。

但是,当主题最初创建时,Zookeeper实例配置不正确,并且从日志重播消息似​​乎引发了错误。

删除Zookeeper实例并从新的重新开始解决了错误

答案 2 :(得分:0)

尝试将复制因子设置为2,这可能是因为主题分区的同步副本已低于min.insync.replicas

答案 3 :(得分:0)

https://github.com/apache/kafka/blob/trunk/core/src/main/scala/kafka/cluster/Partition.scala#L569-L572

if (inSyncSize < minIsr && requiredAcks == -1) {
    throw new NotEnoughReplicasException("Number of insync replicas for partition %s is [%d], below required minimum [%d]"
      .format(topicPartition, inSyncSize, minIsr))
}

这是异常发生的地方。你设置min.insync.replicas = 2但是isr size是1(ISR:0)

你准备两个或更多的经纪人和 使用选项--replication-factor 2

创建主题

答案 4 :(得分:0)

[2018-05-03 16:33:34,381] INFO KafkaConfig values: 
    ...snip...
    min.insync.replicas = 1

这是默认配置,但是您可以按主题覆盖它。您已从主题说明中了解到,这些替代项存储在Zookeeper中。

答案 5 :(得分:0)

将异步和默认复制设置为相同的值 min.insync.replicas = 1 default.replication.factor = 1

答案 6 :(得分:0)

只是让您知道从版本 (2.3.0) 到版本 (2.7.0) 我发现这一行“offsets.topic.replication.factor=1”发生了变化,这会导致可怕的错误(有时是这一行存在并硬编码为 1)。

<块引用>

"org.apache.kafka.common.errors.NotEnoughReplicasException: 大小 当前 ISR Set(0) 不足以满足 min.isr 分区要求 2"

当然,这会与您设置的“min.insync.replicas”发生冲突。因为我在启动 Kafka 之前运行了一个 shell 脚本,所以我只是查找该行并将其注释掉,这使得“__consumer_offsets”主题转到您设置的默认“default.replication.factor”。