kafka transactionlog失败,尽管配置正确,但出现notenoughreplicasexception

dfty9e19  于 2021-06-06  发布在  Kafka
关注(0)|答案(6)|浏览(1096)

在我们的单节点开发环境中,kafka的读取失败,我遇到了一些问题
我们运行的是单节点kafka示例和单节点zookeeper——因为这是一个dev env,所以我们并不真正关心复制。
我们将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

我使用的是Kafka1.0.0,如日志所示:

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

造成这种情况的原因是什么?防止这些异常发生的正确配置是什么?

c2e8gylq

c2e8gylq1#

将insync和default replication设置为相同的值min.insync.replicas=1 default.replication.factor=1

bakd9h0s

bakd9h0s2#

与其删除zookeeper示例并重新开始,我建议减少 min.insync.replicas 主题 __transaction_state , __transactionLog (或如果有其他人)到1。这可以通过使用 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. 当主题的insync replicas的值降为1时,kafka将再次检查主题的min insync replicas应等于配置中设置的值的标准,这一次生产者将能够在没有任何问题的情况下写入主题。

2ledvvac

2ledvvac3#

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大小为1(isr:0)
准备两个或多个代理并使用选项--replication factor 2创建主题

mrwjdhj3

mrwjdhj34#

上面发布的配置结果是正确的。
但是,zookeeper示例在最初创建主题时配置不正确,从日志中重放消息似乎会引发错误。
删除zookeeper示例并从fresh重新开始可以解决此错误

scyqe7ek

scyqe7ek5#

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

6uxekuva

6uxekuva6#

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

这是默认配置,但您可以根据主题覆盖它。覆盖存储在zookeeper中,正如您从主题描述中所读到的那样。

相关问题