服务器管理监控系统_第1页
服务器管理监控系统_第2页
服务器管理监控系统_第3页
服务器管理监控系统_第4页
服务器管理监控系统_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、服务器管理、监控系统摘要:现今互联网行业发展迅速,底层支撑互联网服务的服务器等各种硬件设备规模越来庞大。如何管理有效地管理这些设备、实时发现其潜在的隐患、获取其运行的状态,而显得至关重要。根据这些信息才能合理地决定设备上所运行系统、应用等服务的关闭与保留与挂起。本文介绍了利用Zabbix开源监控解决方案,以及对该方案的二次开发而实现对服务器机房的专家系统。关键字:机房运维 服务器监控 Zabbix 目录摘要21. 引言42. Zabbix 监控原理与应用52.1. Zabbix 监控原理52.2 Zabbix用户配置63. 监控建立与二次开发84. 系统展示104.1用户监控对象添加105.总

2、结14参考文献:151. 引言随着现今互联网行业的迅速发展,某些物联网服务的用户已经达到了亿级,如淘宝网注册用户已达到3.7亿,仅在2015年“双十一”当天活跃用户过亿1。支撑如此庞大用户使用的硬件基础是规模庞大的服务器群。如何获取每一台服务器的运行状态,及时获悉潜在隐患,出现问题及时锁定排除显得至关重要。机房运维人员以及高层决策人员只有在实时掌握这些信息后才可有效地对进行决策,如在访问流量过大或其他恶意攻击后是及时关闭服务还是启动备用服务,服务区瘫痪后是需要工作人员至机房处理硬件问题还是只需远程重启服务器等类似或简单或复杂的决策,都需要底层专家系统信息的支持。现今比较成熟的开源服务器底层数据

3、的采集解决方案主要有Zabbix和Nagios。Nagios是一个监视系统运行状态和网络信息的监视系统,能监视所指定的本地或远程主机以及服务,同时提供异常通知功能等2。Nagios可运行在Linux/Unix平台之上,同时提供一个可选的基于浏览器的Web界面以方便系统管理人员查看网络状态,各种系统问题,以及日志等等。Nagios 可以监控的功能有:1、监控网络服务(SMTP、POP3、HTTP、NNTP、PING等);2、监控主机资源(处理器负荷、磁盘利用率等);3、简单地插件设计使得用户可以方便地扩展自己服务的检测方法;4、并行服务检查机制;5、具备定义网络分层结构的能力,用"pa

4、rent"主机定义来表达网络主机间的关系,这种关系可被用来发现和明晰主机宕机或不可达状态;6、当服务或主机问题产生与解决时将告警发送给联系人(通过EMail、短信、用户定义方式);7、可以定义一些处理程序,使之能够在服务或者主机发生故障时起到预防作用;8、自动的日志滚动功能;9、可以支持并实现对主机的冗余监控;10、可选的WEB界面用于查看当前的网络状态、通知和故障历史、日志文件等2; 11、可以通过手机查看系统监控信息;2112、可指定自定义的事件处理控制器3。其他一些大型企业也有自己独立开发的服务器监控服务,如小米运维部的人性化互联网企业级监控系统Open-Falcon、淘宝运维

5、部使用 OpenTSDB等,它们也有各自的优点。本文第一章概述了服务器机房的专家,以及可提供这些服务的一些解决方案等;第二章介绍Zabbix所提供的监控原理即使用;第三章介绍Zabbix的实际监控应用以及二次开发;第四章进行专家的分析;第五章对服务器机房专家系统进行总结。2. Zabbix 监控原理与应用Zabbix是一个B/S模式的企业级的监控服务解决方案,用户可以此获取服务器等硬件、操作系统、中间件等的运行状态,为应用层的决策提供决策信息。2.1Zabbix 监控原理Zabbix由agent和server组成,其中agent负责采集服务器等监控对象的数据,server负责处理这些数据,判断

6、异常等,并通过提供apache服务在web端实现对数据的可视化展示。其中agent的类型主要监控对象包括:(1)Zabbix-agent,根据Zabbix监控方式实现对操作系统层级的信息采集,实现对系统的监控。Zabbix-agent 有sender和get两部分组成,分别通过命令来采集数据4。监控对象有CPU运行状态、磁盘I/O、内存使用、进程线程数等;同时可利用其他应用提供的端口实现对应用服务的监控,如MySQL数据库等。(2)、IPMI-agent,根据IPMI(Intelligent Platform Management Interface)接口实现对服务器等硬件设备的监控,监控对象

7、包括CPU运行温度、风扇转速、环境温度等硬件信息的监控;(3)SNMP-agent,根据SNMP(Simple Network Management Protocol)协议实现对交换机、路由器等网络设备的监控。监控对象包括各端口运行状态、流入流出流量等。(4)JMX-agent,根具JMX(Java Management Extensions)提供的接口实现对Java类应用的监控。监控对象包括Java虚拟机、Tomcat服务,Hadoop、Spark等分布式服务的监控等。当agent得到数据并发送给server后,server端将数组存放在位于服务端的数据库,然后前端服务调用数据库数据并将其可

8、视化显示。显示给用户的只有browser页面,用户在前端进行服务器管理并据此进行相应决策。图(1)表示了Zabbix 的监控原理。图1 Zabbix监控原理图Zabbix 的agent将数据发送给server并储存在数据库中,前端页面调用数据库中的数据与用户交互。2.2Zabbix用户配置Zabbix server处理数据时为了便于用户操作按图(2)的方式处理、集成监控数据。图2数据处理、集成图其中host为用户监控的主机、设备或操作系统等;item为实际的监控个体,可能是某一个CPU的使用率,磁盘读写速度等,一个host上可能存在若干item;每一个item都可设定对应的trigger,根据

9、阈值判断还item的使用情况是否达到报警值。Trigger发现报警后将会在主界面显示,也可都过短信、邮件、微信等向用户发送报警信息,并连接后续修复操作。因此用户在实际使用时主要需配置host,item和trigger,分别如图(3)、图(4)、图(5)所示。图3 Host配置图用户配置监控方式即监控对象,包括监控Host配置图对象的名称、所在群组、监控方式、IP地址等。图4 item配置图用户根据不同的监控类型配置监控的具体个体,可设置监控元素、监控周期、数据保存时限等。 图5 trigger配置图Trigger配置报警信息,其中Expression为表达式判断item的使用情况。如图所示为空

10、闲内存与全部内存的比值,但可用内存的使用率小于20%时,将产生报警,警报级别为高。除了上述3种配置外,用户还可通过配置graph、map、screen等,分别配置数据展示图,host关系图、监控大屏等。3. 监控建立与二次开发本监控与专家系统根据东海分局预报中心需要,利用Zabbix监控体系并结合Java web技术二次开发建立,为整个预报中心提高机房管理、监控专家服务。3.1 搭建环境本系统选择Ubuntu server 作为Zabbix server所在服务器,上文四种监控agent部署与客户端采集数据;数据库选择MySQL server;网页服务选择apache开源服务;同时利用spri

11、ng boot 框架进行java web开发,整合Zabbix的api,并直接处理Zabbix数据库,在交互更良好的页面实现管理与决策。3.2 Zabbix server建立根据Zabbix的监控原理,server的搭建主要包括数据库的建立,apache web服务的建立,Zabbix server的建立等,另外Zabbix server只能搭建在Linux系统中。本系统中Zabbix server的安装都选择Ubuntu系统下的编译安装,具体建立流程不在赘述,详情参见Zabbix用户手册5。3.3 二次开发Zabbix 原始界面为英文界面,中文翻译的界面十分生硬,不便于中国用户使用。本系统对

12、Zabbix进行了二次开发,在Zabbix上用封装了一层用户管理系统。本系统使用Java web技术,结合Zabbix api操作Zabbix数据,同时根据用户需要添加了针对性的服务。系统界面如图6:图6平台界面如图所示,用户可添加硬件、中间件、操作系统等类型的host。图(7)为用户添加host的界面:图7后台host添加页面用户可在次添加设备信息,同时根据Zabbix的api可将添加的数据发送值Zabbix server,实现Zabbix对该设备的监控。Host添加代码如下,host的添加选择了使用Zabbix api实现:/* * Created by light on 2016/2/2

13、6. */public class ZbxHostServiceImpl public static IHostService hostService = new HostServiceImpl(); static / 登录 Login.login(); / Type: 1 - Zbx_agent; 2 - SNMP; 3 - IPMI 4 - JMX. / Port: 1 - 10050; 2 - 161; 3 - 12345; 4 - 632 public static CreateDuplicate createDuplicate = new CreateDuplicate(); Str

14、ing response; /创建防火墙 public String createHostFw(String hostName,String interfaceIp) response= createDuplicate.createHostEasy(hostName,interfaceIp,"161","10081",2); return response; / 创建主机 收集服务器性能信息:CPU、Memory等 public String createHostHost(String hostName,String interfaceIp) respo

15、nse= createDuplicate.createHostEasy(hostName,interfaceIp,"10050","10081",1); return response; /创建iis 服务 public String createHostIIS(String hostName,String interfaceIp) response= createDuplicate.createHostEasy(hostName,interfaceIp,"10050","10081",1); return res

16、ponse; /创建jvm public String createHostJava(String hostName,String interfaceIp) response= createDuplicate.createHostEasy(hostName,interfaceIp,"12345","10081",4); return response; /创建 oracle 数据库 public String createHostOracle(String hostName,String interfaceIp) response= createDupl

17、icate.createHostEasy(hostName,interfaceIp,"161","10081",2); return response; / 创建 ping 监控 changes needed here public String createHostPing(String hostName,String interfaceIp) response= createDuplicate.createHostEasy(hostName,interfaceIp,"10050","10081",1); ret

18、urn response; /创建路由 public String createHostRouter(String hostName,String interfaceIp) response= createDuplicate.createHostEasy(hostName,interfaceIp,"161","10081",2); return response; / 收集服务器硬件信息:温度,转速等 public String createHostServer(String hostName,String interfaceIp,String inte

19、rfacePort) response= createDuplicate.createHostEasy(hostName,interfaceIp,interfacePort,"10081",1); return response; /创建IPMI public String createHostServerIPMI(String hostName,String interfaceIp) response= createDuplicate.createHostEasy(hostName,interfaceIp,"623","10081"

20、,4); return response; public String createHostSqlserver(String hostName,String interfaceIp) response= createDuplicate.createHostEasy(hostName,interfaceIp,"10050","10081",1); return response; /创建存储 public String createHostStore(String hostName,String interfaceIp) response= createD

21、uplicate.createHostEasy(hostName,interfaceIp,"10050","10081",1); return response; /创建交换机 With Group public String createHostSwitchboard(String hostName,String interfaceIp) response= createDuplicate.createHostWithGroup(hostName, interfaceIp, "9","161","102

22、08",2); return response; /创建tomact服务 public String createHostTomcat(String hostName,String interfaceIp) response= createDuplicate.createHostEasy(hostName,interfaceIp,"12345","10081",4); return response; / 创建虚拟机 public String createHostVmware(String hostName,String interfaceI

23、p) response= createDuplicate.createHostEasy(hostName,interfaceIp,"10050","10081",1); return response; public String ZbxDeleteServer(String hostId) / 数据准备 HostDeleteRequest delete = new HostDeleteRequest(); delete.getParams().add(hostId); return hostService.delete(delete); public

24、JSONObject getHostIdAndName() HostGetRequest hostGetRequestContent = new HostGetRequest(); String outputs = "name" hostGetRequestContent.getParams().setOutput(outputs);/ hostGetRequestContent.getParams(); return hostService.get(hostGetRequestContent); public JSONObject getHostIdAndName(Str

25、ing hostid) HostGetRequest hostGetRequestContent = new HostGetRequest(); String outputs = "name" String hostids = hostid ; hostGetRequestContent.getParams().setOutput(outputs); hostGetRequestContent.getParams().setHostids(hostids); return hostService.get(hostGetRequestContent); public stat

26、ic class HostArray public static ArrayList<String> getHostId() ZbxHostServiceImpl zbxHostIds = new ZbxHostServiceImpl(); JSONObject hostIdsJsb = zbxHostIds.getHostIdAndName(); JSONArray hostIdsJsa = hostIdsJsb.getJSONArray("result"); ArrayList<String> hostIds = new ArrayList<

27、;String>(); for(int i=0;i<hostIdsJsa.length();i+) Object hostid = hostIdsJsa.getJSONObject(i).get("hostid"); hostIds.add(i,String.valueOf(hostid); return hostIds; public static ArrayList<String> getHostName() ZbxHostServiceImpl zbxHostNames = new ZbxHostServiceImpl(); JSONObjec

28、t hostNamesJsb = zbxHostNames.getHostIdAndName(); JSONArray hostNameJsa = hostNamesJsb.getJSONArray("result"); ArrayList<String> hostNames = new ArrayList<String>(); for(int i=0;i<hostNameJsa.length();i+) JSONObject name = hostNameJsa.getJSONObject(i); Object names = name.ge

29、t("name"); hostNames.add(i,String.valueOf(names); return hostNames; 4. 系统展示4.1 用户监控对象添加用户添加host完毕后效果如图(8):图 8 Zabbix监控页面图(9)为测试阶段Zabbix的状态:图9 Zabbix监控状态如图所示主机共144个,可用监控item 3053个,可用trigger 1319个。4.2 可视化监控与专家图(10)Zabbix监控对象的状态:图 10 Zabbix监控对象的状态如图可显示trigger发出的报警,以及统计数据。同时可以直观的发现该界面设计并不美观,与中

30、国用户的交互也是十分友好,不便于用户进行相应的决策。为了便于用户查看并获得有用的决策信息,二次开发过程的结果简化了监控对象的添加,对于Zabbix中复杂的item、与trigger添加,本系统事先根据服务器型号设定好模版,用户选择服务器是将自动加载模版实现监控,同时对于用户关心的监控报警阈值与报警提醒,系统对此也进行了简化。图(11)为用户添加报警信息的页面:图 11平台trigger配置页面相比于Zabbix中添加trigger时复杂表达式的填写,在专家系统中用户可直接选择监控对象,并根据提示信息完成对阈值的填写,实现了告警规则简单明了的配置。Trigger后台配置代码如下:Reposito

31、rypublic class ZbxTriggerRepository Autowired JdbcTemplate jdbc; TargetDataSource(name = "zabbix") public void updTrigger(String itemKeyToSearch,String thresholdNew) / 得到字段itemid,hostid,item_name,item_key,triggerid,expression String triggerSql; if(itemKeyToSearch.equals("memory usage

32、is not enough") triggerSql = "SELECT i.itemid,i.hostid,,i.key_,fun.triggerid,trg.expressionn" + "FROM items as i,hosts_templates as ht,functions as fun,triggers as trgn" + "where i.hostid = ht.hostid n" + "and trg.description = '"+itemKeyToSearc

33、h+"'n" + "and i.itemid = fun.itemidn" + "and trg.triggerid = fun.triggeridn" + "and ht.hostid>10084;" else triggerSql = "SELECT i.itemid,i.hostid,,i.key_,fun.triggerid,trg.expressionn" + "FROM items as i,hosts_templates as ht,functi

34、ons as fun,triggers as trgn" + "where i.hostid = ht.hostid n" + "and i.key_ = '"+itemKeyToSearch+"'n" + "and i.itemid = fun.itemidn" + "and trg.triggerid = fun.triggeridn" + "and ht.hostid>10084;" List<Map<String,Objec

35、t>> list = jdbc.queryForList(triggerSql); String expression = list.get(1).get("expression").toString(); / 因为是一个模版出来的,所有操作符都一样 int a = expression.lastIndexOf(""); String operator = expression.substring(a+1,a+2); /得到运算符 List<String> str = new ArrayList<>(); for(Ma

36、p<String,Object> map : list) String expressionOld = map.get("expression").toString(); String thresholdOld = expressionOld.substring(a+2,expressionOld.length(); String expressionNew = expressionOld.replace(operator+thresholdOld,operator + thresholdNew); map.put("expression",

37、expressionNew); String triggerid = map.get("triggerid").toString(); String updTriggers = "update triggers set expression = '"+ expressionNew + "' where triggerid =" + triggerid + "n" str.add(updTriggers);/ jdbc.update(updTriggers); String sql = str.toA

38、rray(new Stringstr.size(); jdbc.batchUpdate(sql); 4.3 决策分析本系统对Zabbix的决策功能进行了大面积二次开发与包装,Zabbix系统中的信息可视化页面相对简陋,如图(12):图12 Zabbix图标页面Zabbix中不便于同时查看多个图表,二次开发中对图表也进行了优化,图(13)为二次开发的数据监控页面:图13数据展示图从二次开发的图中用户可以更加方便地获取所需的信息,并且同时监控到多个监控要素。图(14)为综合展示页面:图14综合监控大屏对比于Zabbix的综合监控页面,用户据此直观的观察到系统的状态。用户使用本专家解决系统可直接通过

39、监控中心如图(14)的监控大屏看到服务器的状态。图中最下排机房环境为用户机房一些重要服务器的重要监控要素显示情况(测试阶段数据为全部录入);网络状态为预报中心与其兄弟单位、子单位、以及服务单位的网络状态,根据Zabbix的ICMP监控实现,红色即表示联通情况出现问题;超算监控为本专家系统用Linux命令行直接监控超算服务得到;数据传输情况为本专家系统读取用户数据库信息统计计算得出,红色表示该海洋站的数据传输率低于某阈值。如果某项监控要素出现问题,专家系统将第一时间用短信通知用户,短信截图如图(15):图15报警短信发送用户根据短信信息可准确定位问题所在,便与应对决策。短信功能的实现代码如下:i

40、mport .shou.monitor.service.impl.ZbxTriggerServiceImpl;import .shou.monitor.spring.TargetDataSource;import org.json.JSONArray;import org.json.JSONObject;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframew

41、ork.stereotype.Repository;import java.util.ArrayList;import java.util.List;import java.util.Map;/* * Created by light on 2016/4/14. */Repositorypublic class PhoneMessage Autowired JdbcTemplate jdbcTemplate; TargetDataSource(name = "predict") public String sendMessage(String hostid) / resul

42、t 中Array size 为2 ZbxTriggerServiceImpl trigger = new ZbxTriggerServiceImpl(); JSONObject triggerRs = trigger.getTriggerForSms(hostid); JSONArray result = triggerRs.getJSONArray("result"); /结果信息 String content = null; if(!result.toString().equals("") String description = result.ge

43、tJSONObject(0).getString("description"); String priority = result.getJSONObject(0).getString("priority"); String selectSqlName = "SELECT hosts FROM predict.zbx_hosts where host_id = '"+ hostid+"'" String selectSqlDesc = "SELECT desc_zh FROM predic

44、t.alarm_description where desc_en = '"+ description+"'" String sqlType = "SELECT SMS_name FROM zbx_hosts_sms where host_id = '"+ hostid+"'" List<Map<String,Object>> listName = new ArrayList<Map<String,Object>>(); listName = jdbcTemplate.queryForList(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论