摘要:该文对开源的天兔(Lepus)数据库监控系统进行深入分析,理清了系统功能各模块的MVC架构设计。在此基础上,修改了针对主机操作系统、mongodb数据库监控的代码,按照现有架构设计思路,在企业需求基础上全新开发存储区域网络SAN交换设备的监控与告警功能,同时,利用开源hMailServer构建与本系统配套的邮件发送服务,完善了企业内网环境告警邮件发送机制。
关键词:数据库监控 CodeIgniter Lepus SNMP SAN hMail
中图分类号:TP311.5 文献标识码:A 文章编号:1672-3791(2021)09(c)-0000-00
Development Practice of Enterprise Database Monitoring System
LIU Junjun
(CHN Energy Zhunneng Group Co., Ltd., Information Center,Ordos,Inner Mongolia Autonomous Region,010300 China)
Abstract: This paper deeply analyzes the open source Lepus database monitoring system, and clarifies the MVC architecture design of the system function. On this basis, the code for monitoring the host OS and mongodb database is modified. According to the existing architecture design ideas, the monitoring and alarm functions of SAN switch equipment in storage area network are newly developed on the basis of enterprise requirements. At the same time, with the open source hmailserver used to build the mail sending system, we improved the alarm sending mechanism of enterprise intranet environment.
Key Words: Database monitoring; CodeIgniter; Lepus; SNMP; SAN; HMail
企业信息化建设发展经历了从传统的每个信息系统一套独立底层基础硬件到如今统一底层平台,共享统一虚拟平台或云平台的架构。同时企业数据分布也在不断变化,从最初各个信息系统各自独立式建设,每个系统一个后台数据库,各系统的后台数据呈现孤岛式分布,到企业对各系统数据统一仓库式存放,并对来自不同信息系统数据综合分析利用,再到统一数据平台建设。数据库的监控维护工作伴随着企业信息化发展各个阶段。企业在未建成统一数据平台阶段,需要一套数据库监控系统来帮助运维人员掌握企业核心数据库及底层主机、存储、SAN网络的运行状态,以便在故障发生时,可快速定位故障以恢复业务。
1 Lepus的架构
天兔Lepus是开源的企业数据库监控系统,其主要功能、软件结构、数据采集方式、可扩展性这个几个方面的内容已在笔者另一论文[1]阐述。此文将详细阐述Lepus的设计架构,并做新的功能开发。从整体看,Lepus数据库监控系统的软件设计分两部分:前端web展示、后端监控数据采集与告警管理(简称作业调度)。
1.1 Web前端展示
1.1.1 目录结构
Lepus的Web前端使用PHP框架CodeIgniter[2]设计开发。CodeIgniter简称CI,是一种基于MVC[3]模型的应用框架,具有开源免费、轻量级、速度非常快、基于段的URL的特性。分段式URL对于人类是友好的,如example.com/index.php/classA/functionA/ID表示调用控制器类classA的functionA函数并传入参数ID(ID字段可选)。同时CI提供自定义路由控制功能,用户可在application/config/routes.php文件中配置路由规则自定义特定URI的处理类和函数。CI框架提供丰富的参考类库,类库位于system/libraries目录,如常用的form_validation表单验证类。基于CI框架的web编码中,控制器类函数通过使用模型类的方法从后端数据库查得数据,后将数据传递给控制器对应视图将数据按照视图定义显示出来,完成用户点击事件驱动下的MVC流程(见图1)。
Lepus的web应用程序主要目录分布为:模型类在application\models目录下,视图页面在application\views目录下,控制器类在application\controllers目录下,php文件名同类名(控制器类、模型类)一致,视图php文件与加载该视图的类名称一致。
1.1.2 Web登录与仪表盘
登录逻輯由控制器login类定义,当打开登录URL时控制器类login加载视图目录下的login.php呈现登录页面,点击页面登录按钮提交用户登录信息时控制器login类中index函数对用户登录信息核验,先验证用户输入信息有效性,利用CI框架工具类form_validation相关函数对用户和密码两个域验证,验证通过后调用模型user_model类的check_user函数获得后台MySQL库中合法用户的信息来验证登录信息,为进一步提高安全性,用户密码在后台MySQL库lepus中的admin_user表中使用了md5密文方式存储,验证成功跳转至base_url,即控制器index类的index函数所加载的视图页。控制器index类的index函数加载模型lepus_model类,将后台lepus数据库db_status表中监控对象状态信息显示至视图页application\views\index\index.php。登录中用户输入信息的核验和用户密码的md5密文存储可有效防御SQL注入攻击[4]和用户密码的泄露威胁,提升系统安全性。
登录后呈现给用户五部分功能:仪表盘、配置中心、监控内容、告警面板、用户权限。因用户在页面点击各功能模块时将驱动对应模块控制器类加载相应视图页,因此需理清各功能模块MVC类及加载视图页面定义。下面简要介绍各功能MVC类定义及视图页面定义情况。仪表盘功能在用户登录成功后或已登录用户点击仪表盘菜单时被加载,其MVC类及视图页的定义与用户验证成功后的页面跳转相同。
1.1.3 配置中心
配置中心含两类功能,一是全局配置,另一是各类监控对象的配置。监控对象分类指mysql、Oracle、mongodb、sqlserver、redis、OS这些类型对象。全局配置功能包括各类监控对象监控开关、监控频率、告警配置、邮件/短信告警配置。全局配置实现由settings控制器类加载视图settings\index.php页面,其间加载模型option_model类,所有全局配置信息保存至lepus数据库的options表。监控对象配置功能实现各类监控对象添加、编辑、删除至回收站以及回收站中对象管理各功能。以Oracle监控对象为例,管理Oracle监控对象的功能实现通过控制器类servers_oracle加载views\servers_oracle目录下页面实现,如添加Oracle类监控对象则加载add.php页面,编辑监控对象加载edit.php页面,依此类推,控制器类中加载模型类servers_oracle_model将所有Oracle类监控对象配置信息保存至lepus数据库db_servers_oracle表,期间加载位于system/libraries的工具库form_validation类验证用户提交信息的有效性。其他类监控对象配置功能实现与此类似:用XXX代表监控对象,对应的控制器类为servers_XXX,视图页面在views\servers_XXX目录下,加载的模型类为servers_XXX_model,最终配置信息存储在表db_servers_XXX中。各类监控对象不同仅在监控模型存在差异。
1.1.4 监控对象状态展示
如对于MySQL有健康监控、资源监控、键缓存监控、InnoDB监控、复制监控、表空间分析、慢查询分析、AWR报告共7项内容,对于Oracle监控仅有健康监控、表空間监控这2项内容,监控模型差异就体现在这里。以Oracle监控展示为例,健康监控功能由模型类lp_oracle的index函数加载views\oracle\index.php实现,此页面每个监控目标添加了一个超链接,链接页面绘制了健康信息图,即加入时间维度信息以展示过去一段时间监控目标的状态曲线,健康信息图由模型类lp_oracle的chart函数加载views\oracle\chart.php页面实现,表空间监控功能是由模型类lp_oracle的tablespace函数加载views\oracle\tablespace.php页实现,lp_oracle类加载oracle_model类、os_model类、option_model类、servers_oracle_model类来从lepus数据库的options表、db_servers_oracle表中查询得到用户之前对于监控目标的配置选项,并以此为依据将oracle_status表、oracle_status_history表、oracle_tablespace表、oracle_tablespace_history表中的信息展示在所加载的视图页。其他监控对象状态展示与此类似:XXX对象的YYY功能(除健康监控功能)由模型类lp_XXX的YYY函数加载views\XXX\YYY.php实现,XXX对象健康监控功能由index函数加载index.php页面实现。
1.1.5 历史告警展示功能
历史告警展示即为告警面板模块告警事件列表功能。告警事件列表是由控制器类alarm的index函数加载views\alarm\index.php页面实现,由于告警信息较多时需要分页显示,因此加载CI工具库pagination类来对告警信息按照每页显示30条的设置分多页显示,需展示的历史告警存于lepus数据库的alarm_history表,需加载模型类alarm_model取出需展示的告警数据展示于各分页中。
1.1.6 用户权限维护
Lepus默认定义了4种角色:Administrator、IT-DBA、IT-Developer、guest_group。基于角色可定义不同角色用户,系统默认有admin、guest两用户,分属Administrator、guest_group角色。权限分配针对角色,通过规定是否可访问菜单项实现权限分配,Administrator角色拥有全部权限的定义及分配权。用户权限模块有用户管理、角色管理、授权管理、菜单管理、权限节点共5项功能,对应控制器类分别为user、role、auth、menu、privilege,加载模型类为user_model、role_model、auth_model、menu_model、privilege_model,数据库访问涉及admin_user表、admin_role表、admin_role_privilege表、admin_menu表、admin_privilege表。admin用户可通过访问授权管理、菜单管理、权限节点三菜单来开发新的菜单。
1.1.7 语言支持
Lepus支持简体中文、英文两种语言。CI框架支持用户自定义多种语言支持,用户定义的语言文件存放在application\language目录下,zh-hans目录存放简体中文语言文件,english目录存放英文语言文件。语言文件中关联数组$lang存放页面字符串元素的特定语言字符串。在定义新菜单时,需同时在不同种语言文件中分别增加新菜单的语言定义字符串才能在页面上正常显示出菜单内容。
1.2 后端作业调度
1.2.1 后端作业主程序
Lepus后端任务有数据采集作业、告警作业两类。在后端作业执行环境安装后,数据采集、告警作业各功能模块位于程序目录/usr/local/lepus下。后端各类作业程序启动通过执行shell脚本/usr/local/lepus/lepus实现,脚本根据程序当前运行情况启动主程序lepus.py。主程序使用多进程设计,每种数据采集、告警作业任务创建一独立进程。数据采集、告警进程在一个无限循环中反复执行,执行完一次数据采集任务,则根据配置选项中采集频率要求休眠一段时间。如前所述,前端Web展示部分已做好Lepus选项配置,配置信息存儲于lepus数据库的options表,此处,后端数据采集程序将根据options表已有信息来执行各数据采集、告警产生与发送等作业。
1.2.2 数据采集作业
主程序lepus.py启动一项数据采集作业是通过执行程序目录下对应作业的python程序实现。启动XXX类监控目标的数据采集作业则发出python check_XXX.py指令,例如Oracle类目标数据采集作业启动时会发出python check_oracle.py指令。以Oracle类目标数据采集作业为例,作业主进程P0先将当前各个监控目标的状态数据从当前状态表oracle_status、oracle_tablespace转存到历史状态表oracle_status_history、oracle_tablespace_history,同时删除两当前状态表中数据,后从db_servers_oracle表获得监控目标信息,依次为该类型各监控目标创建一独立子进程来执行状态数据采集作业,假设有n个监控目标,则依次创建P1、P2、...、Pi、...、Pn子进程,使用列表plist=[P1、P2、...、Pi、...、Pn]管理各子进程。在Pi子进程中:针对目标i,先尝试连接目标数据库,若连接失败,则在oracle_status表中插入一条监控目标连接状态为0的数据,若连接成功,则获取监控目标信息插入db_status表(已有目标信息时跳过此步骤),后通过与监控目标数据库连接获得database_status、uptime、version、session_total等信息,在oracle_status表中插入一条附带上述信息且连接状态为1的数据,接下来获得监控目标数据库表空间信息,如表空间名字、最大可用空间、使用率等信息存入lepus库oracle_tablespace表,最后关闭数据库连接。作业主进程P0等待所有子进程执行完毕后,按照option表中frequency_monitor的值休眠若干秒后进入下轮循环。
1.2.3 告警作业
告警作业根据监控目标当前状态完成告警信息的生成、存储、发送,与数据采集作业类似,由后端作业主程序通过python alarm.py指令启动。在监控程序后台lepus数据库内,与告警相关的表有3个,分别是alarm_temp、alarm与alarm_history,设计3张表是为了实现配置告警发送休眠时间的功能,即可配置当异常发生时,告警在发送了所配置的特定次数后将休眠特定时间,而非反复发送同类型告警,待休眠时间过去再发送、再休眠,如此往复。alarm_temp表存放当前告警休眠周期内的告警信息摘要,alarm表存放新产生的还没有发送通知邮件或短信的告警信息,alarm_history表存放历史告警信息。以Oracle类监控目标为例,在Oracle类目标的一个告警作业循环周期内,首先检查alarm_temp表中告警在当前时间是否已陈旧并删除陈旧告警信息,后根据oracle_status表中监控目标状态信息及db_servers_oracle表中告警配置信息判断并生成告警,对每个监控目标逐一进行判断,若目标的连接状态异常,先检查alarm_temp表中alarm_type字段不为none的数据条目数来决定是否将此次产生告警信息通过邮件或短信进行发送,具体为通过在信息中将自动send_mail设为1或0来实现,并且将产生的告警信息加入alarm_temp与alarm表,接着更新db_status表中监控目标的连接状态信息,若目标的连接状态正常,则先检查alarm_temp表并删除其中所有关于监控目标连接状态异常的告警信息,若删除了一条及以上告警,则说明监控目标刚从连接异常的状态中恢复,于是将一条监控目标正常的告警信息加入alarm表,之后检查数据库的其他告警点,如总会话数、活动会话数、等待会话数,当这些状态值超出所配置的critical、warning告警阈值,则生成一条告警信息加入alarm_temp与alarm表,执行类似上述的告警发送与否的判断过程并更新db_status表监控目标状态信息,紧接着检查监控目标表空间状态并生成告警加入到alarm_temp与alarm表,完成上述准备工作进入到告警邮件或短信的发送过程。告警发送前要将告警信息逐条从alarm表取出,检查全局告警发送开关与每条告警的send_mail标记,按照配置信息表所配邮件/短信协议信息,编辑告警信息发送,最后将alarm表中告警全部转移到alarm_history表,再将alarm表清空。
1.3功能修改与开发
1.3.1 OS监控功能修改
OS监控目标无法连接时,主机健康监控页面会出现多行同一监控目标状态信息,通过对OS监控后端作业代码的分析,发现问题出在向os_status表插入目标新状态前没有将之前状态数据先行删除,针对问题修改,在check_os.sh中增加相应语句可排除问题。
1.3.2 mongodb监控功能修改
笔者企业mongodb所用版本为3.2.7,直接使用Lepus对生产环境mongodb目标监控出错。按照Lepus官方所述安装pymongo2.7模块会因认证模式问题无法连接mongodb,需根据服务器环境python版本选择兼容版本的pymongo,笔者综合考虑python、mongodb、pymongo三者版本的兼容性,选择pymongo3.3,经测试可成功实现mongodb类监控目标的认证连接。通过对目标数据库运行状态数据分析,将代码中利用repl['secondary']判断mongodb实例主从地位的代码改为使用repl['ismaster']判断,同时将mappedWithJournal状态数据查询代码去除。通过以上改动,成功利用Lepus对生产环境mongodb目标的监控。
1.3.3 SAN交换机监控功能开发
企业现有SAN[5]设备为博科fabric产品,日常管理中维护人员比较关注设备在线情况、设备端口的光功率情况,因此需设计两个功能页面,一个页面展示所有设备的在线/离线状态,另一页面以表格形式展示在线设备的接口光功率信息。需要在前端Web、后端作业分别添加对应功能模块。前端Web部分,首先要在Web端用户权限的菜单管理模块添加配置SAN监控目标、查看SAN监控目标在线状态、查看SAN监控目标接口光功率等功能的菜单、实现功能的URL(对应MVC框架的控制器类、函数),在权限节点模块定义权限,在授权管理模块将定义权限分配给具体用户,然后在application\language\zh-hans与english目录中的语言文件中添加菜单对应的语言字符串定义。配置SAN类型监控目标需新建servers_san控制器类、servers_san_model模型类、views\servers_san\index.php等页面,在lepus数据库创建db_servers_san表存放目标配置信息。查看SAN监控目标在线状态及接口光功需新建lp_san控制器类、san_model模型類、views\san\index.php与optical_power.php两个页面,在lepus数据库中创建san_status、san_status_history、san_int_opti_power、san_int_opti_power_history四张表存放监控目标的当前/历史状态、接口光功率的当前/历史值。后端作业部分需要实现SAN监控目标的检查作业模块check_san.py,将检查中采集到的数据填入lepus数据库的对应状态表,SAN检查作业通过SNMP协议获得设备状态值,需要先在SAN交换机端配置只读团体字。再将检查作业加入到后端作业主程序,最后在告警管理作业中加入SAN监控目标告警信息生成模块,以便在目标离线、光功率降至临界值以下时向管理员发送告警邮件或短信。
1.3.4 内网邮件告警的实现
为实现监控告警的及时发送,需要在内网环境配置SMTP服务。选择内网中有权访问互联网的服务器,安装hMailServer[6],建立test.com域,在域内创建lepus@test.com账户,通过此账户,可方便地将Lepus告警及时送达管理员的外网邮箱,对于启用垃圾邮件过滤功能的公网邮箱,可将发送邮件告警的账户加入到白名单中。
2 结语
Lepus数据库监控系统有望成为各类新监控功能的孵化平台。通过上述分析总结与开发完善工作,可帮助企业建立真正掌握在自己手中的独立高效、易于维护的基础设施监控平台。
参考文献
[1]刘军军.基于Lepus企业数据库监控系统研究与应用[J].电脑编程技巧与维护,2021(8):95-96,134.
[2]童莹萍.基于Codeigniter的面向对象程序设计网络教学平台设计与研究[J].工业控制计算机,2017,30(12):35-36.
[3]陈帅.基于MVC的NOSS+报表管理系统的设计与实现[D].长春:吉林大学,2020.
[4]孔平凡.Web应用常见安全漏洞分析与防范对策研究[D].武汉:华中科技大学,2018.
[5]奚军.基于SAN架构的开放式网络安全数据存储系统设计[J].现代电子技术,2020,43(15):82-85.
[6]李玉峰.基于hMailServer与SpamAssassin的垃圾邮件过滤服务器的搭建[J].内蒙古农业大学学报:自然科学版,2017,38(1):89-92.
作者简介:刘军军(1982—),男,硕士,工程师,主要从事企业信息基础设施建设与维护方面的工作。
DOI:10.16661/j.cnki.1672-3791.2110-5042-2373