跳到主要内容

· 10 分钟阅读

别再担心线上 Java 业务出问题怎么办了,Arthas 帮助你解决以下常见问题:

  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  • 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  • 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  • 是否有一个全局视角来查看系统的运行状况?
  • 有什么办法可以监控到 JVM 的实时运行状态?
  • 怎么快速定位应用的热点,生成火焰图?
  • 怎样直接从 JVM 内查找某个类的实例?

Arthas(阿尔萨斯)是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

Arthas 采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

同时 Arthas 也支持通过 Web Console 进入命令行交互模式,这适用于开发人员没有服务器权限时通过 Arthas Web Console 诊断业务。

Arthas 在 Rainbond 上集成

1. 插件集成

通过 Rainbond 插件的机制,从 Rainbond 开源应用商店一键安装 Arthas 插件并在组件中开通,组件启动时会自动下载 arthas-agent.jar 结合环境变量配置使用 javaagent 方式启动。

2. Arthas Tunnel 集成

当我们的微服务业务有 10+,这时通过 Arthas 去诊断就会比较麻烦,开发人员没有服务器的权限并且通过 Web Console 访问的话也会由于访问地址太多导致特别混乱。这时就需要通过 Arthas Tunnel Server/Client 来远程管理/连接多个 Agent。

Arthas Agent 会通过 WS 注册到 Arthas Tunnel 中,实现统一管理。

Arthas Tunnel 可通过 Rainbond 开源应用商店一键安装。

3. Arthas Web Console

对于 Spring Boot 应用则无需通过 Arthas Tunnel 访问 Web Console,在组件内添加8563端口即可访问 Web Console。(注意:域名访问需开启 Websocket 支持

使用Arthas诊断Rainbond上的Spring Boot应用

本小节使用若依SpringBoot作为示例。

首先需要安装 Rainbond云原生应用管理平台,可参阅文档 安装 Rainbond Allinone

1. 部署 Spring Boot 应用

团队 -> 新增 -> 基于应用商店创建组件 -> 在应用商店中搜索 若依SpringBoot 进行一键部署。

2. 安装 Arthas Java Agent 插件并配置

2.1 安装插件

团队 -> 插件 -> 从应用商店安装插件 -> 在应用商店中搜索 Arthas-Agent 进行一键部署。

2.2 开通插件

ruoyi-admin 开通 Arthas Agent 插件,在组件内 -> 插件 -> 未开通 -> 开通插件。

2.3 环境变量配置

ruoyi-admin 组件配置环境变量,在组件内 -> 环境变量 -> 添加变量。

变量名变量值
JAVA_OPTS-javaagent:/arthas/arthas-agent.jar
ARTHAS_APP_NAMEruoyi-admin
ARTHAS_AGENT_IDruoyi-admin

2.4 添加端口并更新

ruoyi-admin 组件添加 8563 端口并打开对外服务,更新组件完成后可通过默认域名访问 Web Console。

使用Arthas诊断Rainbond上的SpringCloud应用

使用 Arthas 诊断部署在 Rainbond 上的微服务 Spring Cloud Pig,并通过 Arthas Tunnel 统一管理 Arthas agent。本小节将使用 Spring Cloud Pig 作为示例。

首先需要安装 Rainbond云原生应用管理平台,可参阅文档 安装 Rainbond Allinone

1. 部署 Spring Cloud Pig

团队 -> 新增 -> 基于应用商店创建组件 -> 在应用商店中搜索 SpringCloud-Pig 进行一键部署。

2. 部署 Arthas Tunnel

团队 -> 新增 -> 基于应用商店创建组件 -> 在应用商店中搜索 Arthas-Tunnel 进行一键部署。

3. 安装 Arthas Agent 插件并配置

1. 安装插件

团队 -> 插件 -> 从应用商店安装插件 -> 在应用商店中搜索 Arthas-Agent 进行一键部署。

2. 开通插件

为每个微服务组件都开通插件,进入微服务组件 -> 插件 -> 开通插件 Arthas-Agent

3. 配置环境变量

为每个微服务组件配置环境变量,在组件内 -> 环境变量 -> 添加变量。

变量名变量值说明
JAVA_OPTS-javaagent:/arthas/arthas-agent.jarJAVA 启动参数
ARTHAS_APP_NAMEregisterarthas app name,根据实际情况修改
ARTHAS_AGENT_IDregisterarthas agent ID 不可与其他 ID相同,是唯一的

4. 配置依赖关系

将所有微服务组件依赖至 arthas tunnel,应用视图切换到编排模式进行拖拉拽。

5. 批量更新

更新/重启所有微服务相关组件。可在 列表 中批量操作。

4. 通过 Arthas Tunnel 连接到其他 Agent 进行诊断

1.可通过 Arthas Tunnel 8080 端口默认生成的域名访问 Web Console。

2.在 Web Console 中的 IP:PORT 填写 Arthas Tunnel 7777 的对外服务端口,7777 端口是 Agent 连接到 Tunnel 的。所以在通过 Web 远程连接到其他服务时修改 AgentId 即可连接

Arthas 使用入门

1. Arthas 命令使用

Arthas 采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断,以下是部分命令,详细请参阅文档 Arthas命令列表

  • dashboard - 当前系统的实时数据面板
  • getstatic - 查看类的静态属性
  • heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能
  • jvm - 查看当前 JVM 的信息
  • logger - 查看和修改 logger
  • mbean - 查看 Mbean 的信息
  • memory - 查看 JVM 的内存信息
  • ognl - 执行 ognl 表达式
  • perfcounter - 查看当前 JVM 的 Perf Counter 信息
  • sysenv - 查看 JVM 的环境变量
  • sysprop - 查看和修改 JVM 的系统属性
  • thread - 查看当前 JVM 的线程堆栈信息
  • vmoption - 查看和修改 JVM 里诊断相关的 option
  • vmtool - 从 jvm 里查询对象,执行 forceGc

以下是部分命令的使用截图:

2. 生成火焰图

profiler 命令支持生成应用热点的火焰图。本质上是通过不断的采样,然后把收集到的采样结果生成火焰图。
以下命令均在Arthas Tunnel Web Console 中执行。

1.启动 profiler

$ profiler start
Started [cpu] profiling

2.停止 profiler 并生成火焰图

默认情况下,结果文件是html格式,也可以用--format参数指定:

$ profiler stop --format html
OK
profiler output file: /app/arthas-output/20220907-214802.html

3.通过浏览器查看火焰图

上一步生成的 html 文件在指定的微服务组件中,所以需要在该微服务组件中查看火焰图。

进入到该微服务组件中,例如:pig-auth,在组件端口中添加 3658 端口并打开对外服务并访问 http://domain/arthas-output

最后

Arthas 是款非常好的 Java 诊断工具,而在 Kubernetes 中使用较为复杂。Rainbond 底层基于 Kubernetes,在此之上抽象了应用模型,使用户更方便的在 Kubernets 中部署管理应用,并且通过 Rainbond 的插件机制让用户更便捷的使用 Arthas 诊断业务,降低了在 Kubernetes 中使用 Arthas 的门槛,用户只需关注业务。

· 6 分钟阅读

微服务性能分析|Pyroscope 在 Rainbond 上的实践分享

随着微服务体系在生产环境落地,也会伴随着一些问题出现,比如流量过大造成某个微服务应用程序的性能瓶颈、CPU利用率高、或内存泄漏等问题。要找到问题的根本原因,我们通常都会通过日志、进程再结合代码去判断根本原因。对于微服务庞大的业务,这必定会很耗时,而且也很难及时找到关键问题点。

本文将介绍一个 持续性能分析平台 Pyroscope,它能够帮助我们快速找到内存泄漏、CPU利用率高的代码。

什么是 Pyroscope?

Pyroscope 是一个开源的持续性能分析平台。它能够帮你:

  • 查找代码中的性能问题
  • 解决 CPU 利用率高的问题
  • 定位并修复内存泄漏
  • 了解应用程序的调用树
  • 跟踪随时间的变化

Pyroscope 可以存储来自多个应用程序长期的分析数据;可以一次查看多年的数据或单独查看特定的事件;较低的 CPU 使用;数据压缩效率高,磁盘空间要求低;快捷的 UI 界面;

Pyroscope 架构

Pyroscope 由两个主要组件支撑运行:Pyroscope ServerPyroscope Agent

Pyroscope Agent:记录并汇总您的应用程序一直在执行的操作,然后将该数据发送到 Pyroscope Server。支持多种语言,GO、Python、Ruby、eBPF、JAVA、Rust、PHP、NodeJS、.NET

Pyroscope Server: 处理、聚合和存储来自代理的数据,以便在任何时间范围内快速查询。片刻后可以查看分析数据,并在任何时间范围内进行查询。

与 Rainbond 集成架构

1.集成 Pyroscope Agent:

使用 Rainbond 插件的机制在微服务组件内安装 Pyroscope Agent 插件,该插件会将 pyroscope.jar 通过 javaagent 方式启动 java -javaagent:pyroscope.jar -jar app.jar

2.依赖 Pyroscope Server:

将安装了 Pyroscope Agent 插件微服务组件都依赖至 Pyroscope Server。

实践步骤

本文将基于微服务框架 Pig 进行实践,步骤为:

  1. 部署微服务 Spring Cloud Pig,Gitee:https://gitee.com/log4j/pig
  2. 部署 Pyroscope Server
  3. 安装 Pyroscope Java Agent 插件并配置
  4. 建立微服务与 Pyroscope 之间的依赖关系
  5. Pyroscope 基本使用

Rainbond 部署请参阅文档 快速安装

1. 部署微服务 Spring Cloud Pig

通过开源应用商店一键安装 Spring Cloud Pig,新增 -> 基于应用商店创建组件 -> 在开源应用商店中搜索 SpringCloud-Pig 并安装到指定应用中。

2. 部署 Pyroscope Server

通过开源应用商店一键安装Pyroscope Server,新增 -> 基于应用商店创建组件 -> 在开源应用商店中搜索 Pyroscope 并安装到指定应用中。

3. 安装 Pyroscope Java Agent 插件并配置

  1. 插件 -> 从应用商店安装插件,搜索 Pyroscope-Java-Agent 进行安装。

  1. 为每个微服务组件都开通插件,进入微服务组件 -> 插件 -> 开通插件 Pyroscope-Java-Agent 并更新组件。

  1. 为每个微服务组件都设置以下环境变量,可在组件内 -> 环境变量 -> 添加变量。也可以通过应用配置组为所有组件统一配置 JAVA_OPTS 环境变量,而 PYROSCOPE_APPLICATION_NAME 环境变量是唯一的,不可统一配置。
变量名变量值说明
JAVA_OPTS-javaagent:/agent/pyroscope.jarJava agent 启动参数
PYROSCOPE_APPLICATION_NAMEpig.auth微服务模块名称

4. 建立微服务与Pyroscope之间的依赖关系

将所有微服务组件添加依赖连接到 Pyroscope,切换到编排模式进行依赖关系建立,并更新或重启所有微服务组件使依赖关系生效。

5. Pyroscope 基本使用

访问 Pyroscope 的 4040 对外服务端口,即可访问 Pyroscope UI。

在 Single View 视图中,可以通过 Application 选择服务。它可以显示某一段时间内的火焰图,也可以使用表格展示或者同时展示,火焰图可以看到微服务方法调用的性能指标。

在 Comparison View 视图中,可以选择不同的时间段进行比较,通过时间线拖拽即可。

在 Diff View 视图中,可以进行两个时间段的差异比对,这通常在排查微服务的CPU、内存泄漏时很有效。

最后

Pyroscope 还可以结合 Jaeger 一起使用,可以集成在 Jaeger UI 中,可参阅 Jaeger UI 集成


Rainbond 是一个云原生应用管理平台,核心100%开源、使用简单、不需要懂容器和Kubernetes,支持管理多种Kubernetes集群,提供企业级应用的全生命周期管理。

· 8 分钟阅读

随着微服务架构的流行,客户端发起的一次请求可能需要涉及到多个或 N 个服务,致使我们对服务之间的监控和排查变得更加复杂。

举个例子:

某条业务线的某个接口调用服务端时快时慢,这时就需要排查各个服务的日志进行分析,调动各个服务的开发人员联动排查,这种排查费时又费力。对于 ToB 的业务有时候还拿不到日志,难搞哦!

因此,就需要可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题,那就是 APM (Application Performance Monitor)。目前流行的 APM 开源工具有很多,比如:Zipkin,Skywalking,Pinpoint、Jaeger 等等,本文将主要介绍 Jaeger 。

Jaeger 是 Uber 技术团队发布的开源分布式跟踪系统,它用于监控和故障排查基于微服务的分布式系统:

  • 分布式上下文传播、事务监控
  • 根本原因、服务依赖分析
  • 性能/延迟优化
  • OpenTracing 启发的数据模型
  • 多个存储后端:Cassandra, Elasticsearch, memory.
  • 系统拓扑图
  • 服务性能监控(SPM)
  • 自适应采样

Jaeger 架构

ComponentDescription
Jaeger ClientJaeger Client SDK
Jaeger Agent收集 Client 数据
Jaeger Collector收集 Jaeger Agent 数据,有 pull/push 两种方式
DB StorageCollector 需要存储后端,Collector 拿到的数据将存在 Elasticsearch 或 Cassandra。
Spark jobs用于生成拓扑图 UI 数据
Jaeger Query Service & UI负责从 Storage 查询数据并提供 API 和 UI

如何在Rainbond上集成?

1.集成 OpenTelemetry Client:

v1.36 版本以前 Jaeger Client 是基于 OpenTracing API 实现的客户端库,Jaeger Client 结合 Jaeger Agent 一起使用,发送 span 到 Jaeger Collector。

v1.36 版本以后被弃用。使用 OpenTelemetry 替代 Jaeger Client and Jaeger Agent,详情见 Jaeger and OpenTelemetry

OpenTelemetry 是无侵入的,只需在 Java 进程启动时添加 javaagent,例:java -javaagent:path/to/opentelemetry-javaagent.jar -jar myapp.jar

那么在 Rainbond 上就可以通过插件将 OpenTelemetry javaagent 下载到组件中并修改启动命令。

2.连接到 Jaeger-Collector:

将所有安装了 OpenTelemetry javaagent 插件的微服务组件都通过依赖连接到 Jaeger Collector

实践步骤

实践中将使用 Spring Cloud Pig 进行演示,Gitee:https://gitee.com/zhangbigqi/pig

Rainbond 部署请参阅文档 快速安装

1. Spring Cloud Pig 源码部署

通过源码部署 Spring Cloud Pig 微服务框架就不详细介绍部署了,请参阅:

2. OpenTelemetry 插件安装

从应用商店安装 opentelemetry-java-agent 初始化插件,该插件的作用是下载 opentelemetry-javaagent.jar 到微服务组件内,可以在 Java 启动项中指定。

  • 团队视图 -> 插件 -> 从应用商店安装插件 -> 搜索 opentelemetry-java-agent 并安装。

3. 部署 Jaeger

在开源应用商店中搜索 Jaeger 并安装到指定应用中。

4. OpenTelemetry Agent 插件配置

1.开通 OpenTelemetry Agent 插件

pig-gateway 为例,在组件 -> 插件中开通 opentelemetry-java-agent 插件并更新组件生效,微服务内的其他组件均需要开通插件并更新或重启组件生效。

2.配置环境变量

为所有微服务组件配置环境变量。

变量名变量值说明
OTEL_TRACES_EXPORTERjaeger选择 Jaeger exporter
OTEL_EXPORTER_JAEGER_ENDPOINThttp://127.0.0.1:14250Jaeger Collector gRPC endpoint
OTEL_EXPORTER_JAEGER_TIMEOUT10000超时时间(毫秒)
OTEL_METRICS_EXPORTERnoneMetrics 导出器
JAVA_OPTS-javaagent:/agent/opentelemetry-javaagent.jarJava 启动参数

可使用 应用配置组 统一配置并应用到所有组件中。

3.配置组件服务名称

为所有微服务组件配置环境变量 OTEL_SERVICE_NAME ,配置组件的 Jaeger 服务名称,如:OTEL_SERVICE_NAME=pig-gateway OTEL_SERVICE_NAME=pig-auth

5.建立依赖关系

将所有微服务组件添加依赖连接到 Jaeger Collector

Jaeger 部署在另外一个应用,需要进入 组件 -> 依赖 -> 添加 Jaeger Collector 依赖,就可以在当前应用的拓扑图看到 Jaeger Collector 组件,剩下的组件都可通过拓扑图编辑模式进行依赖连接。更新或重启所有微服务组件使依赖关系生效。

6. Jaeger 快速使用

  1. 访问 Spring Cloud Pig UI 进行登录,使其产生数据。

  2. 访问 Jaeger-Query16686 端口,打开对外服务即可访问 Jaeger UI

  3. 在 Jaeger Search 页面中搜索微服务 Pig-gateway 的 Traces

    • Service:选择微服务的组件
    • Operation:选择操作类型,例:GET POST、接口、类.....
    • Tags:根据响应头筛选,例:http.status_code=200 error=true
    • Lookback:选择时间
    • Max Duration:最大持续时间;Min Duration:最小持续时间。
    • Limit Results:限制返回结果数量。

  1. 找到 Pig-gateway HTTP POST 的 Traces 并包含了 pig-auth Span并进入,可看到很清晰的展示了服务之间一层一层的调用以及接口的响应时间,这样我们就可以排查到底是哪个服务调用的慢或者调用有问题。

Jaeger 拓扑图生成

拓扑图默认不会生成,使用 spark-dependencies 组件生成拓扑图数据,这是一个 Spark 作业,它从存储中收集 span,分析服务之间的链接,并将它们存储起来以供以后在 UI 中展示。请参阅 Jaeger Spark dependencies

spark-dependencies 组件占用资源较大,不使用时可关闭,需要生成拓扑图数据时将其启动即可。

最后

有了 APM 系统后,使我们可以更好的分析业务性能、排查故障等。

结合 Rainbond 作为基座不管是 Spring Cloud还是 Jaeger 或其他 APM 都可以很方便、快捷的部署使用,从繁琐的部署、配置中解放出来,让我们更多的关注于业务层。

· 5 分钟阅读

本文描述通过 Rainbond 云原生应用管理平台 一键部署高可用的 DolphinScheduler 集群,这种方式适合给不太了解 Kubernetes、容器化等复杂技术的用户使用,降低了在 Kubernetes 中部署 DolphinScheduler 的门槛。

Apache DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度开源系统。解决数据研发ETL 错综复杂的依赖关系,不能直观监控任务健康状态等问题。DolphinScheduler 以 DAG 流式的方式将 Task 组装起来,可实时监控任务的运行状态,同时支持重试、从指定节点恢复失败、暂停及Kill任务等操作

简单易用:DAG 监控界面,所有流程定义都是可视化,通过拖拽任务定制 DAG,通过 API 方式与第三方系统对接, 一键部署

高可靠性:去中心化的多 Master 和多 Worker, 自身支持 HA 功能, 采用任务队列来避免过载,不会造成机器卡死

丰富的使用场景:支持暂停恢复操作.支持多租户,更好的应对大数据的使用场景. 支持更多的任务类型,如 spark, hive, mr, python, sub_process, shell

高扩展性:支持自定义任务类型,调度器使用分布式调度,调度能力随集群线性增长,Master 和 Worker 支持动态上下线

前提条件

DolphinScheduler 集群一键部署

  • 对接并访问内置的开源应用商店,搜索关键词 dolp 即可找到 DolphinScheduler 应用。

  • 点击 DolphinScheduler 右侧的 安装 进入安装页面,填写对应的信息,点击确定即可开始安装,自动跳转至应用视图。
选择项说明
团队名称用户自建的工作空间,以命名空间隔离
集群名称选择 DolphinScheduler 被部署到哪一个 K8s 集群
选择应用选择 DolphinScheduler 被部署到哪一个应用,应用中包含有若干有关联的组件
应用版本选择 DolphinScheduler 的版本,目前可选版本为 3.0.0-beta2

  • 等待几分钟后,DolphinScheduler 集群就会安装完成,并运行起来。

  • 点击访问,将访问 DolphinScheduler-API 组件,默认的用户密码是admin / dolphinscheduler123

API Master Worker 节点伸缩

DolphinScheduler API、Master、Worker 都支持伸缩多个实例,多个实例可以保证整个集群的高可用性。

以 Worker 为例,进入组件内 -> 伸缩,设置实例数量。

验证 Worker 节点,进入 DolphinScheduler UI -> 监控中心 -> Worker 查看节点信息。

配置文件

API 和 Worker 服务共用 /opt/dolphinscheduler/conf/common.properties ,修改配置时只需修改 API 服务的配置文件。

如何支持 Python 3?

Worker 服务默认安装了 Python3,使用时可以添加环境变量 PYTHON_HOME=/usr/bin/python3

如何支持 Hadoop, Spark, DataX 等?

以 Datax 为例:

  1. 安装插件。Rainbond 团队视图 -> 插件 -> 从应用商店安装插件 -> 搜索 通用数据初始化插件 并安装。
  2. 开通插件。进入 Worker 组件内 -> 插件 -> 开通 通用数据初始化插件 ,并修改配置
  3. 更新组件,初始化插件会自动下载 Datax 并解压到 /opt/soft目录下。

· 11 分钟阅读
info

基础不牢,地动山摇。无论是何种体系架构,底层存储的选择都是一个值得探讨的话题。存储承载着业务的数据,其性能直接影响到业务应用的实际表现。也正因为存储和业务的数据关联紧密,其可靠性也必须得到关注,存储的失效一旦导致业务数据丢失,那将会是一场灾难级别的事故。