如何修炼成“神医”——《OceanBase诊断系列》之一

本系列是基于OcenaBase 开发工程师在工作中的一些诊断经验,也欢迎大家分享相关经验。

1. 关于神医的故事

扁鹊,中国古代第一个被正史记载的医生,他的成才之路非常传奇。年轻时,扁鹊是一家客栈的主管。有一位名叫长桑君的客人来到客栈,只有扁鹊看出他是一个不凡之人,对他非常恭敬。长桑君也知道扁鹊不同凡人,十多年里,他在客栈来来去去。有一天,长桑君请扁鹊和他坐在一起,悄声告诉他:“我有秘传的医术,但我年事已高,想传授给你,你不要外传。”扁鹊答应了他,长桑君便将这些秘传的医术传授给了扁鹊,然后便消失了。从此,扁鹊就像是得到了神仙的点拨一般,打通了“任督二脉”,短短三十天内就成为了绝世神医。而扁鹊之所以能成为一代神医,最重要的一点就是长桑君的那本秘籍。由此可见,要想成为OceanBase数据库的“神医”并成功诊断OceanBase数据库,也需要一份秘籍。今天我将详细揭秘在大部分场景下,诊断OceanBase故障的秘籍是什么?

2. OceanBase诊断秘籍

大部分场景下OceanBase的问题都可以通过以下的三板斧:环境分析、日志分析、性能视图分析来定位和分析问题。所以我们的秘籍总结起来如下:

1695267090

环境问题的分析和其他系统并无区别,主要是去分析一下网络、磁盘、内存、CPU等信息,本文接下来的章节不做细致展开。文章会从日志分析和性能视图分析做展开,带你一览OceanBase诊断的秘籍。

2.1. 日志分析

2.1.1. 日志概述

日志分析中最重要的就是OceanBase本身的日志。OceanBase 数据库日志模块所属的日志文件分为 observer.log 、election.log和 rootservice.log 三种类型,默认打印 INFO 级别以上的日志。每类日志文件自动生成一个带有 .wf 后缀的 WARNING 日志文件( observer.log.wf、election.log.wf 、rootservice.log.wf ),只打印了 WARN 级别以上的日志。

日志名称日志路径
启动和运行日志( observer.log 、observer.log.wf )OBServer 服务器的 $work_dir/log 目录下。
选举模块日志( election.log 、election.log.wf )OBServer 服务器的 $work_dir/log 目录下。
RootService 日志( rootservice.log 、rootservice.log.wf )OBServer 服务器的 $work_dir/log 目录下。

OceanBase 数据库日志划分了六个日志级别,含义如下表所示。表中的日志级别从高到低依次排列。

日志级别含义
ERROR严重错误。用于记录系统的故障信息,且必须进行故障排除,否则系统不可用。
USER_ERROR用户输入导致的错误。
WARN警告。用于记录可能会出现的潜在错误。
INFO提示。用于记录系统运行的当前状态,该信息为正常信息。
TRACE与 INFO 相比更细致化地记录事件消息。
DEBUG调试信息。用于调试时更详细地了解系统运行状态,包括当前调用的函数名、参数、变量、函数调用返回值等。

2.1.2. 日志格式

日志数据格式如下,具体格式以实际情况为准。

  • [time] log_level [module_name] (file_name:fine_no) [thread_id][Y_trace_id0-trace_id1] [lt=last_log_print_time] [dc=dropped_log_count] log_data_
  • [time] log_level [module_name] function_name (file_name:fine_no) [thread_id][Y_trace_id0-trace_id1] [lt=last_log_print_time] [``dc=``dropped_log_count] log_data_
[admin@OceanBase000000000.sqa.ztt /home/admin/oceanbase/log] 
$tail -f -n 1 observer.log
[2016-07-17 14:18:04.845802] INFO  [RPC.OBMYSQL] obsm_handler.cpp:191 [9543][Y0-0] [lt=47] [dc=0] connection close(easy_connection_str(c)="192.168.0.2:56854_-1_0x7fb8a9171b68", version=0, sessid=2147562562, tenant_id=1, server_id=1, is_need_clear_sessid_=true, ret=0) 
[admin@OceanBase000000000.sqa.ztt /home/admin/oceanbase/log] 
$tail -f -n 1 observer.log.wf
[2016-07-17 14:18:28.431351] WARN  [SQL.SESSION] set_conn (ob_basic_session_info.cpp:2568) [8541][YB420AF4005E-52A8CF4E] [lt=16] [dc=0] debug for set_conn(conn=0x7fb8a9171b68, lbt()="0x4efe71 0x818afd 0xe9ea5b 0x721fc8 0x13747bc 0x2636db0 0x2637d68 0x5054e9 0x7fb98705aaa1 0x7fb9852cc93d ", magic_num_=324478056, sessid_=2147562617, version_=0) 
[admin@OceanBase000000000.sqa.ztt /home/admin/oceanbase/log] 
$tail -f -n 1 rootservice.log
[2016-07-17 14:18:53.701463] INFO  [RS] ob_server_table_operator.cpp:345 [8564][Y0-0] [lt=11] [dc=0] svr_status(svr_status="active", display_status=1) 
[admin@OceanBase000000000.sqa.ztt /home/admin/oceanbase/log] 
$tail -f -n 1 rootservice.log.wf
[2016-07-16 02:02:12.847602] WARN  [RS] choose_leader (ob_leader_coordinator.cpp:2067) [8570][YB420AF4005E-4626EDFC] [lt=8] [dc=0] choose leader info with not same candidate num(tenant_id=1005, server="192.168.0.1:2882", info={original_leader_count:0, primary_zone_count:0, cur_leader_count:1, candidate_count:1, in_normal_unit_count:1})

2.1.3. 日志诊断秘籍

关注日志信息,尤其是错误日志信息,根据OceanBase的日志模型建立日志收集告警机制。

2.1.4. 日志诊断例子

2.2. 性能视图分析

2.2.1. gv$sql_audit

OceanBase在SQL性能诊断方面有个很有用的功能叫SQL审计视图(OceanBase 4.0 版本以前是gv$sql_audit,OceanBase 4.0以后是gv$ob_sql_audit,下文均以为OB 4.0版本以前为例,不再做特别说明)。该视图可以方便开发运维排查在OceanBase运行过的任意一条SQL,不管这些SQL是成功还是失败,都有详细的运行信息记录。GV$SQL_AUDIT  的含义是查出每一台机器上的 SQL_AUDIT 记录,而 V$SQL_AUDIT 是查出连接的这台server的SQL_AUDIT 记录。如果是查询 V$SQL_AUDIT ,无法确定请求会被路由到哪一台机器上。所以如果想查询某一台机器上的SQL_AUDIT记录,一定要直连到要这台机器,或者查询 GV$SQL_AUDIT 然后通过指定机器的 IP 与端口号来访问具体机器的记录。详细的字段解释可以参阅官网文档。

几点注意事项:

  • SQL_AUDIT 是维护在内存中的,因此它的数据不可能无限地存放。所以当内存到达一定限制的时候,会触发一些淘汰机制,以保证新的记录能够写进去。SQL_AUDIT 采用先进先出的自动淘汰机制,内存到达高水位线(90%)的时候会自动触发淘汰,直至内存达到低水位线(50%)。
  • 除了基于内存水位线的淘汰,SQL_AUDIT 还有一个淘汰策略,当 SQL_AUDIT 的记录达到 900 万条的时候会触发淘汰,一直淘汰到记录剩 500 万条为止。
  • 此外,SQL_AUDIT 提供了一个集群级的配置项 enable_sql_audit 和一个租户级的配置项 ob_enable_sql_audit,只有这两个配置项都为 true 的时候,SQL_AUDIT 才会生效,否则为关闭状态。

2.2.2. 性能视图诊断案例

Case 1: 如何查看集群 SQL 的请求量是否均匀?

Action: 可以去查 SQL_AUDIT,找出某个时间段内所有执行的用户 SQL, 然后在 server IP 的维度上做聚合,最后求出每一个 server IP 的分组里面,此时间段内有多少 SQL ,就可以大概得出每一个 server 上的流量。

select/*+ parallel(15)*/t2.zone, t1.svr_ip,  count(*) as QPS, avg(t1.elapsed_time), avg(t1.queue_time)  
from oceanbase.gv$sql_audit t1, __all_server t2  
where t1.svr_ip = t2.svr_ip and IS_EXECUTOR_RPC = 0    
      and request_time > (time_to_usec(now()) - 1000000)    
      and request_time < time_to_usec(now())
group by t1.svr_ip  
order by t2.zone;

Case 2: 如何找到消耗 CPU 最多的 SQL 。

Action: 首先查出某一个时间段内所有执行的用户 SQL, 然后在 SQL_ID 维度上做聚合,求出每一个 SQL_ID 总的执行时间。这里的执行时间 = ELAPSED_TIME - QUEUE_TIME ,因为在队列里等待的时间并没有消耗 CPU ,实际消耗 CPU 的就是获取和执行计划的时间。最终可以基于这些消耗 CPU 最多的 SQL 做一些性能分析、性能调优之类的工作。

Case 3:如何分析 RT 突然抖动的 SQL 

Action:在此场景下,可以在抖动出现后立即将 SQL_AUDIT 关闭,保证产生抖动的 SQL 能够在 SQL_AUDIT 中使用 (g)v$sql_audit 进行问题排查方式如下:

  1. 在线上如果出现 RT 抖动,但 RT 并不是持续很高的情况,可以考虑在抖动出现后,立刻将 sql_audit 关闭 (alter system set ob_enable_sql_audit = 0),从而确保该抖动的 SQL 请求在 sql_audit 中存在。
  2. 通过 SQL Audit 查询抖动附近那段时间 RT 的 TOP N 请求,分析有异常的 SQL。
  3. 找到对应的 RT 异常请求,则可以分析该请求在 sql_audit 中的记录进行问题排查:
    • 查看 retry 次数是否很多(RETRY_CNT 字段),如果次数很多,则可能有锁冲突或切主等情况。
    • 查看 queue time 的值是否过大(QUEUE_TIME 字段)。
    • 查看获取执行计划时间(GET_PLAN_TIME 字段),如果时间很长,一般会出现 IS_HIT_PLAN = 0,表示没有命中 plan cache。
    • 查看 EXECUTE_TIME 的值,如果值过大,则可以通过以下步骤进行排查:

a. 查看是否有很长等待事件耗时。

b. 分析逻辑读次数是否异常多(突然有大账户时可能会出现)。

逻辑读次数 = 2 * ROW_CACHE_HIT 
           + 2 * BLOOM_FILTER_CACHE_HIT 
           + BLOCK_INDEX_CACHE_HIT 
           + BLOCK_CACHE_HIT + DISK_READS

如果在 SQL Audit 中 RT 抖动的请求数据已被淘汰,则需要查看 OBServer 中抖动时间点是否有慢查询的 trace 日志,并分析对应的 trace 日志。

3. 一个愿景

OceanBase是原生分布式数据库系统,故障根因分析通常是比较繁琐的,因为涉及的因素可能有很多,如机器环境、配置参数、运行负载等等。所以我们的愿景是:让诊断OceanBase变得更快更容易

4. 一个工具箱

4.1. 特性介绍

OceanBase是原生分布式数据库系统,故障根因分析通常是比较繁琐的,因为涉及的因素可能有很多,如机器环境、配置参数、运行负载等等。专家在排查问题的时候需要获取大量的信息来分析故障,如何高效的获取故障场景下分散在各个节点的信息,挖掘出其中的关联性便是OceanBase敏捷诊断工具(OceanBase Diagnostic Tool) ,简称obdiag。需要解决的问题。

obdiag定位为OceanBase敏捷诊断工具。整体使用上备以下的特点:

  • 部署简单:提供rpm包和OBD上部署的模式,均可一键部署安装,可以选择部署到任意一台能连接到集群各个节点的上,并不局限于OBServer节点。
  • 开箱即用:使用中所依赖的python包,全部都是自包含的,只需要部署机器存在python2或者python3环境即可;
  • 集中式收集:单点部署,无需每台服务器部署。使用的时候只需要在部署机器上执行收集或分析命令即可;

obdiag现有功能包含了对于OceanBase日志、SQL Audit以及OceanBase进程堆栈等信息进行的扫描、收集,可以在OceanBase集群不同的部署模式下(OCP,OBD或用户根据文档手工部署)实现一键执行。未来会加入诊断分析能力。一方面在现有采集能力的基础上增加有效信息提取分析的能力形成诊断分析报告;另一方面将已有的SQL Reviewer(OceanBase的SQL审核工具)和SQL Diagnoser(OceanBase的敏捷SQL诊断工具)进行整合,扩展工具在SQL层面的诊断能力。
obdiag-1.2.0版本支持以下功能:

  • 一键收集OB日志
  • 一键收集AWR报告
  • 一键收集主机信息
  • 一键收集OB堆栈信息
  • 一键收集(clog、slog解析后的日志)
  • 一键收集perf信息(扁鹊图、perf火焰图、pstack火焰图)
  • 一键收集并行SQL的执行详情信息
  • 一键收集OBPROXY的日志
    待解锁功能(敬请期待):
  • 集成SQL Reviewer/SQL Diagnoser能力,支持一键分析SQL问题。
  • 在诊断信息采集的基础上加入自主分析能力,支持生成诊断信息分析报告
  • 抽取OceanBase常见问题,形成快速诊断套餐

4.2. OBD模式下安装使用obdiag

如果你的OceanBase集群是通过OBD安装部署的,并且OBD的版本大于2.1.0那么,你可以直接通过下面的方式使用。

4.2.1. 安装

  1. 安装OBD 2.1.0 及以上版本
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
sudo yum install -y ob-deploy
source /etc/profile.d/obd.sh
  1. 安装obdiag工具

使用该命令可部署obdiag工具可在本机安装部署obdiag, (如果用户不安装直接使用也会走自动安装流程)

obd obdiag deploy

4.2.2. 使用

4.2.2.1. obd obdiag gather

使用该命令可调用obdiag工具进行OceanBase相关的诊断信息收集

obd obdiag gather <gather type> <deploy name> [options]

gather type包含:

  • log:一键收集所属OceanBase集群的日志 
  • sysstat:一键收集所属OceanBase集群主机信息 
  • clog:一键收集所属OceanBase集群(clog日志) 
  • slog:一键收集所属OceanBase集群(slog日志) 
  • plan_monitor:一键收集所属OceanBase集群指定trace_id的并行SQL的执行详情信息 
  • stack:一键收集所属OceanBase集群的堆栈信息 
  • perf:一键收集所属OceanBase集群的perf信息(扁鹊图、perf火焰图、pstack火焰图) 
  • obproxy_log:一键收集所属OceanBase集群所依赖的obproxy组件的日志 
  • all:一键统一收集所属OceanBase集群的诊断信息,包括收集OceanBase日志/主机信息/OceanBase堆栈信息/OceanBase clog、slog日志/OceanBase perf信息(扁鹊图、perf火焰图、pstack火焰图) 

4.3. 独立安装使用obdiag

4.3.1. obdiag下载

obdiag工具可从OceanBase官网下载免费下载,下载链接

1696865904

4.3.1. obdiag使用文档

  • 安装文档: OceanBase分布式数据库-海量数据 笔笔算数
  • 配置文档: OceanBase分布式数据库-海量数据 笔笔算数
  • 使用文档: OceanBase分布式数据库-海量数据 笔笔算数

5. 总结

当遇到OceanBase的问题时候,很多工程师可能会感到无从下手,本文介绍了一般情况下OceanBase的故障诊断路径,大家可通过环境分析、日志分析、性能视图分析来定位和分析问题。同时给大家推荐了一个很好用的OceanBase敏捷诊断工具(OceanBase Diagnostic Tool) ,简称obdiag,帮助大家方便的获取这些故障信息。

第一篇“神医”的修炼秘籍——《OceanBase诊断系列》之一
第二篇《OceanBase诊断系列》——带你认识sql_audit性能视图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/423780.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTTPS的实现原理

图片来源&#xff1a;HTTPS 详解一&#xff1a;附带最精美详尽的 HTTPS 原理图 - 个人文章 - SegmentFault 思否 加密流程按图中的序号分为&#xff1a; 客户端请求 HTTPS 网址&#xff0c;然后连接到 server 的 443 端口 (HTTPS 默认端口&#xff0c;类似于 HTTP 的80端口)。…

小程序和页面生命周期详解

目录 小程序的生命周期 创建&#xff08;onLoad&#xff09;&#xff1a; 显示&#xff08;onShow&#xff09;&#xff1a; 隐藏&#xff08;onHide&#xff09;&#xff1a; 卸载&#xff08;onUnload&#xff09;&#xff1a; 错误监听&#xff08;onError&#xff09;…

使用最新Hal库实现USART中断收发功能(STM32F4xx)

目录 概述 1 认识STM32F4XX的USART 1.1 USART 功能说明 1.2 USART的中断 1.3 USART 模式配置 1.4 USART的寄存器 2 使用STM32CubeMX 生成工程 2.1 配置参数 2.2 生成工程代码 3 实现软件功能 3.1 软件功能介绍 3.2 认识USART Hal库 3.2.1 初始化函数组 3.2.2 发送…

66-ES6:var,let,const,函数的声明方式,函数参数,剩余函数,延展操作符,严格模式

1.JavaScript语言的执行流程 编译阶段&#xff1a;构建执行函数&#xff1b;执行阶段&#xff1a;代码依次执行 2.代码块&#xff1a;{ } 3.变量声明方式var 有声明提升&#xff0c;允许重复声明&#xff0c;声明函数级作用域 访问&#xff1a;声明后访问都是正常的&…

殿堂级Flink源码极精课程预售

一、为什么我们要读源码? 1、让个人技术快速成长: 优秀的开源框架,底层的源码设计思想也非常优秀,同时还有含有大量的设计模式和并发编程技术&#xff0c;优秀的解决方案,熟读源码对猿们技术提升有很大帮助 2、新技术学习能力: Java开源码框架的源码熟读后&#xff0c;若出现…

挑战杯 基于机器视觉的车道线检测

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分…

Doris实战——银联商务实时数仓构建

目录 前言 一、应用场景 二、OLAP选型 三、实时数仓构建 四、实时数仓体系的建设与实践 4.1 数仓分层的合理规划 4.2 分桶分区策略的合理设置 4.3 多源数据迁移方案 4.4 全量与增量数据的同步 4.5 离线数据加工任务迁移 五、金融级数仓稳定性最佳实践 5.1 多租户资…

返回数据(返回视图所需要的数据)

在上篇文章中&#xff0c;小编带领大家了解到&#xff1a;返回静态数据-CSDN博客&#xff0c;但是&#xff0c;仅仅返回一个静态页面&#xff0c;对于静态页面的数据没正常返回&#xff01; 所以&#xff0c;本篇文章便讲述如何返回数据&#xff1f;&#xff1f; 还是先不管前…

AI大语言模型【成像光谱遥感技术】ChatGPT应用指南

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本文重点介绍ChatGPT在遥感中的应用&#xff0c;人工智能…

Revit-二开之创建墙-(6)

Revit API窗间墙 protected override Result OnExecute(ExternalCommandData commandData, ref string message, ElementSet elements) {try{// 获取当前活动的文档

html基础标签+Http请求

文章目录 目录 文章目录 前言 一.网址组成 二.HTTP协议解析 Http 请求报文 报文请求方法 报文头 Cache-Control 常见缓存控制行为 cookie 解析 Http 响应报文 常见状态码 三.域名解析(DNS) DNS域名服务器分类 递归查询 迭代查询 四.端口号 五.路径信息 六.Https协议 ​对称…

毫末智行开年融资,揭幕了自动驾驶最后的赛点

毫末智行日前官宣拿到的超亿元B1轮融资&#xff0c;在行业引起了不小的关注。 一方面是信心问题&#xff0c;自动驾驶从早期拼技术到去年拼量产落地&#xff0c;创业公司们的声量此消彼长&#xff0c;有人领先也有人掉队&#xff0c;但市场的态度都以谨慎为主&#xff0c;甚至…

Vue组件置底方法,ElementPlus布局

问题描述 在开发网页时使用了elementplus的el-container组件 组件里分成了main和footer两块&#xff0c;但是想要将两个按钮置底在容器底部遇到了困难 如下图所示&#xff0c;在网页开发者工具可见两个按钮与左侧的图片没有底部对齐 此时我的代码是这样 <el-footer>&…

存储型xss案例

一、环境 DWVA网上自己找 二、开始闯关 先随便写看看 看看源码&#xff0c;数据是被插入到数据库里面了&#xff0c;魔术开关关闭了 数据最后插入显示到index.php 看一下我们目前的cookie值是 看了源码之后也没进行过滤那么我们试着直接插&#xff0c;看是否过滤 之后用户每…

监控与日志

一、监控 1、监控类型 从监控类型上划分&#xff0c;在 K8s 中可以分成四个不同的类型&#xff1a; ① 资源监控&#xff1a;这种监控主要关注于基础资源的使用情况&#xff0c;例如 CPU、内存、网络等。通常使用数值或百分比等单位来统计&#xff0c;可以通过 Zabbix、Tele…

Android 显示系统框架

一.FrameBuffer FrameBuffer 介绍&#xff1a; FrameBuffer中文译名为帧缓冲驱动&#xff0c;它是出现在2.2.xx内核中的一种驱动程序接口。主设备号为29&#xff0c;次设备号递增。 Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。FrameBuffer机制模仿显卡的功能…

github用法详解

本文是一篇面向全体小白的文章,图文兼备。为了让小白们知道如何使用GitHub,我努力将本文写得通俗易懂,尽量让刚刚上网的小白也能明白。所以各位程序员们都可以滑走了~ 啥是GitHub? 百度百科会告诉你, GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git作为…

可以用来测试的接口

实际开发过程中&#xff0c;我们可以通过postman工具来测试接口 get请求 https://api.github.com/events?id1&nameuser post请求 http://httpbin.org/post 参数1&#xff1a;key1value1 参数2&#xff1a;key2value2

2023年NOC大赛软件创意编程(学而思)赛道图形化小高组复赛试题

目录 第一题 闪烁的星星 第二题 聚沙成塔 第三题 画十字

力扣刷题:100.相同的树

题目&#xff1a; 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff…