第2篇,讲解oracledb_exporter监控Oracle,入侵性极低的监控方案
ccwgpt 2024-11-27 12:18 28 浏览 0 评论
写在开篇
基于上次的 oracledb_exporter监控Oracle,一个入侵性极低的监控方案 文章中,本篇继续讲解如下内容:
- 根据实际业务需求编写自定义监控指标,让其真正可以在生产上玩起来
- oracledb_exporter的备机拉取master配置
再次巩固下方案
本篇讲的是下图中的红色框部分
红色框部分,是oracledb_exporter的主备方案,结合上次的设计,这个图是完整的监控架构了。
oracledb_exporter的主备方案设计思路是跟Prometheus主备的设计思路大同小异的,架构不管如何设计,都是为了在生产环境上不要存在单点。
再次巩固笔者的环境规划
用途主备角色物理IPVIP接管VIP地址oracledb_exporterMaster192.168.11.20接管192.168.11.200oracledb_exporterBackup192.168.11.21待接管192.168.11.200
自定义指标的规范
- 什么是自定义指标
如果oracledb_exporter默认的监控指标没有你想要的,怎么办?非常简单!oracledb_exporter支持自定义指标,按照它的规范格式进行编写相应的指标,将自定义指标编写在文件格式以.toml结尾的配置文件里(指标文件),那oracledb_exporter如何使用这个自定义的指标文件?有两种方式,如下:
- 使用--custom.metrics参数,后面指定指标文件
- 设置全局或局部环境变量,如下:
export CUSTOM_METRICS=my-custom-metrics.toml
- 自定义指标文件格式和规范
编写自定义指标文件,必须按照它的规范进行编写,我们拿官方的小栗子来解释解释,解剖解剖,官方小栗子如下:
[[metric]]
context = "test"
request = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"
metricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }
根据上面的小栗子,可以知道,必须包含的元素有如下:
- 一个或多个指标,就需要一个或多个[[metric]]部分,也就是一个指标,就对应一个[[metric]]部分
- 对于每个[[metric]]部分,最起码要有下面的字段:
- context:指标名称(有意义的)
- request:编写自定义sql
- metricsdesc:对指标的描述
自定义指标实战
下面我们通过一个更贴合实际的案例来实战一下,假设要获取IOPS指标,这个指标是需要计算的。特别要注意,在编写自定义指标之前,一定要先把sql写好,且要调试好。
- 笔者写好的获取iops的sql如下:
select sum(decode(name,'physical read IO requests',value,'physical write IO requests',value,0)) as iops, sum(decode(name,'physical read bytes',value,'physical write bytes',value,0)) / 1024 / 1024 as mbps from v$sysstat where name in ('physical read IO requests','physical write IO requests','physical read bytes','physical read total bytes', 'physical write bytes','physical write total bytes','physical read total IO requests','physical write total IO requests');
- 通过plsql工具连接到oracle进行执行和调试,看看结果是否达到预期,效果如下:
完美!达到预期了,么么哒。
- 创建自定义指标文件”./custom_metrics/performance_metric.toml“编写如下:
[[metric]]
context = "reads_and_writes_per_second"
labels = ["iops"]
request = "select sum(decode(name,'physical read IO requests',value,'physical write IO requests',value,0)) as iops, sum(decode(name,'physical read bytes',value,'physical write bytes',value,0)) / 1024 / 1024 as mbps from v$sysstat where name in ('physical read IO requests','physical write IO requests','physical read bytes','physical read total bytes', 'physical write bytes','physical write total bytes','physical read total IO requests','physical write total IO requests')"
metricsdesc = { iops = "每秒进行读写操作的次数" }
- 启动oracledb_exporter
启动脚本如下:
#!/bin/sh
# 监控测试环境oracle
source .env_var/.9161_192.168.11.8_PDB1_ZABBIX.DB
nohup oracledb_exporter --log.level warn --web.listen-address :9161 --custom.metrics ./custom_metrics/performance_metric.toml >> ./logs/9161_192.168.11.8_PDB1_ZABBIX.DB.log &
开始启动:
[root@exporter-server-master oracle]# sh start.sh
效果如下图:
完美!一切都达到了预期!
关于指标的其它字段
在实际的应用中,可能还会使用到指标部分中的labels和ignorezeroresult字段,下面我们简单的了解下它们的使用场景。
- labels:顾名思义,这个是标签的意思,除了给指标取一个有意义的名字之外,其实还可以定义一些标签(当然如果有需要的话)下面是它的定义格式:
[[metric]]
...
labels = ["iops", "io", "io_performance"]
...
在刚才的案例中,就有使用到labels,同一个指标是可以定义多个标签的,逗号分隔即可。
- ignorezeroresult:这个字段又是什么鬼?这个字段用途是忽略为0的结果,假设你自定义的指标中,如果在某个时间获取到的值是0,但想要忽略它,那么就可以使用这个字段了。它的定义格式如下:
ignorezeroresult = true
当然,如果不显示指定的话,那就是默认不忽略为0的结果。
oracledb_exporter的主备配置
oracledb_exporter的slave服务器需要拉取master服务器的配置,当master的配置发生改变,就通知slave,然后slave再访问masetr进行拉取。其实这个原理和笔者在之前设计prometheus主备方案时的配置文件拉取的原理是一样的,而且脚本也可以改改就能复用了,下面我来配置一下。
master配置
按照我们之前的规划,所有数据库监控的根目录是在/data/database_monitoring/路径下,因此我们将下面的脚本放在此目录,并拉起。当slave来拉配置的时候,它访问的是8000端口(拉起后默认的端口),这样就可以将该目录下所有业务的指标文件进行同步了。
- 部署配置文件同步Api
创建startOracledbExporterConfSyncApi.sh
#!/bin/sh
nohup /usr/bin/python -m SimpleHTTPServer > /dev/null &
拉起脚本和检查
[root@exporter-server-master database_monitoring]# sh startOracledbExporterConfSyncApi.sh
[root@exporter-server-master database_monitoring]# netstat -tulnp | grep 8000
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 1462/python
- 部署配置文件变化时的检测脚本
注意:此脚本也要运行在/data/database_monitoring/路径下
创建startTarPackConf.sh
#!/bin/sh
time_log=`date "+%Y-%m-%d %H:%M:%S"`
echo "${time_log} 配置检查器启动"
task_wait_sec=4
find ./business -type f -print0 | xargs -0 md5sum > ./cfmd5/cfmd5.list
while true
do
time_bak=`date "+%Y%m%d%H%M%S"`
time_log=`date "+%Y-%m-%d %H:%M:%S"`
md5sum -c ./cfmd5/cfmd5.list > ./cfmd5/check_cfmd5.log
md5ret=`cat ./cfmd5/check_cfmd5.log | grep "FAILED" | wc -l`
while true
do
if [ ${md5ret} -gt 0 ]
then
echo "${time_log} 配置文件发生变化,触发打包动作。"
mv ./business.tar.gz ./backup/business.tar.gz_bak_${time_bak}
tar -zcf business.tar.gz business/
echo 1 > ./notice_slave.action
break
else
echo 0 > ./notice_slave.action
break
fi
done
find ./business -type f -print0 | xargs -0 md5sum > ./cfmd5/cfmd5.list
sleep ${task_wait_sec}
done
继续在该目录下创建检测脚本所需的目录
[root@exporter-server-master database_monitoring]# mkdir cfmd5
[root@exporter-server-master database_monitoring]# mkdir backup
[root@exporter-server-master database_monitoring]# mkdir logs
拉起脚本和检查
[root@exporter-server-master database_monitoring]# nohup sh ./startTarPackConf.sh >> ./logs/tar_pack.log &
[root@exporter-server-master database_monitoring]# ps -aux | grep Tar
root 1755 0.0 0.6 113292 1464 pts/0 S 19:40 0:00 sh ./startTarPackConf.sh
Backup配置
- 在数据目录下创建规范的目录
[root@exporter-server-backup ~]# mkdir -p /data/database_monitoring
[root@exporter-server-backup ~]# cd /data/database_monitoring/
[root@exporter-server-backup database_monitoring]#
- 部署拉取配置脚本
在该路径下创建定时拉取配置脚本startUpdateSyncConf.sh
#!/bin/sh
time_log=`date "+%Y-%m-%d %H:%M:%S"`
echo "${time_log} 配置更新器启动"
pull_wait_sec=2
while true
do
wget http://192.168.11.20:8000/notice_slave.action -O notice_slave.action > /dev/null 2>&1
status=`cat ./notice_slave.action`
if [ ${status} -eq 1 ]
then
time_bak=`date "+%Y%m%d%H%M%S"`
time_log=`date "+%Y-%m-%d %H:%M:%S"`
echo "${time_log} 从master下载配置压缩包文件"
wget http://192.168.11.20:8000/business.tar.gz -O business.tar.gz
echo "${time_log} 备份原有的配置目录"
mv ./business ./backup/business_bak_${time_bak}
echo "${time_log} 解压下载后的配置压缩包"
tar -zxf business.tar.gz
fi
sleep ${pull_wait_sec}
done
创建脚本所需的目录
[root@exporter-server-backup database_monitoring]# mkdir backup
[root@exporter-server-backup database_monitoring]# mkdir logs
拉起脚本和检查
nohup sh startUpdateSyncConf.sh > ./logs/update_sync.log &
配置同步验证
- 在master上修改配置文件
笔者打开之前配置好的配置文件,修改了context内容,在后面增加了test,变为:”reads_and_writes_per_second_test“
[[metric]]
context = "reads_and_writes_per_second_test"
labels = ["iops"]
request = "select sum(decode(name,'physical read IO requests',value,'physical write IO requests',value,0)) as iops, sum(decode(name,'physical read bytes',value,'physical write bytes',value,0)) / 1024 / 1024 as mbps from v$sysstat where name in ('physical read IO requests','physical write IO requests','physical read bytes','physical read total bytes', 'physical write bytes','physical write total bytes','physical read total IO requests','physical write total IO requests')"
metricsdesc = { iops = "每秒进行读写操作的次数" }
- 在backup上面查看是否有触发拉取
修改了配置文件后,笔者马上登录backup查看了一下,成功和master保持同步。
- 把backup的oracledb_exporter也拉起来后看看效果
- master
- backup
非常完美!都是OK的呢,都能正常采集监控指标。但需要注意:在正式生产使用时,仅需拉起master的oracledb_exporter,backup的oracledb_exporter不用拉起,当master挂了,VIP会漂移到backup进行接管。这时候可以去backup上手动拉起oracledb_exporter,也可以再编写脚本实现自动拉起,笔者就不做演示了哈!
写在最后
到此为止,oracledb_exporter主备方案的规划和部署就全都讲完了,欢迎广大盆友可以按笔者的方案实践实践,并给出更好的方案,我们共同学习和进步。再次感谢大家!望多多关注我们,转发、收藏、点赞!
本文转载于:https://mp.weixin.qq.com/s/gFeWlZRGkIMAOCNFpKm8-Q
相关推荐
- 一个基于.Net Core遵循Clean Architecture原则开源架构
-
今天给大家推荐一个遵循CleanArchitecture原则开源架构。项目简介这是基于Asp.netCore6开发的,遵循CleanArchitecture原则,可以高效、快速地构建基于Ra...
- AI写代码翻车无数次,我发现只要提前做好这3步,bug立减80%
-
写十万行全是bug之后终于找到方法了开发"提示词管理助手"新版本那会儿,我差点被bug整崩溃。刚开始两周,全靠AI改代码架构,结果十万行程序漏洞百出。本来以为AI说没问题就稳了,结果...
- OneCode低代码平台的事件驱动设计:架构解析与实践
-
引言:低代码平台的事件驱动范式在现代软件开发中,事件驱动架构(EDA)已成为构建灵活、松耦合系统的核心范式。OneCode低代码平台通过创新性的注解驱动设计,将事件驱动理念深度融入平台架构,实现了业务...
- 国内大厂AI插件评测:根据UI图生成Vue前端代码
-
在IDEA中安装大厂的AI插件,打开ruoyi增强项目:yudao-ui-admin-vue31.CodeBuddy插件登录腾讯的CodeBuddy后,大模型选择deepseek-v3,输入提示语:...
- AI+低代码技术揭秘(二):核心架构
-
本文档介绍了为VTJ低代码平台提供支持的基本架构组件,包括Engine编排层、Provider服务系统、数据模型和代码生成管道。有关UI组件库和widget系统的信息,请参阅UI...
- GitDiagram用AI把代码库变成可视化架构图
-
这是一个名为gitdiagram的开源工具,可将GitHub仓库实时转换为交互式架构图,帮助开发者快速理解代码结构。核心功能一键可视化:替换GitHubURL中的"hub...
- 30天自制操作系统:第六天:代码架构整理与中断处理
-
1.拆开bootpack.c文件。根据设计模式将对应的功能封装成独立的文件。2.初始化pic:pic(可编程中断控制器):在设计上,cpu单独只能处理一个中断。而pic是将8个中断信号集合成一个中断...
- AI写代码越帮越忙?2025年研究揭露惊人真相
-
近年来,AI工具如雨后春笋般涌现,许多人开始幻想程序员的未来就是“对着AI说几句话”,就能轻松写出完美的代码。然而,2025年的一项最新研究却颠覆了这一期待,揭示了一个令人意外的结果。研究邀请了16位...
- 一键理解开源项目:两个自动生成GitHub代码架构图与说明书工具
-
一、GitDiagram可以一键生成github代码仓库的架构图如果想要可视化github开源项目:https://github.com/luler/reflex_ai_fast,也可以直接把域名替换...
- 5分钟掌握 c# 网络通讯架构及代码示例
-
以下是C#网络通讯架构的核心要点及代码示例,按协议类型分类整理:一、TCP协议(可靠连接)1.同步通信//服务器端usingSystem.Net.Sockets;usingTcpListene...
- 从复杂到优雅:用建造者和责任链重塑代码架构
-
引用设计模式是软件开发中的重要工具,它为解决常见问题提供了标准化的解决方案,提高了代码的可维护性和可扩展性,提升了开发效率,促进了团队协作,提高了软件质量,并帮助开发者更好地适应需求变化。通过学习和应...
- 低代码开发当道,我还需要学习LangChain这些框架吗?| IT杂谈
-
专注LLM深度应用,关注我不迷路前两天有位兄弟问了个问题:当然我很能理解这位朋友的担忧:期望效率最大化,时间用在刀刃上,“不要重新发明轮子”嘛。铺天盖地的AI信息轰炸与概念炒作,很容易让人浮躁与迷茫。...
- 框架设计并不是简单粗暴地写代码,而是要先弄清逻辑
-
3.框架设计3.框架设计本节我们要开发一个UI框架,底层以白鹭引擎为例。框架设计的第一步并不是直接撸代码,而是先想清楚设计思想,抽象。一个一个的UI窗口是独立的吗?不是的,...
- 大佬用 Avalonia 框架开发的 C# 代码 IDE
-
AvalonStudioAvalonStudio是一个开源的跨平台的开发编辑器(IDE),AvalonStudio的目标是成为一个功能齐全,并且可以让开发者快速使用的IDE,提高开发的生产力。A...
- 轻量级框架Lagent 仅需20行代码即可构建自己的智能代理
-
站长之家(ChinaZ.com)8月30日消息:Lagent是一个专注于基于LLM模型的代理开发的轻量级框架。它的设计旨在简化和提高这种模型下代理的开发效率。LLM模型是一种强大的工具,可以...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- mfc框架 (52)
- abb框架断路器 (48)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- tornado框架 (48)
- 前端框架bootstrap (54)
- orm框架有哪些 (51)
- 知识框架图 (52)
- ppt框架 (55)
- 框架图模板 (59)
- 内联框架 (52)
- cad怎么画框架 (58)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)