1. 前言
昨天晚上公司内部直播分享了一下OceanBase敏捷版诊断工具obdiag,主要的目的是拉齐一下前线和后端开发人员的诊断OceanBase问题的信息,众人拾柴火焰高,大家一起把obdiag做起来。晚上回去想了想,obdiag既然是开源项目,除了原厂的这些人的经验,社区的力量也是不容忽视的,所以写下此文章,诚邀大家一同来共建obdiag。
OceanBase敏捷诊断工具相关链接:
github仓库 | https://github.com/oceanbase/oceanbase-diagnostic-tool |
rpm包下载 | https://www.oceanbase.com/softwarecenter |
文档链接 | https://www.oceanbase.com/docs/obdiag-cn |
2. obdiag简介
obdiag是一款为OceanBase量身定制的敏捷版诊断工具,有如下的特点:
3. OceanBase诊断三板斧
有了obdiag之后,OceanBase数据库诊断可以总结为三步走策略,也就是我说的三板斧。第一步先来一次obdiag 巡检,可以帮你把问题扫出来,会生成一份巡检报告,按照报告把对应的点解决一下,如果问题还没解决;第二步,obdiag进行日志分析或者根因分析,找出问题的原因;如果第二步还没解决;直接第三步,一键收集诊断信息,当然这一步也可以放到一开始的时候做,避免故障场景转瞬即逝。
3. obdiag使用
主体功能一键巡检、一键根因分析、一键信息采集、一键日志分析等请移步官网文档: https://www.oceanbase.com/docs/obdiag-cn
4. obdiag设计与实现
代码整体结构:
├── common/ 一些通用的功能抽取到common目录下,便于其他模块调用
├── conf/ obdiag的内置的配置文件,编译的rpm包安装的时候放在了/usr/local/oceanbase-diagnostic-tool/conf
│ └── inner_config.yml
├── dependencies/ 依赖的包,比如obstack的二进制文件等存放的目录
├── docs/ 文档
├── example/ 用户侧配置样例,安装后会放在~/.obdiag/example/
├── handler/ 诊断核心代码
│ ├── analyzer/ 一键诊断分析功能
│ │ ├── analyze_flt_trace.py 全链路分析代码
│ │ ├── analyze_log.py 日志分析代码
│ │ └── log_parser/ 日志解析
│ ├── checker/ 一键巡检的代码
│ │ ├── check_exception.py 巡检异常处理的代码
│ │ ├── check_handler.py 巡检模块的代码入口,调用从这出发
│ │ ├── check_list.py 巡检场景列表展示的代码
│ │ ├── check_report.py 巡检报告代码
│ │ ├── check_task.py 巡检任务分发
│ │ ├── result/ 巡检结果处理
│ │ │ ├── result.py
│ │ │ └── verify.py
│ │ ├── step/ 巡检步骤拆解
│ │ │ ├── get_system_parameter.py
│ │ │ ├── sql.py
│ │ │ ├── ssh.py
│ │ │ └── stepbase.py
│ │ └── tasks/ 实际的巡检的yaml,开发者可以再这个目录下添加巡检场景
│ │ ├── obproxy/
│ │ └── observer/
│ ├── gather/ 一键收集功能
│ │ ├── gather_awr.py awr报告收集代码
│ │ ├── gather_log.py 日志收集代码
│ │ ├── gather_obadmin.py 解析clog/slog的代码
│ │ ├── gather_obproxy_log.py 收集obproxy代码
│ │ ├── gather_obstack2.py 收集堆栈信息的代码
│ │ ├── gather_perf.py 收集火焰图的代码
│ │ ├── gather_plan_monitor.py 收集并行SQL的代码
│ │ ├── gather_scenes.py 场景化收集的入口代码
│ │ ├── gather_sysstat.py 收集主机信息的代码
│ │ ├── scenes/ 场景化信息采集的处理代码
│ │ │ ├── base.py
│ │ │ ├── cpu_high.py cpu高场景
│ │ │ ├── list.py 场景列表展示的代码
│ │ │ ├── register.py 硬编码场景注册代码
│ │ │ └── sql_problem.py sql问题采集的代码
│ │ ├── step/ 场景化采集的执行器
│ │ │ ├── base.py
│ │ │ ├── sql.py sql执行器
│ │ │ └── ssh.py ssh执行器
│ │ └── tasks/ 收集场景的yaml文件
│ ├── meta/ 一些元信息存储的文件夹,比如错误码对应关系
│ └── rca/ 根因分析文件夹
│ ├── rca_exception.py 异常处理
│ ├── rca_handler.py 根因分析的入口
│ ├── rca_list.py 根因分析场景列表展示代码
│ └── rca_scene/ 根因分析场景
│ ├── disconnection_scene.py 断连接场景代码
│ ├── lock_conflict_scene.py 锁冲突场景代码
│ ├── major_hold_scene.py 合并卡住场景的代码
│ └── scene_base.py
├── main.py 整个项目的入口
├── cmd.py 命令行注册解析
├── config.py 用户侧配置文件以及系统配置文件解析和生成
├── core.py 被main.py调用,调用对应诊断模块
├── context.py 封装context,透传到各个诊断模块的上下文全靠这部分能力来实现
├── stdio.py 日志打印、动画、进度条等打印相关
├── obproxy_check_package.yaml
├── observer_check_package.yaml
├── resources/ 一些css资源
├── rpm/ 打rpm包的文件夹
├── telemetry/ 遥测功能
├── test/ 测试模块
└── update/ 热更新代码
详细开发者文档请参见: https://oceanbase.yuque.com/org-wiki-obtech-vh7w9r/imzr6c/or82ioetg06ta27e
5. 场景共建
6. 未来规划
7. 写在最后
大道至简,最简单的才是最有用的,诚邀大家一同共建OceanBase数据库诊断。