jason2006xu
作者jason2006xu2022-02-21 16:35
技术经理, 昆仑银行

信创服务器、中间件、数据库监控方案设计与实现

字数 6186阅读 1390评论 0赞 2

作者:昆仑银行 许中华

1 、背景

根据银保监、人行等五部门要求,商业银行需要逐步替代国外设备,采用信创服务器、信创操作系统、信创中间件、信创数据库进行替代,而信创服务器、信创操作系统、信创中间件、信创数据库的监控又是全新课题,本文将讨论如何将这些操作系统、数据库、中间件纳入监控。

2 、需求分析

2021 年 10 月 20 日,人民 银行 办公厅、中央网信办秘书局、工业和信息化部办公厅、银保监会办公厅、证监会办公厅联合发布《关于规范金融业开源技术应用与发展的意见》。《意见》指出: “ 探索自主开源生态,重点在操作系统、数据库、中间件等基础软件领域和云计算、大数据、人工智能、区块链等新兴技术领域加快生态建设,利用开源模式加速推动信息技术创新发展。

本次建设的服务器有海光、鲲鹏两种类型,海光使用的芯片架构为 X86 架构,鲲鹏使用的架构为 ARM 架构,操作系统均为银河麒麟 V10 ,数据库使用了达梦数据库, Web 中间件使用的是 TongWeb ,满足监管要求和保障系统安全稳定运行。

3 、解决方案

3.1 总体思路及架构设计


1 、目前我行大部分设备、软件、数据库均采用 IBM Tivoli 进行监控,但是信创设备、数据库 IBM Tivoli 不支持,我们将采用 Prometheus 作为信创设备监控系统,通过 AlertManager 、 SNMP_notifier 通过 SNMP Trap 协议跟集中监控平台实现告警集成。

2 、操作系统采用 OS exporter 进行数据采集。

3 、 TongWeb 采用 MID exporter 进行数据采集。

4 、达梦数据库采用 DB exporter 进行数据采集。

3.2 操作系统监控设计与实现

1、 监控指标

CPU 、内存、磁盘使用率、分区使用率、系统平均负载、网络流量、磁盘读写速率、温度

2、 方案

1、 采用 Prometheus expoter 作为采集代理

AMD 架构使用的采集代理为 node_exporter-1.3.1.linux-amd64

ARM 架构使用的采集代理为 node_exporter-1.3.1.linux-arm64

2、 操作系统监控数据展现如下 :


3、 告警 rules

4、 跟集中监控平台集成

通过 alertmanager 与集中监控平台集成, alertmanager.yml 需要修改以下配置

alertmanager.yml

receivers:

  • name: 'snmp_notifier'

webhook_configs:

send_resolved: true

同时运行 snmp_notifier ,运行参数如下

./snmp_notifier --web.listen-address=:9464 --alert.severity-label=severity --alert.severities=5,4,3,2,1 --alert.default-severity=5 --snmp.destination=X.X.X.:162 --snmp.retries=3 --snmp.trap-oid-label=oid --snmp.trap-default-oid=1.3.6.1.4.1.1664.2 --snmp.trap-description-template=description-template.tpl --log.level=info --log.format=logger:stderr

3.3 数据库监控设计与实现

1、 达梦数据库监控指标包括状态、内存使用情况、表空间、 TPS 、会话信息、 DML 信息等

A、 数据库状态

select * from v$dsc_ep_info;

B、 数据库内存使用情况

(select sum(n_pages * (page_size/1024))/1024 from v$bufferpool)+(select sum(total_size)/1024/1024 from v$mem_pool)||'MB' as TOTAL_SIZE,

((select sum(n_pages (page_size/1024))/1024 from v$bufferpool)+(selectsum(total_size)/1024/1024 from v$mem_pool))/512000100||'%' as USED_SIZE

from dual;

C、 表空间

SELECT F.TABLESPACE_NAME,

(T.TOTAL_SPACE - F.FREE_SPACE) "USED (MB)",

F.FREE_SPACE "FREE (MB)",

T.TOTAL_SPACE "TOTAL(MB)",

(ROUND((1 - F.FREE_SPACE / T.TOTAL_SPACE) * 100))||'% ' PER_USED

FROM (SELECT TABLESPACE_NAME,

ROUND(SUM(BLOCKS *

(SELECT PARA_VALUE / 1024

FROM V$DM_INI

WHERE PARA_NAME = 'GLOBAL_PAGE_SIZE') / 1024))

FREE_SPACE FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F, (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES /1048576))

TOTAL_SPACE FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME) T WHERE F.TABLESPACE_NAME = T.TABLESPACE_NAME;

D 、 TPS (每秒事务数)

E 、会话信息( active , inactive , maxsession , idle session )

F 、 DML 信息( select , insert , update , delete )

G 、 DB load 信息( db time cpu time,io 响应时间)

2、 通过定制开发达梦数据库的 exporter 进行监控

1、 定制开发达梦的 exporter

dmdb-exporter.py

!usr/bin/env python

-- coding:utf-8 _-

"""

@Author:xuzhonghua

@File:dmdb-exporter.py

Prometheus

http://localhost:9090/

grafana

http://127.0.0.1:3000/

dmdb exporter:

http://127.0.0.1:8000/

"""

import time

from prometheus_client import Counter, Gauge,start_http_server,Info

import dmPython

global debug

debug=0

遍历字典中的每一个 key

for key in bb.keys():

if debug:

print(key)

print(bb[key]-aa[key])

loadstat.labels(type=key,DBINFO=dbtype).set(bb[key]-aa[key])

print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "*get_load_stat is done")

g.labels(hostip=host_ip).set(cup_use_percent) # 本机 IP 传入 labels , CPU 使用率传入 value

def get_tbs_stat():

dm_conn = dmPython.connect(user=user_name, password=passwd, server=server_name, port=server_port)

dm_cursor = dm_conn.cursor()

try:

dm_cursor.execute(sql_tbs)

except Exception as e:

print(' dm_cursor.execute(...) Error: ', e)

aa = dm_cursor.fetchall()

dm_cursor.close()

dm_conn.close()

print (aa)

for i in aa:

print(i[0])

print(i[1])

print(i)

tbs.labels(i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],dbtype)

print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),"*get_tbs_stat is done")

if name == '__main__':

start_http_server(8000) # 8000 端口启动

print(dmdb_exporter_copyrights)

while True:

get_session_stat()

get_dml_stat()

get_load_stat()

get_tps_stat()

get_tbs_stat()

get_base_stat()

print('work done')

自定义性能指标采集循环周期,默认 5 秒

time.sleep(5)

2 、达梦数据库监控数据展现如下:




3 、告警 rule

3 、跟现有的集中监控平台集成

alertmanager.yml

receivers:

  • name: 'snmp_notifier'

webhook_configs:

send_resolved: true

./snmp_notifier --web.listen-address=:9464 --alert.severity-label=severity --alert.severities=5,4,3,2,1 --alert.default-severity=5 --snmp.destination=x.x.x.x:162 --snmp.retries=3 --snmp.trap-oid-label=oid --snmp.trap-default-oid=1.3.6.1.4.1.1664.2 --snmp.trap-description-template=description-template.tpl --log.level=info --log.format=logger:stderr

3.4 中间件监控设计与实现

1、 监控指标

jvm_memory_pool_bytes_max{ pool="Code Cache"} 、 jvm_memory_pool_bytes_max{ pool="Compressed Class Space"} 、 jvm_memory_pool_bytes_max{ pool="Metaspace"} 、 jvm_memory_pool_bytes_max{ pool="PS Eden Space"} 、 jvm_memory_pool_bytes_max{ pool="PS Old Gen"} 、 jvm_memory_pool_bytes_max{ pool="PS Survivor Space"} 、 jvm_buffer_pool_used_bytes{ pool="direct"} 、 jvm_buffer_pool_used_bytes{ pool="mapped"} 、 jvm_gc_collection_seconds_count{gc="PS MarkSweep"} 、 jvm_gc_collection_seconds_count{gc="PS Scavenge"} 、 jvm_gc_collection_seconds_sum{gc="PS MarkSweep"} 、 jvm_gc_collection_seconds_sum{gc="PS Scavenge"} 、进程、端口、日志、 URL 监控

2、 方案

   2.1、 采集

JVM 监控采用 JVM 的 exporter ,进程、端口、日志、 URL 监控可以通过 Python 定制开发实现。

  2.2、 展示



  2.3、 告警 rules 编写

  2.4、 跟现有的集中监控平台集成,修改 alertmanager 配置如下

alertmanager.yml

receivers:

  • name: 'snmp_notifier'

webhook_configs:

send_resolved: true

./snmp_notifier --web.listen-address=:9464 --alert.severity-label=severity --alert.severities=5,4,3,2,1 --alert.default-severity=5 --snmp.destination=x.x.x.x:162 --snmp.retries=3 --snmp.trap-oid-label=oid --snmp.trap-default-oid=1.3.6.1.4.1.1664.2 --snmp.trap-description-template=description-template.tpl --log.level=info --log.format=logger:stderr

4 、总结及展望

信创的操作系统和中间件可以使用社区开源的 exporter 采集数据,在实施过程中比较顺利 , 但是达梦数据库的 exporter 需要自主研发,经过与我们的 DBA 以及达梦公司的专家沟通,最后确定指标对应的 SQL ,起初因某些原因参数或者公式不正确,数据也不准确,经过多次沟通、测试、完善后最终展示了准确的数据。另外,达梦数据库 V8 不是很成熟, RAC 模式下某个指标的两个实例采集的数据不一样,经过我们 DBA 和达梦厂商的优化,终于采集到准确的数据,目前运行正常。

此外监控告警如何与现有的集中监控平台集成也是一个棘手问题,经过研究、分析发现 alert manager 提供 SNMP_notifier 组件,通过 SNMP Trap 协议与现有的集中监控平台集成。

信创是国家战略、大势所趋,信创设备、软件将越来越多,监控也是需要持续关注的课题,我们将持续学习、研究信创设备、软件,不断纳入新的信创设备、软件、持续优化监控 , 实现监控无盲区 , 保障生产安全、稳定运行。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论0 条评论

Ctrl+Enter 发表

本文隶属于专栏

最佳实践
不同的领域,都有先行者,实践者,用他们的最佳实践来加速更多企业的建设项目落地。

作者其他文章

相关文章

相关问题

相关资料