Nagios是一款开源的免费网络监视工具,能有效监控交换机路由器、Windows、Linux主机状态等,在系统或服务状态异常时发出邮件或短信报警,第一时间通知网站运维人员。河南省地震局网络中心基于Nagios部署了覆盖全省范围的网络监控平台,为该局中心服务器、网络设备以及河南省各市地震局台站所属地震监测网络设备提供不间断的网络监控服务,现已配置200多个监控对象。
原生Nagios系统故障报警手段一般采用屏幕、语音、电子邮件和手机短信4种告警方式。其中前2种方式需要信息值班人员每天24小时在电脑前值守,电子邮件告警对于响应告警信息的时效性无法控制和保障,而短信告警只能发送到固定手机号。现有故障信息获取渠道存在局限性,效率低,耗时费力,不利于故障的快速发现与排除。如何将众多仪器与系统的各类告警信息快速、准确地通知到运行管理人员,已成为系统运维管理的重要内容。
杨昌武等(2012)提出通过飞信将故障信息发到运维人员手机上;李刚等(2012)结合Mysql触发器机制与PHP编程技术,实现了故障信息短信告警功能,为该系统研发提供了指导性作用。为了弥补Nagios原有报警机制的局限性,实现故障报警信息的快速高效传递,借助NDOUtils组件的同步功能,将Nagios系统与现有短信发送平台进行数据共享与技术融合,利用JAVA与PHP编程技术,研发河南省地震观测设备分级运维监控系统,实现故障告警短信的实时推送服务。同时,系统通过对Nagios的数据进行分析整合,提供故障严重等级鉴别、故障排查建议提示、设备连通率统计查询等贴近用户适用习惯的功能,使故障信息获取更加人性化。
1 技术背景Nagios通常由主程序(Nagios)、插件程序(Nagios-plugins)和4个可选的ADDON(NRPE、NSCA、NSClient++和NDOUtils)组成。NDOUtils是一个可以把Nagios的全部状态信息保存到Mysql数据库的外部构件。Nagios监测到的故障信息被实时添加入NDOUtils组件的数据库。基于该原理,利用一个进程定时读取NDOUtils组件的数据库,从而间接获取Nagios生成的故障信息,实现数据共享。
Nagios自带的短信通知功能是通过系统配置文件静态定义接收方实现的,无法与值班表信息自动衔接,不能满足值班轮流工作制中每天值班人员变更的需求,而且因不存在告警信息的分析鉴别流程,无法过滤重复的故障报警以及针对故障类型提出故障排除建议。基于Nagios,分级运维监控系统故障通知方式更加高效,并提供更加人性化的功能服务。该系统将Nagios的故障信息与设备附属信息、值班表信息等进行有效关联整合,自动根据值班表进行灵活的自定义推送,拥有故障严重级别提醒、重复故障信息智能合并、故障排查建议指导等功能。
2 系统架构与模块设计系统整体架构由前台值守程序与后台管理程序2部分构成,总体架构见图 1。
前台值守程序采用JAVA语言编写,主要实现告警信息采集、分析与短信实时推送功能。JAVA是一种可以撰写跨平台应用软件、面向对象的程序设计语言(黄文海,2017),具有卓越的通用性、高效性、平台移植性和安全性(高洪岩,2015)。Mysql是流行的关系型数据库管理系统(任进军等,2017),对PHP有较好的支持(陆凯,2016)。以Mysql数据库形式建立值班人员手机号以及值班表的电子存档,前台值守程序得以实现告警短信推送功能与值班表的联动。
后台管理程序提供值班表维护功能,方便值班人员对值班表信息以及运维人员信息的更新维护,同时采用登录认证管理机制,支持多级权限控制,面向不同部门提供不同数据浏览界面,实现分级运维监控,为各部门提供其管辖范围内设备实时故障情况汇总、设备连通率统计查询等功能。该程序基于PHP+HTML+JavaScript语言研发,PHP负责服务器端逻辑处理与数据库查询操作,JavaScript负责浏览器端与用户的动态交互。异步响应技术Ajax能够在不刷新页面的前提下加载数据,改善用户使用体验度。
故障信息采集模块启动独立线程,以时间戳为查询参数,按照指定频率周期性扫描Nagios数据库,抓取最新故障信息。NDOUtils将Nagios产生的故障告警记录在数据库的npc_notifications表格中,其中:字段notification_type标识此故障是host故障还是service故障;notification_id代表此故障记录的数字标识;object_id代表故障对象的数字标识;start_time代表故障开始时间;end_time代表故障结束时间;state字段记录产生时Host或者service的状态(对于host对象,sate为0代表正常,为1代表故障,为2代表严重);output字段代表告警详细信息。采集模块周期性扫描npc_notifications表格,抓取状态异常的记录,并传递到分析模块加工处理。
故障信息分析模块为当前所有故障设立缓存区域,新增故障信息首先被放入缓存,接受重复信息检测过滤后与值班表等信息表格进行匹配关联,最终获得此故障对应的故障严重等级、线路类型、故障排查建议等分析结果。此模块算法流程见图 2。
短信发送模块结合上游模块解析的多方位辅助信息,按照预定义模板生成短信内容,并调用短信发送接口,向故障设备所属部门的当天值班人员推送短信告警信息。
3 系统主要模块编码 3.1 告警信息采集告警信息采集模块启动一个独立服务进程,以固定频率访问NDOUtils组件存放Nagios故障信息的数据库,每次扫描数据库后均更新时间戳,为下一次数据库扫描提供时间参照点。若发现新故障,调用分析模块运行信息关联算法。以下列出主要实现代码。
public void run(){
while(true){ try {
……………
String sql=”select b.display_name, a.start_time, a.state, a.output, b.address from “+pre+”notifications a, ”+pre+”hosts b where a.notification_type=0 a.object_id=b.host_object_id and start_time >’”+timestam+”’”;
//读取时间戳之后发生的故障信息
ResultSet rs=statement.executeQuery(sql);
while(rs.next()){
if(timestam.compareTo(rs.getString(“start_time”))<0){timestam=rs.getString(“start_time”); //更新时间戳}
for (int i=1;i<=5;i++) strings.append(rs.getString(i)+” & ”);
alarm.setstring(strings.toString()); //调用故障分析模块
strings=new StringBuffer(); }
conn.close(); //关闭数据库连接
}catch(Exception e){ System.err.print(e.toString()); } } }
3.2 告警信息分析处理告警信息分析处理模块主要功能为以故障设备ID为中心,开展多方位辅助信息的关联检索,从而提供更人性化、智能化的故障提醒服务。为减少重复的数据库查询,提高运行效率,分析模块在初始化阶段创建号码词典,并采用值班信息缓存机制,首次从数据库查询获取,之后直接从缓存获取,缓存每日一更新。下面列出关键实现代码。
Map<String, String>tele_num =new HashMap<String, String>(); //创建号码词典
Map<String, String>today=new HashMap<String, String>();
//缓存时间标记,用于鉴别信息是否过期,键值对为台站名-》日期
Map<String, String>telnumbers=new HashMap<String, String>();
//缓存当天值班人员电话,键值对为台站名-》短信推送方
public void sendMessage(){//推送短信告警
try { if(today.containsKey(bumen)){
if(today.get(bumen).equals(day)){ //缓存区命中,直接发送短信
sendmessage(source, state, name, start, address, telnumbers.get(bumen)); }}
else {sendmessage(source, state, name, start, address, getnumber(getperson(bumen), bumen));
}}//未命中缓存,从数据库检索
public String getnumber(String person, String bumen){ //获取电话号码
String names[]; String number=””;
names=new String[1];names[0]=person;
number+=tele_num.get(names[i]);
if(!today.containsKey(bumen)){//若缓存中未收藏此部门信息,进入获取流程
today.put(bumen, day); telnumbers.put(bumen, number); }
if(!(today.get(bumen).equals(day))){//判断时间标记,号码缓存已过期,更新缓存today.put(bumen, day); telnumbers.put(bumen, number); }
return number; }
4 成果展示 4.1 前台值守前台值守程序使用JAVA语言编写,提供参数配置、故障情况汇总、短信发送情况展示等功能,运行界面见图 3,值守程序的采集任务、推送任务的执行状态一目了然。
后台管理程序主要实现值班表信息维护、Nagios实时故障汇总展示、设备连通率统计查询等功能。
(1)值班表信息维护。值班表信息维护界面分为上下2部分,点击上方选项卡中需要编辑的月份,下方表格响应加载当月值班人员信息。功能界面见图 4。
(2)Nagios实时故障汇总展示。结合全省设备分级管理模式,利用PHP编写相关逻辑,实现不同部门账号不同跳转分流的效果,满足日常工作中分级运维监控需求。不同部门账号只能浏览本部门管辖范围内设备的实时监控展示页面。管理员拥有最高权限,可管理、查看全省范围内观测设备情况。
(3)设备连通率查询。设备连通率查询页面为用户提供按时间统计的连通率查询功能,界面见图 5。
查询条件有自定义与预定义2种模式,点击序列按钮中的单个按钮,可按照预定义时间查询条件进行快速查询,已预定义11个时间段。点击下方列表中的对象名称,可浏览此对象当前时间段的历史故障记录。
5 结论开源Nagios网络监控系统应用于网络值班工作,凸显出其不够灵活的弊端,无法适用每日轮班的值班制度。为改变现状,设计河南省设备分级运维监控平台,将现有Nagios系统与短信发送平台进行无缝技术衔接,实现Nagios产生的告警信息自动以短信息形式实时推送的功能,拥有短信推送方按需定制的特点,突破了原有故障获取方式的局限性,有利于网络运维人员第一时间掌握网络状态。同时,系统通过对Nagios的数据进行分析整合,提供故障严重等级鉴别、故障排查建议提示、设备连通率统计查询、分级管理模式下的故障汇总等贴近用户使用习惯的人性化功能,使故障信息获取更为高效。系统试运行期间,在不耗费人力、物力的前提下,故障响应时间缩减,工作效率提高,受到广泛好评。
高洪岩. JAVA多线程编程核心技术[M]. 北京: 机械工业出版社, 2015: 26-26. | |
黄文海. JAVA多线程编程实战指南[M]. 北京: 电子工业出版社, 2017: 31-33. | |
李刚, 王晓磊, 孙路强, 等. 基于Nagios软件的综合短信联动告警系统在地震行业中的应用研究[J]. 地震研究, 2012, 35(1): 133-138. DOI:10.3969/j.issn.1000-0666.2012.01.022 | |
陆凯. PHP网站开发实用技术[M]. 北京: 人民邮电出版社, 2016: 63-63. | |
任进军, 林海霞. Mysql数据库管理与开发[M]. 北京: 人民邮电出版社, 2017: 59-59. | |
杨昌武, 曹龙汉. 飞信报警方式的Nagios网络监控系统在企业中的应用[J]. 网络安全技术与应用, 2012, 11(7): 42-45. DOI:10.3969/j.issn.1009-6833.2012.07.014 |