ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SkyWalking Agent 部署 5 个坑:从全线崩溃到全链路可观测

SkyWalking Agent 部署 5 个坑:从全线崩溃到全链路可观测 SkyWalking Agent 部署 5 个坑从全线崩溃到全链路可观测原创声明本文基于本人课程实训期间独立开发的 CoolShark 微服务电商平台Spring Cloud Alibaba实战经验整理为第一手踩坑记录内容已脱敏。项目代码已开源https://github.com/yunxuan4309/csmall实战复盘 · 可观测性落地项目背景微服务电商平台Spring Cloud Alibaba11 个微服务通过 Docker Compose 部署需要接入 SkyWalking 实现全链路追踪。新增 OAP UI 两个容器11 个服务挂载 Agent。本文记录了部署过程中踩过的 5 个坑。一、部署架构微服务 --(gRPC:11800)-- OAP Server --(HTTP:9200)-- Elasticsearch | 浏览器 --(HTTP:8088)-- OAP UI --(HTTP:12800)----------┘新增 2 个容器 11 个服务挂载 Agentskywalking-oap:image:apache/skywalking-oap-server:9.7.0environment:SW_STORAGE:elasticsearchSW_STORAGE_ES_CLUSTER_NODES:elasticsearch:9200JAVA_OPTS:-Xms512m -Xmx1024mskywalking-ui:image:apache/skywalking-ui:9.7.0ports:8088:8080每个服务加 Agent 参数-javaagent:/skywalking-agent/skywalking-agent.jar -DSW_AGENT_NAMEmall-xxx -DSW_AGENT_COLLECTOR_BACKEND_SERVICESskywalking-oap:11800二、坑 1Alpine musl 与 MD5 算法不兼容 —— 全线崩溃现象部署后所有服务崩溃Nacos 客户端报错NoSuchAlgorithmException: MessageDigest get MD5 instance error。根因eclipse-temurin:21-jre-alpine使用musl libc非 glibcSkyWalking Agent 中部分加密算法MD5与 musl 的MessageDigest实现不兼容。连 Nacos 配置中心校验都因为 MD5 失败而罢工——Agent 引入的问题直接干翻了整个服务栈。修复11 个 Dockerfile 基础镜像从eclipse-temurin:21-jre-alpine改为eclipse-temurin:21-jreDebian。副作用镜像体积增加 ~50MB/服务启动时间从 ~30s 增加到 ~9 分钟。三、坑 2Agent 日志目录只读现象服务启动时报java.io.FileNotFoundException: /skywalking-agent/logs/skywalking-api.log (Read-only file system)。根因Agent 卷挂载为:ro只读Agent 默认在自身目录下写日志。修复所有 Dockerfile ENTRYPOINT 加-DSW_LOGGING_DIR/tmp将 Agent 日志重定向到容器内可写的/tmp。四、坑 3Metaspace 溢出现象多个服务崩溃日志显示java.lang.OutOfMemoryError: Metaspace。根因JVM 调优时设了-XX:MaxMetaspaceSize128m。SkyWalking Agent 加载了大量插件类activations 目录下 40 个插件 jar加上 Spring Boot Dubbo Seata MyBatis-Plus 等框架的类元数据总 Metaspace 需求超过 128MB。修复MaxMetaspaceSize从 128m 提升到 256m。Agent 额外占用 ~80MB Metaspace40 插件 × ~2MB 每插件类元数据。五、坑 4Seata 依赖误删导致 Dubbo 调用失败现象商品列表加载时报NoClassDefFoundError: org/apache/seata/core/context/RootContext。根因清理代码时从 mall-front、mall-search、mall-ai 移除了 Seata 依赖。但mall-common中的SeataTransactionConsumerFilterDubbo 消费者过滤器引用了org.apache.seata.core.context.RootContext。这三个服务虽不使用GlobalTransactional但作为 Dubbo 消费端调用 mall-product 时JVM 加载过滤器类失败。教训Seata 对 Dubbo 消费者是类级依赖过滤器 import 需要不是功能级依赖。Java 类加载器在解析类时强制执行所有 import 依赖即使你从不调用它。修复恢复三个服务的 Seata POM 依赖和 YML 配置。其中 mall-ai 额外保持seata.enabled: false类可用但不启用。六、部署影响评估指标调优前调优后容器数2022镜像基础AlpineDebian服务启动时间~30s~9min总内存~6.5 GB~8.5 GB监控覆盖无11 服务全链路追踪兼容性Alpine musl 无问题glibc 全兼容七、经验总结Alpine Java Agent 风险组合musl libc 与 Java 安全算法经常不兼容生产环境用 Debian/Ubuntu 基础镜像MaxMetaspaceSize 要留余量引入 APM Agent 后额外 80MB Metaspace128MB 不够建议 256MB 起Agent 日志路径要可写Agent 挂载卷建议不设:ro或将日志指向/tmpDubbo 消费者必须保留 Seata 类即使不写事务过滤器加载也需要 Seata 在 classpath——删依赖前先查谁 import 了它Debian 镜像启动慢 10 倍对开发体验影响大但对生产部署可接受——取舍要提前评估
返回列表