1.记一次 Kafka 重启失败问题排查
2.Android VNDK/VSDK Snapshot编译框架
3.中通速递761773890760
记一次 Kafka 重启失败问题排查
在2月日下午1点左右,中通中通收到用户反馈,源码日志显示kafka集群A主题的代码分区选举不到leader,导致部分消息发送到该分区时,中通中通出现无leader错误。源码运维在kafka-manager中发现broker0节点处于假死状态,代码多目标非支配算法源码进程仍在运行,中通中通尝试多次重启后仍无反应。源码为了解决问题,代码运维使用kill命令终止了节点进程,中通中通接着尝试重启,源码但失败了。代码
kafka版本为0.,中通中通其中unclean.leader.election.enable参数默认为false,源码表示分区不能在ISR以外的代码副本中选举leader。因为A主题的晓风app源码分区leader副本位于broker0,且另一个副本速度跟不上leader,已被踢出ISR。这导致发送到分区的消息持续报错,且未消费的消息无法继续消费。
查看KafkaServer.log日志,发现Kafka启动过程中生成了大量日志,显示大量主题索引文件损坏,并在重建索引文件。定位到源码中kafka.log.OffsetIndex#sanityCheck方法,该方法用于检查每个logsegment的index文件,确保索引文件的完整性。判断索引文件是否损坏的依据是,entries索引块等于零时,表示索引没有内容,没有损坏;当entries不等于零,php分页 源码需要判断索引文件最后偏移量是否大于索引文件的基偏移量,不大于则认为索引文件损坏,需要重建。
日志显示非正常退出可能导致旧版本中发生此问题。然而,后续版本已经修复了这个问题,修复逻辑是删除损坏的日志文件并重建。接着,查看导致重启失败的错误信息,发现问题出在删除并重建索引过程中。在相关issues中,找到了关于这个问题的描述,表明它很难复现。为了解决问题,升级kafka版本是bootstraptable源码下载当务之急。
针对问题,解决思路是确保broker0启动成功,恢复A主题的分区。由于日志和索引文件导致启动失败,只需删除损坏的日志和索引文件并重启即可。但如果分区的日志索引文件也损坏,会导致该分区下未消费的数据丢失,因为此时分区的leader仍在broker0中,但由于broker0挂掉且分区ISR只有leader,导致分区不可用。在数据清空broker0上的leader数据并重启后,Kafka可能会将broker0的副本作为leader,但由于数据被清空,只能将follower数据截断为0,不大于leader的网址div源码偏移量,这不合理。
提出一个可能的操作,即在分区不可用时,用户可以手动设置分区内的任意一个副本作为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生态系统提供了有力支持。
中通速递
目前中通快递没有任何快递单位有这个单号的快递 。。。也可能是刚刚才投递,还没有进入信息程序;也可能这个单号是属自编的一个号,故没有物流进展信息。所以说中通快递没有这个快递单号的。
(或者说这本就是一个假号 或 过期的快递单号)