作者:昆仑银行 许中华
根据银保监、人行等五部门要求,商业银行需要逐步替代国外设备,采用信创服务器、信创操作系统、信创中间件、信创数据库进行替代,而信创服务器、信创操作系统、信创中间件、信创数据库的监控又是全新课题,本文将讨论如何将这些操作系统、数据库、中间件纳入监控。
2021 年 10 月 20 日,人民 银行 办公厅、中央网信办秘书局、工业和信息化部办公厅、银保监会办公厅、证监会办公厅联合发布《关于规范金融业开源技术应用与发展的意见》。《意见》指出: “ 探索自主开源生态,重点在操作系统、数据库、中间件等基础软件领域和云计算、大数据、人工智能、区块链等新兴技术领域加快生态建设,利用开源模式加速推动信息技术创新发展。
本次建设的服务器有海光、鲲鹏两种类型,海光使用的芯片架构为 X86 架构,鲲鹏使用的架构为 ARM 架构,操作系统均为银河麒麟 V10 ,数据库使用了达梦数据库, Web 中间件使用的是 TongWeb ,满足监管要求和保障系统安全稳定运行。
1 、目前我行大部分设备、软件、数据库均采用 IBM Tivoli 进行监控,但是信创设备、数据库 IBM Tivoli 不支持,我们将采用 Prometheus 作为信创设备监控系统,通过 AlertManager 、 SNMP_notifier 通过 SNMP Trap 协议跟集中监控平台实现告警集成。
2 、操作系统采用 OS exporter 进行数据采集。
3 、 TongWeb 采用 MID exporter 进行数据采集。
4 、达梦数据库采用 DB exporter 进行数据采集。
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:
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
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
"""
@Author:xuzhonghua
@File:dmdb-exporter.py
"""
import time
from prometheus_client import Counter, Gauge,start_http_server,Info
import dmPython
global debug
debug=0
for key in bb.keys():
if debug:
print(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")
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()
for i in aa:
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()
print('work done')
time.sleep(5)
3 、跟现有的集中监控平台集成
alertmanager.yml
receivers:
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
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:
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
信创的操作系统和中间件可以使用社区开源的 exporter 采集数据,在实施过程中比较顺利 , 但是达梦数据库的 exporter 需要自主研发,经过与我们的 DBA 以及达梦公司的专家沟通,最后确定指标对应的 SQL ,起初因某些原因参数或者公式不正确,数据也不准确,经过多次沟通、测试、完善后最终展示了准确的数据。另外,达梦数据库 V8 不是很成熟, RAC 模式下某个指标的两个实例采集的数据不一样,经过我们 DBA 和达梦厂商的优化,终于采集到准确的数据,目前运行正常。
此外监控告警如何与现有的集中监控平台集成也是一个棘手问题,经过研究、分析发现 alert manager 提供 SNMP_notifier 组件,通过 SNMP Trap 协议与现有的集中监控平台集成。
信创是国家战略、大势所趋,信创设备、软件将越来越多,监控也是需要持续关注的课题,我们将持续学习、研究信创设备、软件,不断纳入新的信创设备、软件、持续优化监控 , 实现监控无盲区 , 保障生产安全、稳定运行。
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞2
添加新评论0 条评论