乐趣区

关于prometheus:oracledbexporter监控Oracle一个入侵性极低的监控方案

写在开篇

Oracle 怎么做监控?用 Zabbix?能够呀,但!本篇讲的内容是基于上次设计的 Prometheus 主备计划的根底上进行的,上篇的文章是《重磅!DIY 的 Prometheus 主备计划,全网惟一。生产未上,测试后行。》,顺便再附上该篇文章的链接:https://mp.weixin.qq.com/s?__…

计划阐明

本篇讲的是下图中的红色框局部

红色框局部,是 oracledb_exporter 的主备计划,联合上次的设计,这个图是残缺的监控架构了。

oracledb_exporter 的主备方案设计思路是跟 Prometheus 主备的设计思路大同小异的,架构不论如何设计,都是为了在生产环境上不要存在单点。

环境规划

用处 主备角色 物理 IP VIP 接管 VIP 地址
oracledb_exporter Master 192.168.11.20 接管 192.168.11.200
oracledb_exporter Backup 192.168.11.21 待接管 192.168.11.200

装置 keepalived

  1. 下载 keepalived

    wget https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
  2. 编译和装置

    mkdir -p /usr/local/keepalived
    tar -zxf keepalived-2.2.7.tar.gz
    cd keepalived-2.2.7
    ./configure --prefix=/usr/local/keepalived/ && make && make install
  3. 配置 master 和 backup 的 keepalived.conf

    配置非抢占模式

  4. master

    global_defs {router_id lb01}
    
    vrrp_instance VI_1 {
     state BACKUP
     interface ens32
     virtual_router_id 80
     priority 150
     nopreempt
     advert_int 1
     authentication {
         auth_type PASS
         auth_pass 1111
     }
     virtual_ipaddress {192.168.11.200/24 dev ens32 label ens32:1}
    }
  • backup

    global_defs {router_id lb02}
    
    vrrp_instance VI_1 {
      state BACKUP
      interface ens32
      virtual_router_id 80
      priority 100
      nopreempt
      advert_int 1
      authentication {
          auth_type PASS
          auth_pass 1111
      }
      virtual_ipaddress {192.168.11.200/24 dev ens32 label ens32:1}
    }
  • 启动 keepalived

    /usr/local/keepalived/sbin/keepalived -f /usr/local/keepalived/etc/keepalived/keepalived.conf

装置 Oracle Instant Client

oracledb_exporterer 连贯 oracle 数据库,需依赖 oracle client,因而也要提前下载好 oracle client。如果是 Oracle 19C 可用 21 版本的 Client,如果是 Oracle 11g 可用 18 版本的 Client,如果操作系统比拟新(如是 CentOS7 以上),则能够装 21,对于去连贯 Oracle 19C 还是 11g,其实是可向下兼容的。

笔者附上 Oracle Instant Client 的下载链接,如下:

  • https://www.oracle.com/databa…

留神:Master 和 Backup 两台主机都要装置 oracle client 哦!

将如下列出的包都下载后进行装置,也没啥非凡需要,为了不便后续通过 sqlplus 近程连贯 oracle 或者 java 程序连贯 oracle,全都装置吧!

rpm -ivh oracle-instantclient-basic-21.1.0.0.0-1.x86_64.rpm
rpm -ivh oracle-instantclient-devel-21.1.0.0.0-1.x86_64.rpm
rpm -ivh oracle-instantclient-jdbc-21.1.0.0.0-1.x86_64.rpm
rpm -ivh oracle-instantclient-odbc-21.1.0.0.0-1.x86_64.rpm
rpm -ivh oracle-instantclient-sqlplus-21.1.0.0.0-1.x86_64.rpm
rpm -ivh oracle-instantclient-tools-21.1.0.0.0-2.x86_64.rpm

JDBC 和 ODBC 都是 API(应用程序编程接口),它帮忙客户端的应用程序拜访服务器端的数据库,JDBC 示意 Java 数据库连贯,JDBC 是任何 Java 应用程序和不同数据库之间的标准接口,JDBC 的性能是帮忙基于 Java 的应用程序拜访不同类型的数据库。ODBC 是开放式数据库连贯,与 JDBC 一样,ODBC 也是一个 API,充当客户端应用程序和服务器端数据库之间的接口,为了不便,笔者把 JDBC 和 ODBC 都装置了。

部署 oracledb_exporter

留神:Master 和 Backup 两台主机都要部署 oracledb_exporter 哦!

  1. 下载

    wget https://github.com/iamseth/oracledb_exporter/releases/download/0.3.0rc1/oracledb_exporter.0.3.0rc1-ora18.5.linux-amd64.tar.gz
  2. 部署

    上传 oracledb_exporterer 二进制包到 oracle 数据库服务器后,再进行解压,并挪动到您布局好的目录,笔者的目录是在 /usr/local/exporter/oracledb_exporter

    tar -zxf oracledb_exporter.0.3.0rc1-ora18.5.linux-amd64.tar.gz 
    mv oracledb_exporter.0.3.0rc1-ora18.5.linux-amd64 /usr/local/exporter/oracledb_exporter

    笔者将 oracledb_exporter 部署在 /usr/local/exporter/oracledb_exporter 门路下,请您依据您本人的理论状况批改。

  3. 配置环境变量

在全局环境变量配置文件(/etc/profile)中,增加以下环境变量:

  • oracle 客户端相干变量

    export ORACLE_HOME=/usr/lib/oracle/21/client64
    export TNS_ADMIN=/usr/lib/oracle/21/client64
    export ORACLE_BASE=/usr/lib/oracle/21/client64
    export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$ORACLE_HOME/lib
    export PATH=$PATH:$ORACLE_HOME/bin
  • oracledb_exporter 相干变量

    export ORACLEDB_EXPORTER_EXEC_PATH=/usr/local/exporter/oracledb_exporter
    export PATH=$PATH:$ORACLEDB_EXPORTER_EXEC_PATH
  1. 执行 source 命令使其失效

    source /etc/profile
  2. 验证 oracledb_exporter 二进制执行程序是否在任何中央调用并且失常执行

    [root@exporter-server-master ~]# oracledb_exporter --version
    oracledb_exporter 0.3.0rc1
    [root@exporter-server-master ~]# oracledb_exporter --help
    usage: oracledb_exporter [<flags>]
    
    Flags:
      -h, --help                     Show context-sensitive help (also try --help-long and --help-man).
       --web.listen-address=":9161"  
                                  Address to listen on for web interface and telemetry. (env: LISTEN_ADDRESS)
       --web.telemetry-path="/metrics"  
                                  Path under which to expose metrics. (env: TELEMETRY_PATH)
       --default.metrics="default-metrics.toml"  
                                  File with default metrics in a TOML file. (env: DEFAULT_METRICS)
       --custom.metrics=""        File that may contain various custom metrics in a TOML file. (env: CUSTOM_METRICS)
       --query.timeout="5"        Query timeout (in seconds). (env: QUERY_TIMEOUT)
       --database.maxIdleConns=0  Number of maximum idle connections in the connection pool. (env: DATABASE_MAXIDLECONNS)
       --database.maxOpenConns=10  
                                  Number of maximum open connections in the connection pool. (env: DATABASE_MAXOPENCONNS)
       --log.level="info"         Only log messages with the given severity or above. Valid levels: [debug, info, warn, error, fatal]
       --log.format="logger:stderr"  
                                  Set the log target and format. Example: "logger:syslog?appname=bob&local=7" or "logger:stdout?json=true"
       --version                  Show application version.
    
    [root@exporter-server-master ~]# 

    显然能失常执行,very good!!!

业务目录的布局和标准

提醒:为确保数据安全,请在您的数据目录(数据盘目录)中进行布局,如笔者的数据目录是在 /data/,按业务维度,在 /data 目录下又布局了用于寄存各个业务的 oracle 数据库连贯配置以及日志信息等,如笔者的布局:/data/database_monitoring/business/

上面进行布局示例的演示,请严格参考,此演示是模仿一个业务作为示例进行布局演示,这个虚构的业务叫做 mail91,具体如下:

/data/ # 数据目录
/data/database_monitoring/ # 所有数据库监控的根目录
/data/database_monitoring/business/ # 所有业务的根目录
/data/database_monitoring/business/mail91/ # 具体某个业务的目录
/data/database_monitoring/business/mail91/oracle # 业务下的 oracle 数据库
/data/database_monitoring/business/mail91/oracle/logs # 记录采集日志的目录
/data/database_monitoring/business/mail91/oracle/custom_metrics # 自定义指标文件寄存的目录
/data/database_monitoring/business/mail91/oracle/default-metrics.toml # 默认的指标文件(肯定要存在)/data/database_monitoring/business/mail91/oracle/.env_var # 保留 DATA_SOURCE_NAME 变量的目录(留神后面的点,这是一个暗藏目录)

上述的示例布局中,在理论部署的时候,数据目录是可变的。可依据您的理论状况进行扭转数据目录,其它的目录请严格依照此标准。假如,该业务下还有 mysql,也可按同样的套路进行布局即可。

对于 default-metrics.toml 文件,这是默认的指标文件,当解压 oracledb_exporter.0.3.0rc1-ora18.5.linux-amd64.tar.gz 后,就会有这个文件,将其挪动到布局好的业务目录下即可。

创立数据库连贯的环境变量文件

在对应业务的 oracle 目录下,创立暗藏的“.env_var”目录,并创立连贯数据库信息的环境变量文件,文件的命名格局为:“. 采集端口_数据库 IP_PDB 名称”。留神,它也是一个暗藏的文件,最初执行 source 使其失效即可。

cd /data/database_monitoring/business/mail91/oracle
mkdir .env_var
cd .env_var/
echo "export DATA_SOURCE_NAME=tantianran2/abc123456@192.168.11.8:1521/PDB1_ZABBIX.DB" > .9161_192.168.11.8_PDB1_ZABBIX.DB
source .9161_192.168.11.8_PDB1_ZABBIX.DB

之所以要设置 DATA_SOURCE_NAME 环境变量,是因为 oracledb_exporter 会读取该变量的数据库连贯信息进行对数据库发动连贯。

采集默认指标

当把 oracledb_exporter 的二进制包解压到布局的目录后,其上面还蕴含了一个 default-metrics.toml 文件,这个是默认的指标配置文件。依据官网给出的数量,默认的指标共计有 25 个。如果没有额定的监控指标需要,当然能够应用默认的,启动时指定参数 –default.metrics=”default-metrics.toml” 就好。当然,默认的指标也是能够不必的。如果有自定义监控指标的需要,当然就应用自定义监控指标了,自定义监控指标在下章节进行解说。

  1. 将 default-metrics.toml 文件挪动到对应的业务目录下

    mv /usr/local/exporter/oracledb_exporter/default-metrics.toml /data/database_monitoring/business/mail91/oracle/

    有没有思考过一个问题,为啥要把 default-metrics.toml 文件挪动到自定业务目录下?因为 oracledb_exporter 启动的时候会主动找这个默认的指标文件呢,在后面的步骤中,咱们将 oracledb_exporter 的可执行程序门路退出到了全局环境变量,也就是在哪都能够调用到 oracledb_exporter,而不必指定绝对路径。那么,之前咱们也按业务的维度布局好了目录,每个业务就是一个目录,为了不便对不同业务的 oracle 监控指标进行治理,对 oracledb_exporter 的启停都在对应目录下进行,这样就能够做到业务独立,不影响其它业务。当初重点来了,在对应的业务目录下进行启停的时候,它会主动找默认的 default-metrics.toml 指标文件,如果找不到的话就会报错。

上面,咱们来验证一下,找不到 default-metrics.toml 的时候,是不是真的会报错。

[root@exporter-server-master oracle]# mv default-metrics.toml default-metrics.toml.bak
[root@exporter-server-master oracle]# oracledb_exporter --log.level warn --web.listen-address 0.0.0.0:9162 --custom.metrics ./custom_metrics/test.toml > ./logs/test_9161_192.168.11.8_PDB1_ZABBIX.DB.log
ERRO[0000] open default-metrics.toml: no such file or directory  source="main.go:512"
panic: Error while loading default-metrics.toml

goroutine 1 [running]:
main.reloadMetrics()
        /home/travis/gopath/src/github.com/iamseth/oracledb_exporter/main.go:513 +0x722
main.main()
        /home/travis/gopath/src/github.com/iamseth/oracledb_exporter/main.go:545 +0x19e

后果很显然,果然报错了。所以,在每个业务的目录下都要存在默认的 default-metrics.toml 指标文件。

  1. 启动 oracledb_exporter 进行采集默认指标

    创立一个启动脚本:“start.sh”

    #!/bin/sh
    nohup oracledb_exporter --log.level warn --web.listen-address=0.0.0.0:9161 --default.metrics ./default-metrics.toml > ./logs/9161_192.168.11.8_PDB1_ZABBIX.DB.log &

    留神:输入日志信息写入到文件,且日志的文件命名格局为:“采集端口_数据库 IP_PDB 名称.log”

执行启动脚本

sh start.sh

通过 web 浏览器拜访采集到的默认指标

依照之前的测试发现,其实基本不必显示指定 –default.metrics ./default-metrics.toml,它都会本人去找 default-metrics.toml 这个默认的指标配置文件。

那咱们测试看看,执行上面命令启动:

[root@exporter-server-master oracle]# oracledb_exporter --log.level warn --web.listen-address=:9161

用 web 浏览器拜访指标页面:http://192.168.11.20:9161/met…

事实证明果真如此,照样能够采集到默认的指标。

  1. 上面列出了 oracledb_exporter 自带的指标
指标名称 意义
oracledb_exporter_last_scrape_duration_seconds 最初一次抓取用时,单位:秒
oracledb_exporter_last_scrape_error 最初一次抓取谬误
oracledb_exporter_scrapes_total 抓取总数
oracledb_up 数据库运行状态
oracledb_activity_execute_count 流动执行计数
oracledb_activity_parse_count_total 流动解析总数
oracledb_activity_user_commits 流动用户提交数
oracledb_activity_user_rollbacks 流动用户回滚数
oracledb_sessions_activity 会话流动数
oracledb_wait_time_application 利用等待时间
oracledb_wait_time_commit 提交等待时间
oracledb_wait_time_concurrency 并发等待时间
oracledb_wait_time_configuration 配置等待时间
oracledb_wait_time_network 网络等待时间
oracledb_wait_time_other 其余等待时间
oracledb_wait_time_scheduler 调度器等待时间
oracledb_wait_time_system_io 零碎 io 等待时间
oracledb_wait_time_user_io 用户 io 等待时间
oracledb_tablespace_bytes 表空间大小,单位:字节
oracledb_tablespace_max_bytes 表空间最大字节数
oracledb_tablespace_free 残余表空间
oracledb_tablespace_used_percent 表空间应用百分比
oracledb_process_count 过程计数
oracledb_resource_current_utilization 资源以后利用率
oracledb_resource_limit_value 资源限度值

官网自定义监控指标测试

当 oracledb_exporter 自带的监控指标不能满足的需要的时候,就须要应用自定义的监控指标了。oracledb_exporter 是反对自定义监控指标的,说白了就是本人写 sql,oracledb_exporter 会帮你连贯到数据库上执行,而后失去后果。

  1. 在 github 上,官网有一个简略的例子,咱们先拿来本地测试测试,看看成果如何

在./custom_metrics 目录下创立 test.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."}
  1. 上面咱们本人亲自验证一下
    在布局好的业务目录下(/data/database_monitoring/business/mail91/oracle/)创立一个启动脚本 start.sh

    #!/bin/sh
    # 监控测试环境 oracle
    source .env_var/.9161_192.168.11.8_PDB1_ZABBIX.DB
    nohup oracledb_exporter --log.level warn --web.listen-address :9161 > ./logs/9161_192.168.11.8_PDB1_ZABBIX.DB.log &
    nohup oracledb_exporter --log.level warn --web.listen-address :9162 --custom.metrics ./custom_metrics/test.toml > ./logs/test_9161_192.168.11.8_PDB1_ZABBIX.DB.log &
  2. 下面的启动脚本中,oracledb_exporter 连贯的是同一个数据库,启动前且通过 source 命令使其 DATA_SOURCE_NAME 变量失效
  3. oracledb_exporter 监听的 9161 端口,拉取的是默认指标
  4. oracledb_exporter 监听的 9162 端口,拉取的是自定义指标

上面咱们通过浏览器均拜访 9161 和 9162 端口查看指标信息,做个比照

先看 9161 端口,拉取的是默认指标

再看 9162 端口,拉取的是自定义指标

特地阐明:通过比照,问题很显著了,获取自定义指标的同时,它也会获取主动获取默认的指标。

真的是这样吗?笔者又再一次产生了新的想法,对此产生了质疑,如果间接将参数 –default.metrics 指向 ./custom_metrics/test.toml,那是不是就会只采集自定义指标了?而不会采集默认指标啦?于是,笔者又做了一次测试

#!/bin/sh
# 监控测试环境 oracle
source .env_var/.9161_192.168.11.8_PDB1_ZABBIX.DB 

# nohup oracledb_exporter --log.level warn --web.listen-address :9161 > ./logs/9161_192.168.11.8_PDB1_ZABBIX.DB.log &

# nohup oracledb_exporter --log.level warn --web.listen-address :9162 --custom.metrics ./custom_metrics/test.toml > ./logs/test_9161_192.168.11.8_PDB1_ZABBIX.DB.log &

nohup oracledb_exporter --log.level warn --web.listen-address :9162 --default.metrics ./custom_metrics/test.toml > ./logs/test1_9161_192.168.11.8_PDB1_ZABBIX.DB.log &

笔者将前两条 oracledb_exporter 启动命令给正文了,只看最初一条启动命令,留神这里:–default.metrics ./custom_metrics/test.toml

启动后,成果如下:

答案很显著了,默认的指标还是会采集,自定义的指标也会采集。并没有像笔者揣测的那样:用 –default.metrics 指向自定义指标文件,是不是就会只采集自定义指标了?因而,通过实战测试,颠覆了笔者的质疑。所以,实际出真知啊!

写在最初

文章内容太长,笔者放心广大读者没有急躁看。本篇就到此为止吧!真是有点意犹未尽啊!那么,下一篇笔者会接着讲如下内容:

  1. oracledb_exporter 的备机拉取 master 配置
  2. 依据理论业务需要编写自定义监控指标,让其真正能够在生产上玩起来

好了!就此搁笔,望大家多多关注、点赞、珍藏、转发!

本文转载于:https://mp.weixin.qq.com/s/PD…

退出移动版