1.记一次 Kafka 重启失败问题排查
2.Android VNDK/VSDK Snapshot编译框架
3.中通速递761773890760
记一次 Kafka 重启失败问题排查
在2月日下午1点左右,中通中通收到用户反馈,源码日志显示kafka集群A主题的代码分区选举不到leader,导致部分消息发送到该分区时,中通中通出现无leader错误。源码运维在kafka-manager中发现broker0节点处于假死状态,代码idea阅读源码小技巧进程仍在运行,中通中通尝试多次重启后仍无反应。源码为了解决问题,代码运维使用kill命令终止了节点进程,中通中通接着尝试重启,源码但失败了。代码
kafka版本为0.,中通中通其中unclean.leader.election.enable参数默认为false,源码表示分区不能在ISR以外的代码副本中选举leader。因为A主题的筹码均价指标源码分区leader副本位于broker0,且另一个副本速度跟不上leader,已被踢出ISR。这导致发送到分区的消息持续报错,且未消费的消息无法继续消费。
查看KafkaServer.log日志,发现Kafka启动过程中生成了大量日志,显示大量主题索引文件损坏,并在重建索引文件。定位到源码中kafka.log.OffsetIndex#sanityCheck方法,该方法用于检查每个logsegment的index文件,确保索引文件的完整性。判断索引文件是否损坏的依据是,entries索引块等于零时,表示索引没有内容,没有损坏;当entries不等于零,公示macd指标源码需要判断索引文件最后偏移量是否大于索引文件的基偏移量,不大于则认为索引文件损坏,需要重建。
日志显示非正常退出可能导致旧版本中发生此问题。然而,后续版本已经修复了这个问题,修复逻辑是删除损坏的日志文件并重建。接着,查看导致重启失败的错误信息,发现问题出在删除并重建索引过程中。在相关issues中,找到了关于这个问题的描述,表明它很难复现。为了解决问题,升级kafka版本是grpc 源码剖析java当务之急。
针对问题,解决思路是确保broker0启动成功,恢复A主题的分区。由于日志和索引文件导致启动失败,只需删除损坏的日志和索引文件并重启即可。但如果分区的日志索引文件也损坏,会导致该分区下未消费的数据丢失,因为此时分区的leader仍在broker0中,但由于broker0挂掉且分区ISR只有leader,导致分区不可用。在数据清空broker0上的leader数据并重启后,Kafka可能会将broker0的副本作为leader,但由于数据被清空,只能将follower数据截断为0,不大于leader的源码logo存放地偏移量,这不合理。
提出一个可能的操作,即在分区不可用时,用户可以手动设置分区内的任意一个副本作为leader。后续将对这个问题进行深入分析。
张乘辉,中通科技信息中心技术平台部员工,主要负责消息平台与全链路压测项目的研发。热衷于技术分享,微信公众号「后端进阶」作者,技术博客作者,Seata Contributor,GitHub ID:objcoding。
Android VNDK/VSDK Snapshot编译框架
为了解决Android版本碎片化问题,引入了Treble架构。此架构提供了稳定的新SoC供应商接口,并引入了HAL接口定义语言(HIDL/Stable AIDL),用于指定vendor HAL 和system框架的接口,实现了system框架与Vendor HAL的解耦,使Vendor Freeze成为可能。然而,经过调查发现,AOSP源码的vendor组件有%~%的仓库与system组件耦合,这对架构的灵活性和稳定性产生了影响。Google进一步对Treble架构进行演进,引入了VNDK和VSDK的snapshot方案,旨在增强system/vendor组件之间的interface化能力。system组件通过预编译形成vendor Snapshot,可以提供给不同Android版本的vendor组件使用,这也是Treble方案落地的一个重要环节和基础支撑。
VNDK提供了对Native库进行划分的概念,以达到管控system/vendor组件之间模块耦合度的目的。主要包括core library、vendor-only(proprietary) library、vendor_available library、vndk library和vndk-sp library。这些类别的划分定义了不同类型的相互耦合程度和使用约束,使得system和vendor组件的功能更加独立。
VSDK则是在VNDK的基础上进一步扩展,包含了Vendor Snapshot。Vendor Snapshot包括系统源码维护的用于Vendor编译或集成的Native模块集合。这些模块主要由系统库、vendor可用库和vndk模块构成,其中vndk模块的使能与vendor模块的直接使用密切相关。
Snapshot设计旨在解决system和vendor不同时间、不同版本编译搭配的问题。通过预构建系统侧的库,用于vendor侧的编译,减少对system侧源码的依赖。这可以通过两种方法实现:一种是将system仓库直接包含在vendor的manifest文件中,使用旧版本的代码;另一种是使用Google的Snapshot设计,由system侧预构建生成vendor所需的内容,用于vendor侧编译。两种方法各有优缺点,前者简单直接,但可能导致vendor代码量增加和编译时间延长;后者代码量更精简,编译时间短,但需要额外的预构建系统支持。
Snapshot生成流程可以分为三个阶段:Generate Phrase、Install Phrase和Use Phrase。Generate Phrase阶段通过一定的规则从系统侧源代码中产生出vendor image编译依赖的预置编译模块产物。Install Phrase阶段通过py脚本将生成的prebuilt模块安装到指定源码目录,并生成对应Android.bp文件。Use Phrase阶段通过设置BOARD_VNDK_VERSION变量为具体版本号,触发编译系统使用预先生成的Snapshot参与编译。
VNDK Snapshot生成流程中,生成逻辑在soong/cc/vndk.go中通过定义VndkSnapshotSingleton实现,最终生成的bp文件包含了vndk_prebuilt_shared模块的配置信息,用于vendor侧的编译。VSDK Snapshot的生成逻辑与VNDK类似,主要通过vendor_snapshot.go的GenerateBuildActions方法实现,同样通过设置BOARD_VNDK_VERSION变量进行编译。
总的来说,VNDK/VSDK Snapshot的引入和设计旨在减少system和vendor组件之间的源码依赖,减少编译依赖,更容易形成Treble基线。这为构建更稳定、更高效的Android生态系统提供了有力支持。
中通速递
目前中通快递没有任何快递单位有这个单号的快递 。。。也可能是刚刚才投递,还没有进入信息程序;也可能这个单号是属自编的一个号,故没有物流进展信息。所以说中通快递没有这个快递单号的。
(或者说这本就是一个假号 或 过期的快递单号)