防患未然,OceanBase巡检工具应用实践——《OceanBase诊断系列》之五
1. OceanBase为什么要做巡检功能
尽管OceanBase拥有很好的MySQL兼容性,但在长期的生产环境中,部署不符合标准规范、硬件支持异常,或配置项错误等问题,这些短期不会出现的问题,仍会对数据库集群构成潜在的巨大风险。为了解决这类挑战,OceanBase诊断工具增加了巡检子功能,该功能能够结合过去解决问题的经验,对OceanBase集群进行全面的健康检查,并对存在的或潜在的问题进行提前预警。我们必须防患于未然!
2. 怎么做巡检
已经知道了为什么做,怎么去实现巡检的能力?这是个很现实的工程落地问题,考虑到诊断工具本身就是开源项目,OceanBase社区的同学们也很热情,我们也希望大家可以参与进来,因此设定了两个需求条件:
- 高可扩展,要给用户更高的参与自由度;
- 高兼容性,可以适配OceanBase的多个版本;
- 便捷使用,尽可能少的输入参数
设计的巡检功能架构如下:
用户首先需要完成前置的集群配置(在搭配OBD/OCP使用的时候可以更为便捷),以获取到需要进行巡检的集群信息。然后执行巡检即可,obdiag会根据预设的巡检项目对集群进行检查。从用户的角度看,在完成巡检后会输出对应的巡检报告到指定的路径,若都为pass,那就代表目前未发现存在预设隐患的问题,集群还是相对健康的。
3. 怎么使用巡检功能
使用巡检功能的前提是需要一套正在运行的OceanBase集群(单机/集群均可,也可复用obd/ocp所部署的集群)。
3.1. 独立通过obdiag进行使用
3.1.1. 下载&安装&升级obdiag
注:需确认obdiag 1.4版本以上才支持巡检功能
3.1.1.1. 官网下载安装
进入OceanBase分布式数据库-海量数据 笔笔算数 ,根据用户使用的平台选择对应的RPM包
sudo rpm -ivh oceanbase-diagnostic-tool-XXXX.rpm
source /usr/local/oceanbase-diagnostic-tool/init.sh
3.1.1.2. RPM obdiag升级
请注意:升级后配置文件将会被重置,需要重新配置/usr/local/oceanbase-diagnostic-tool/conf/config.yml
sudo rpm -Uvh oceanbase-diagnostic-tool-XXXX.rpm
source /usr/local/oceanbase-diagnostic-tool/init.sh
3.1.1.3. yum源安装
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
sudo yum install -y oceanbase-diagnostic-tool
source /usr/local/oceanbase-diagnostic-tool/init.sh
3.1.2. 配置obdiag
注:
一下配置详解以最新版本的obdiag(1.5.0)进行描述。
配置文件示例位于~/.obdiag/example/
all-components.yaml # 全量检测示例
docker_ob_cluster.yml # 安装于docker的observer示例
ob_cluster.yml # 仅检测observer的示例
obproxy.yml # 仅检测obproxy的示例
本文选择全量检测示例作为示例
cd ~/.obdiag/
cp ./example/all-components.yaml ./config.yml
vim ~/.obdiag/config.yml
主要需要自行更改的就是OBCLUSTER和NODES,OBCLUSTER是集群的信息,NODES是部署集群所在节点的登录信息,由于需要进行远程执行信息采集(obdiag本身为离线工具,采集的信息不会进行上传)所以需要进行相关的信息配置。
ocp:login:url: http://192.168.1.100:8080user: adminpassword: admin
obcluster:ob_cluster_name: testdb_host: 192.168.1.1db_port: 2881 # default 2881tenant_sys:user: root@sys # default root@syspassword: ""servers:nodes:- ip: 192.168.1.1- ip: 192.168.1.2- ip: 192.168.1.3global:ssh_username: admin # your usernamessh_password: admin # password if need# ssh_port: 22 # your ssh port, default 22# ssh_key_file: "" # your ssh-key file path if need# ssh_type: remote # ssh_type choice [remote, docker, kube] default remote# container_name: xxx # container_name for ssh_type is docker# The directory for oceanbase installedhome_path: /root/observer# The directory for data storage. The default value is $home_path/store.# data_dir: /root/observer/store # The directory for clog, ilog, and slog. The default value is the same as the data_dir value.# redo_dir: /root/observer/store
obproxy:obproxy_cluster_name: obproxyservers:nodes:- ip: 192.168.1.4- ip: 192.168.1.5- ip: 192.168.1.6global:ssh_username: admin # your usernamessh_password: admin # password if need# ssh_port: 22 # your ssh port, default 22# ssh_key_file: "" # your ssh-key file path if need# ssh_type: remote # ssh_type choice [remote, docker, kube] default remote# container_name: xxx # container_name for ssh_type is docker# The directory for obproxy installedhome_path: /root/obproxy
3.1.3. 运行巡检项目
接下来可以对OceanBase集群进行巡检了
obdiag check
在某些时候,可以巡检特定的巡检项目,以避免由于查询动作对集群增加负担
obdiag check --cases=XXXX
这里的XXXX是位于配置文件中${CHECK.package_file}中的套餐名,套餐本身是一个list会维护在指定情况下执行的巡检项目集合。这个套餐支持自定义用户可以自行修改。
注:由于task的灵活性,我们将会在代码仓库中不定时更新和优化巡检项及巡检套餐,用户可以自行在仓库下载${code}/check_package.yaml和${code}/handler/checker/tasks,分别覆盖本地的~/.obdiag/check_package.yaml和~/.obdiag/tasks
# 更新脚本如下,需要有连接外网权限
# 用于更新tasks
curl https://codeload.github.com/oceanbase/oceanbase-diagnostic-tool/tar.gz/master | tar -xz -C ~/.obdiag/ --strip=3 oceanbase-diagnostic-tool-master/handler/checker/tasks
# 用于更新套餐包信息,注意这个更新会覆盖原有的套餐文件,原文件会被转移至 ~/.obdiag/check_package.yaml.old
cp ~/.obdiag/check_package.yaml ~/.obdiag/check_package.yaml.old && curl https://codeload.github.com/oceanbase/oceanbase-diagnostic-tool/tar.gz/master | tar -xz -C ~/.obdiag/ --strip=1 oceanbase-diagnostic-tool-master/check_package.yaml
3.1.4. 获取&查看巡检报告
在完成巡检后会输出一个cat命令,复制执行即可获取对应的体检报告啦
3.2. 通过obd进行调度使用
注:
obd2.4.0版本开始支持obdiag1.4版本;
预计obd2.5.0版本开始支持obdiag1.5版本。
详见obdiag&obd的release note。
3.2.1. obd中部署obdiag插件
参考3.1.1下载obdiag,并在obd加载obdiag插件
# obd加载obdiag插件
obd mirror clone oceanbase-diagnostic-tool-XXXX.rpm
obd obdiag deploy
3.2.2. obd obdiag执行巡检
与独立通过obdiag使用不同,在obd中使用需要额外加上deploy_name作为集群指定
obd obdiag check ${deploy_cluster_name}#指定巡检集
obd obdiag check ${deploy_cluster_name}
obd obdiag巡检报告查看与独立使用时一样使用cat进行查看
3.2.3. 独立通过obdiag使用与obd obdiag使用不同点
3.2.3.1. 巡检套餐文件${package_file}文件不同
package_file(保存巡检套餐的文件)强制为obdiag插件安装路径下的/check_package.yaml。例如
~/.obd/repository/oceanbase-diagnostic-tool/1.4.0/8d4b6d8ca87d7843b5508f388206a6c41aa93834/oceanbase-diagnostic-tool/check_package.yaml
3.2.3.2. 巡检项目文件基础路径${tasks_base_path}不同
tasks_base_path(保存巡检项的基础路径)强制为obdiag插件安装路径下的/handler/checker/tasks/。例如
~/.obd/repository/oceanbase-diagnostic-tool/1.4.0/8d4b6d8ca87d7843b5508f388206a6c41aa93834/oceanbase-diagnostic-tool//handler/checker/tasks/
4. 怎么自定义巡检项
在实际生成过程中,用户可能需要有自定义巡检的需求,比如运行下部署observer所在节点某个运维工具,采集些节点网络信息等等。巡检功能为了满足用户的不同程度的自定义开放了巡检项目自定义扩展和step_type扩展。
4.1. 巡检项目自定义(编写task)
巡检项目自定义指用户可以自定义需要巡检的流程、验证、验证后需要执行的措施。这个扩展不需要修改obdiag的代码,仅需要编写一个yaml文件即可实现。
4.1.1. 开始编写前
编写前需要确定我们的这个yaml需要放在哪
可以先进入conf.yml文件中设置CHECK.tasks_base_path所标识的目录里(使用obd进行操作时,此路径为~.obdiag/task),看下分析下编写的巡检场景是否属于已有的大类,若没有就创建一个文件夹用于声明这个大类
例:
#先进入${CHECK.tasks_base_path} ,然后创建一个文件夹test,并创建我们的示例文件test.yaml
cd ./handler/check/tasks/
mkdir test
cd test
touch test.yaml
以上便完成了编写前的步骤
4.1.2. 开始编写
开始编写就是开始编辑我们的test.yaml
# 首先需要声明下这个场景的作用,为了让大家看得懂info: "for test"
简单的内容已经结束,开始复杂的编写,注意细节
4.1.2.1. task编写
task的作用是声明巡检执行的步骤,其基础结构是一个list
为什么task是一个list?
- 是为了兼容不同版本可能导致的步骤的出入、或者压根这个巡检项目没法有
task的一个元素的结构如下
参数名 | 是否必填 | |||
version | 否 | 表示适用的版本,使用方式见下示例 | 用str的形式表示范围,需要完整的数字的版本号,3.x版本为三位,4.x版本为四位如:[3.1.1,3.2.0] | |
steps | 是 | 所执行步骤 | 为list结构 |
如下就是一个示例
info: testinfo
task:- version: "[3.1.0,3.2.4]"steps:{steps_object}- version: [4.2.0.0,4.3.0.0]steps:{steps_object}
steps又是一个list,用来表示具体的多个执行流程
steps的一个元素的结构即单个流程,如下
参数名 | 是否必填 | |
type | 是 | 表示适用的执行类型,目前支持get_system_parameter/ssh/sql,后续会持续增加支持的类型 |
{ssh/sql} | 是 | 根据所选的类型提供的参数,这块比较依赖代码里的对执行类型的逻辑说明,本章节后续会对支持的进行类型进行详细的使用说明 |
result | 否 | 结构为一个单独的对象,用于对这个步骤结束后需要进行的操作进行解析,如校验结果逻辑,逻辑不通过时需要报错的文本信息进行说明等等。具体本章节后续会进行详细说明 |
各种类型示例如下,"step:" 仅为一个标记,无实际作用
4.1.2.1.1. get_system_parameter
step:type: get_system_parameterparameter_name: parameterresult:set_value: servervm.max_map_count
4.1.2.1.2. ssh
远程执行指令并获取对应的返回值
step:type: sshssh: wc -l /proc/${task_OBServer_pid}/maps | awk '{print $1}'result:set_value: observerMaps
4.1.2.1.3. sql
执行sql并获取对应的值
step:type: sqlsql: select tenant_name from oceanbase.__all_tenant from where tenant_id=${taskTenantId};result:set_value: tenant_name
4.1.3. result&verify编写
result是对step结果的处理,同时这个字段也是verify功能的主要依赖字段,用于对task获取结果的验证
参数名 | 是否必填 | ||
set_value | 否 | 将执行后的值赋值,作为一个适用于整个task的变量 | 例如set_value: max_map_count |
verify_type | 否 | 默认为base,一般需要和verify联动 | 用于设置验证的方式,base即为通过verify的表达式进行验证,true或false,同时提供了以下常见的判断类型,减少编写量 |
verify | 否 | 服务于verify_type | 用于验证执行结果是否符合预期,若不符合,会输出errMsg部分的信息。 |
report_type | 否 | 用于设置本步骤若出现verify为false需要执行的告警级别 | 默认告警级别为critical。另外还有其他告警级别如下:warning:会进行报警,但是不会中断本task;execution: 等效warning,但是若执行通过将不会再执行后续步骤 |
err_msg | 否 | 用于非正常执行时答应的日志,支持配置全局变量 | 在verify为false的时候所输出的msg建议配置了verify,就一定要配上err_msg |
目前verify_type支持的类型,除了base外的类型仅适用于int类型。
between:判断set_value的值是否在verify提供的范围内;cd usr/local/oceanbase-diagnostic-tool && sh init.sh && source ~/.bashrc
max:是否小于verify提供的值
min:是否大于min提供的值
equal:是否等于verify(兼容字符串或int,但是${set_value}和verify必须是同类型)
base:verify表达式会用于替换如下shell式子中的new_expr内进行执行验证,在编写verify时可以手动在本地进行逻辑验证
if ${new_expr}; thenecho "true"
elseecho "false"
fi
以上编写的教程基本就结束了,具体的示例可以看下${obdiag源码路径}/handler/check/tasks/里的示例
4.2. step_type扩展(未完待续)
step_type扩展指当前的step_type无法满足巡检流程操作的时候可以由用户自定义实现一个全新的step_type来实现一个自定义的功能。这个扩展涉及obdiag源码的修改,参与度较高,后续将单独出一个博客进行讲解
第一篇 | 如何修炼成“神医”——《OceanBase诊断系列》之一 |
第二篇 | 走进SQL审计视图——《OceanBase诊断系列》之二 |
第三篇 | 快速收集诊断信息,敏捷诊断工具obdiag应用实践——《OceanBase诊断系列》之三 |
第四篇 | 如何快速分析OB集群日志,敏捷诊断工具obdiag分析能力实践——《OceanBase诊断系列》之四 |
第五篇 | 专为OceanBase打造的巡检工具已推出!给OceanBase进行一次体检吧——《OceanBase诊断系列》之五 |
相关文章:

防患未然,OceanBase巡检工具应用实践——《OceanBase诊断系列》之五
1. OceanBase为什么要做巡检功能 尽管OceanBase拥有很好的MySQL兼容性,但在长期的生产环境中,部署不符合标准规范、硬件支持异常,或配置项错误等问题,这些短期不会出现的问题,仍会对数据库集群构成潜在的巨大风险。为…...

数据结构从入门到精通——队列
队列 前言一、队列1.1队列的概念及结构1.2队列的实现1.3队列的实现1.4扩展 二、队列面试题三、队列的具体实现代码Queue.hQueue.ctest.c队列的初始化队列的销毁入队列出队列返回队头元素返回队尾元素检测队列是否为空检测元素个数 前言 队列是一种特殊的线性数据结构ÿ…...

深度学习相关概念及术语总结
目录 1.CNN2.RNN3.LSTM4.NLP5.CV6.正向传播7.反向传播8.sigmoid 函数9.ReLU函数10.假设函数11.损失函数12.代价函数 1.CNN CNN 是卷积神经网络(Convolutional Neural Network)的缩写。卷积神经网络是一种深度学习模型,专门用于处理具有网格状…...

uniapp发行H5获取当前页面query
阅读uni的文档大致可得通过 onLoad与 onShow()的形参都能获取页面传递的参数,例如在开发时鼠标移动到方法上可以看到此方法的简短介绍 实际这里说的是打开当前页面的参数,在小程序端的时候测试并无问题,但是发行到H5时首页加载会造成参数获取…...
Flutter中动画的实现
动画三要素 控制动画的三要素:Animation、Tween、和AnmaitionController Animation: 产生的值的序列,有CurveAnimation等子类,, 可以将值赋值给Widget的宽高或其他属性,进而控制widget发生变化 Tween&#…...

Elasticsearch从入门到精通-03基本语法学习
Elasticsearch从入门到精通-03基本语法学习 👏作者简介:大家好,我是程序员行走的鱼 📖 本篇主要介绍和大家一块学习一下ES基本语法,主要包括索引管理、文档管理、映射管理等内容 1.1 了解Restful ES对数据进行增、删、改、查是以…...

【黑马程序员】STL实战--演讲比赛管理系统
文章目录 演讲比赛管理系统需求说明比赛规则程序功能 创建管理类功能描述创建演讲比赛管理类 菜单功能添加菜单成员函数声明菜单成员函数实现菜单功能测试 退出功能添加退出功能声明退出成员函数实现退出功能测试 演讲比赛功能功能分析创建选手类比赛成员属性添加初始化属性创建…...

一文帮助快速入门Django
文章目录 创建django项目应用app配置pycharm虚拟环境打包依赖 路由传统路由include路由分发namenamespace 视图中间件orm关系对象映射操作表数据库配置model常见字段及参数orm基本操作 cookie和sessiondemo类视图 创建django项目 指定版本安装django:pip install dj…...

基于springboot实现图书推荐系统项目【项目源码+论文说明】计算机毕业设计
基于springboot实现图书馆推荐系统演示 摘要 时代的变化速度实在超出人类的所料,21世纪,计算机已经发展到各行各业,各个地区,它的载体媒介-计算机,大众称之为的电脑,是一种特高速的科学仪器,比…...

微信小程序实现上拉加载更多
一、前情提要 微信小程序中实现上拉加载更多,其实就是pc端项目的分页。使用的是scroll-view,scroll-view详情在微信开发文档/开发/组件/视图容器中。每次上拉,就是在原有数据基础上,拼接/合并上本次上拉请求得到的数据。这里采用…...

计算机网络——概述
计算机网络——概述 计算机网络的定义互连网(internet)互联网(Internet)互联网基础结构发展的三个阶段第一个阶段——APPANET第二阶段——商业化和三级架构第三阶段——全球范围多层次的ISP结构 ISP的作用终端互联网的组成边缘部分…...
kafka Interceptors and Listeners
Interceptors ProducerInterceptor https://www.cnblogs.com/huxi2b/p/7072447.html Producer拦截器(interceptor)是个相当新的功能,它和consumer端interceptor是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制逻辑。 对于producer而言&…...
【面试题】mysql常见面试题及答案总结
事务中的ACID原则是什么? Mysql是如何实现或者保障ACID的? ACID原则是数据库事务管理中必须满足的四个基本属性,确保了数据库事务的可靠性和数据完整性。 简写全称解释实现A原子性(Atomicity)一个事务被视为一个不可分割的操作序列&#…...
C++ 类的前向声明的用法
我们知道C的类应当是先定义,然后使用。但在处理相对复杂的问题、考虑类的组合时,很可能遇到俩个类相互引用的情况,这种情况称为循环依赖。 例如: class A { public:void f(B b);//以B类对象b为形参的成员函数//这里编译错位&…...

二分查找(c语言)
二分查找 一.什么是二分查找二.代码实现 一.什么是二分查找 在⼀个升序的数组中查找制定的数字n,很容易想到的⽅法就是遍历数组,但是这种⽅法效率⽐较低, ⽐如我买了⼀双鞋,你好奇问我多少钱,我说不超过300元。你还是好…...
【记录31】elementUI el-tree 虚线、右键、拖拽
父组件 <eltree :treeData"treeData"></eltree>import eltree from "../../components/tree.vue"; export default {name: ,components: { // org_tree ,eltree},watch: {},data() {return {orgFormchoose: {},orgForm: { type: 0, limits: 1…...

【C++】函数重载
🦄个人主页:修修修也 🎏所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 📌函数重载的定义 📌函数重载的三种类型 🎏参数个数不同 🎏参数类型不同 🎏参数类型顺序不同 📌重载…...
【深度学习模型】6_3 语言模型数据集
注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 6.3 语言模型数据集(周杰伦专辑歌词) 本节将介绍如何预处理一个语言模型数据集,并将其转换成字符级…...

技术选型思考:分库分表和分布式DB(TiDB/OceanBase) 的权衡与抉择
码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 在当今数据爆炸的时代,数据库作为存储和管理数据的核心组件,其性能和扩展性成为了企业关注的重点。随着业…...

React改变数据【案例】
State传统方式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>React Demo</title> <!--…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...