Kafka大日志问题-不知道到底发生了什么

lnvxswe2  于 2021-06-04  发布在  Kafka
关注(0)|答案(1)|浏览(861)

在我的群里有4个 Brokers 托管在4台服务器上;每台服务器都有一个 Kafka Broker 和一个 Zookeeper daemon . 代理共享此配置:

num of partitions: 8
replication factor: 4
log segment bytes 1,07GB

在server2和server4(broker 2和4)上,24小时后的日志大小为18 gb。这是个问题。在日志中,我们可以看到此类警告消息,不断重复:

WARN Received a PartitionLeaderEpoch assignment for an epoch < latestEpoch. 
This implies messages ave arrived out of order. New: {epoch:46, offset:7902727725},
CurrentL {epoch:147, 78884395360} for Partition: topic.

WARN Received a PartitionLeaderEpoch assignment for an epoch < latestEpoch. 
This implies messages ave arrived out of order. New: {epoch:46, offset:7902727726}, 
CurrentL {epoch:147, 78884395360} for Partition: topic.

我还注意到偏移量是每行递增的。
这里有什么问题?
编辑:

分区重新分配不幸没有效果
抱歉,可能是我的错:我们有5个zookeeper节点,因为它是在图片上,但我不知道Kafka管理器总是只显示活动节点或全部?
我们只剩下更新了,但我会稍后再尝试(现在不行),我要说的是结果
编辑2:
我尝试重新分配分区,但它已完成(有时状态仅在挂起时停止)其他屏幕:


设置呢?

xqk2d5yq

xqk2d5yq1#

首先,移除其中一个 Zookeeper 法定人数:人数必须是奇数,以保证所作决定的多数:
同一应用程序中的复制服务器组称为仲裁。zookeeper使用多数票,这意味着每次投票都需要多数票才能投票。
想象一下新领导人的投票: ZK1 以及 ZK2 投票给“特朗普”,而 ZK3 以及 ZK4 投“哈里斯”一票。结果是平局:没有多数,所以没有决断。坎耶·韦斯特当选总统。
通常的数量 Zookeeper 群集中的守护程序是 1,3,5,7 . 对于您的具体情况,3应该是好的。
在damianos17的评论之后编辑:zk编号是5,而不是4。因此,上述文本不影响本问题;5完全有效,坎耶应该当选
关于你的问题,它似乎与这个错误有关。大日志问题只是kafka集群中的一个问题的结果。
正如其他用户评论的那样,这个错误会导致垃圾邮件发送千兆字节的警告日志消息,就像您作为示例发布的那些消息一样。结果,你得到了那些18gb的日志文件,没有一个有健康头脑的人会尝试去阅读。
这是因为 assign 中的操作 LeaderEpochFileCache 类将调用 validateAndMaybeWarn 如果时代不一致的话。
这种方法是伴随着一种猖獗的囤积行为而产生的。如果无法进行验证,它将在每次调用时记录警告。

def validateAndMaybeWarn(epoch: Int, offset: Long) = 
 {
    //....
   if (epoch < latestEpoch())
     warn(s"Received a PartitionLeaderEpoch assignment for an epoch < latestEpoch."+    
          s"This implies messages have arrived out of order.")
     // Diogenes rules //
    //....
 }

另一方面,由于高水位线截断,您还可能注意到集群上的数据丢失。这只是一种可能性,在你的情况下可能不会发生。
Kafka的一位作者的评论肯定了主要错误(导致创建大日志的错误)应该在这次更新中得到解决。
作为一种解决方法,我发现一些信息(csdn,stackoverflow)表明分区重新分配可以解决您的问题。
下面的文字是从一个作者是个混蛋的前一个答案抄来的
分区重新分配
你可以用Kafka的 kafka-reassign-partitions.sh 生成重新分配。
Kafka文件中规定的方法遵循以下逻辑:
生成建议的分区重新分配配置
首先,您应该创建一个json文件,比如链接中提供的。我们来命名吧 topics.json .

{
  "topics": [{"topic": "foo1"},
            {"topic": "foo2"}],
  "version":1
}

这将告诉Kafka你愿意从哪些主题重新定位分区。在这个例子中,他希望Kafka提出一个主题的建议 foo1 以及 foo2 .
使用该json,调用工具并在命令中设置活动代理列表:

kafka-reassign-partitions.sh --zookeeper $ZK_HOSTS 
--topics-to-move-json-file topics.json --broker-list "1,2,3,4,5" --generate

这将输出kafka的建议,您可以将其保存到另一个.json文件中。例如:

{
  "version":1,
  "partitions":[{"topic":"foo1","partition":2,"replicas":[5,6]},
              {"topic":"foo1","partition":0,"replicas":[5,6]},
              {"topic":"foo2","partition":2,"replicas":[5,6]},
              {"topic":"foo2","partition":0,"replicas":[5,6]},
              {"topic":"foo1","partition":1,"replicas":[5,6]},
              {"topic":"foo2","partition":1,"replicas":[5,6]}]
}

如果您愿意,您可以手动修改一些作业(或者认为这是正确的想法,因为该工具并不完美)。将json保存到一个文件中,例如, reassign-example.json ,将在下一步中使用。
执行建议的分区重新分配
让Kafka执行提议,移动分区。为此,请执行:

bin/kafka-reassign-partitions.sh --zookeeper $ZK_HOSTS 
 --reassignment-json-file reassign-example.json --execute

在简历中,我建议:
将zk的数量减少到3。
重新分配分区。
如果上一步不起作用,请更新到 Kafka 包含此更新的版本。
请注意,重新分配可能只是一个暂时的修复,并且问题有可能在将来再次发生。

相关问题