我在单节点开发环境中遇到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)
导致这种情况的原因是什么,以及防止发生这些异常的正确配置是什么?
答案 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)
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”。