贵港网站建设公司,学校网站模板html,北京工程网站建设,企业网站的建设一、背景近期#xff0c;我们的kafka 消息队列集群(1.x版本)经过了一次事故。某节点意外宕机#xff0c;导致 log 文件损坏#xff0c;重启 kafka 失败#xff0c;最后导致某个 topic 的分区不可用#xff0c;本文对此做了简单的分析、解决和复现参考#xff0c;以此为记…一、背景 近期我们的kafka 消息队列集群(1.x版本)经过了一次事故。某节点意外宕机导致 log 文件损坏重启 kafka 失败最后导致某个 topic 的分区不可用本文对此做了简单的分析、解决和复现参考以此为记录供各位参考。二、分析、解决(1)初次启动时异常节点输出的日志Feb 10 10:53:20 kafka-1.nc.node.prod-1.services.dev run_kafka.sh[6867]: [2023-02-10 10:53:20,632] WARN Found a corrupted index file due to requirement failed: Corrupt index found, index file (/data2/kafka/data/ncuser_user--1/00000000000170016370.index) has non-zero size but the last offset is 170016370 which is no larger than the base offset 170016370.}. deleting /data2/kafka/data/ncuser_user--1/00000000000170016370.timeindex, /data2/kafka/data/ncuser_user--1/00000000000170016370.index, and /data2/kafka/data/ncuser_user--1/00000000000170016370.txnindex and rebuilding index... (kafka.log.Log)Feb 10 10:53:20 kafka-1.nc.node.prod-1.services.dev run_kafka.sh[6867]: [2023-02-10 10:53:20,632] INFO Loading producer state from snapshot file /data2/kafka/data/ncuser_user--1/00000000000170016370.snapshot for partition ncuser_user--1 (kafka.log.ProducerStateManager)(2)参考https://www.cnblogs.com/felixzh/p/11174439.html进行数据删除后异常节点输出的日志Feb 10 13:41:05 kafka-1.nc.node.prod-1.services.dev run_kafka.sh[18889]: [2023-02-10 13:41:05,662] WARN Found an orphaned index file, /data2/kafka/data/nc-5/00000000004114316599.timeindex, with no corresponding log file. (kafka.log.Log)其他节点输出的日志Feb 10 14:04:09 kafka-2.nc.node.prod-1.services.dev run_kafka.sh[111352]: [2023-02-10 14:04:09,086] ERROR [ReplicaFetcher replicaId135, leaderId137, fetcherId0] Current offset 415494641 for partition nc-21 out of range; reset offset to 415548539 (kafka.server.ReplicaFetcherThread)(3)最终参考https://blog.csdn.net/Javajiaojiaozhe/article/details/108003887 调整了参数然后重启数据损坏的 kafka broker 节点才使得问题得以解决调整参数为unclean.leader.election.enabletrue 确保分区可从非 ISR 中选举 leader后期彻底解决升级 kafka 的版本为较新版本如 2.8.0公司使用的版本过老存在许多 bug。三、总结在 kafka 1.x 版本中处于安全和可靠的考虑有不少参数过于保守。所以用户需要按需调整1、将 broker 参数 unclean.leader.election.enable 设置为 true确保分区可从非 ISR 中选举 leader2、将 broker 参数 default.replication.factor 设置为 3提高高可用但会增大集群的存储压力可后续讨论3、将 broker 参数 min.insync.replicas 设置为 2这么做可确保 ISR 同时有两个但是这么做会造成性能损失是否有必要因为我们已经将 unclean.leader.election.enable 设置为 true 了问题是解决了但需要思考一些问题以便我们能更好地理解 kafka。(1)什么是 LEO、LSO、HW、AR和 ISR1、LEOLog End Offset日志末端位移值或末端偏移量表示日志下一条待插入消息的位移值。举个例子如果日志有10条消息位移值从0开始那么第10条消息的位移值就是9。此时LEO 10。2、LSOLog Stable Offset这是Kafka事务的概念。如果你没有使用到事务那么这个值不存在其实也不是不存在只是设置成一个无意义的值。该值控制了事务型消费者能够看到的消息范围。它经常与Log Start Offset即日志起始位移值相混淆因为有些人将后者缩写成LSO这是不对的。在Kafka中LSO就是指代Log Stable Offset。3、HWHigh watermark高水位值这是控制消费者可读取消息范围的重要字段。一个普通消费者只能“看到”Leader副本上介于Log Start Offset和HW不含之间的所有消息。水位以上的消息是对消费者不可见的。
ARAssigned ReplicasAR是topic 被创建后分区创建时被分配的副本集合副本个数由副本因子决定。举例 AR 的副本在 ISR 副本集中集群有 4台 kafka broker 207、208、209、210
$ kafka-topics.sh --create --zookeeper 127.0.0.1:2181 --replication-factor 4 --partitions 3 --topic isr_testISRIn-Sync ReplicasKafka中特别重要的概念指代的是AR中那些与Leader保持同步的副本集合。在AR中的副本可能不在ISR中但Leader副本天然就包含在ISR中。举例 AR 的副本不在 ISR 副本集中集群有 4台 kafka broker: 134、135、137、138
$ kafka-topics.sh --create --zookeeper 127.0.0.1:2181 --replication-factor 2 --partitions 3 --topic isr_test(2)unclean.leader.election.enable的内涵是从 kafka 1.x的官方解释如下https://kafka.apache.org/10/documentation.html指示是否使不在ISR集中的复制体作为最后手段被选为领导者即使这样做可能导致数据丢失。需要结合 ARAssigned Replicas和 ISR (In Sync Replicas)来理解这个参数。以这个 topic 为例在 134 和 138 节点都下线的情况下 138 节点的 follower2( 134 节点) 副本落后 leader 副本很多并且也不在 leader (135节点)副本和 follower1 (135节点)副本所在的ISR集合之中。follower2 副本正在努力的追赶 leader 副本以求迅速同步并且能够加入到 ISR 中。但是很不幸的是此时他(138)的 ISR中的所有副本都突然下线只留下 partition0 和 partition1。此时 follower2 副本(134节点)还在就会进行新的选举但在选举之前首先要判断 unclean.leader.election.enable 参数的值。1、如果 unclean.leader.election.enablefalse那么就意味着非ISR中的副本不能够参与选举此时无法进行新的选举此时整个分区处于不可用状态。2、如果 unclean.leader.election.enabletrue那么可以从非ISR集合(135 和 137 节点)中选举 follower 副本成为新的leader。产生新的 leader 后随着时间的推进新的 leader 副本从客户端收到了新的消息此时原来的leader副本恢复成为了新的follower副本准备向新的leader副本同步消息但是它发现自身的LEO比leader副本的LEO还要大。限制条件Kafka 中有一个准则follower副本的 LEO 是不能够大于 leader 副本的所以新的 follower 副本就需要截断日志至leader副本的 LEO 处。那么新的 follower 副本需要删除一部分消息之后才能与新的leader副本进行同步。之后新的 follower 副本和新的leader副本组成了新的ISR集合。(3)异常复现请参考https://developer.aliyun.com/article/918789