当前位置: 首页 > 科技观察

新浪、万网前系统架构师高俊峰:统一监控告警平台架构设计思路

时间:2023-03-17 00:31:16 科技观察

高照微课由高照发起。是IT行业工程师和程序员在线交流分享的一堂课。让我们用心感受技术在不同领域的干货。高照微课2Lecture2高俊峰(南非蚂蚁)Linux高级技术专家,畅销书作者《循序渐进Linux》、《高性能Linux服务器构建实战》,曾就职于新浪、万网,现供职于上海好耶集团,多年自动化运维和管理经验,擅长Linux、集群应用、Mysql、Oracle等系统管理、性能调优、规划设计,具有丰富的实践经验。目前专注于Hadoop数据平台及Hadoop相关生态系统的运维、监控、部署、优化等技术。原文如下:说到运维,监控应该是运维的重中之重。怎么说?很多人说监控应该是运维的第三只眼。一个好的监控平台应该对我们的工作本身有很大的帮助。那么,如何搭建一个完善的监控平台。也就是我们今天要讨论的话题:从我的理解来看,这个运维的核心工作其实就是监控和故障排除。两个方面的工作,首先我们要对这个业务系统有一个准确完善的监控。那么,他的目的就是保证问题在第一时间被发现,并通知相关人员去解决问题。其实,出问题并不可怕。可怕的是我们很久都没有发现问题所在。然后,我们的业务系统被客户发现有问题,这是一个很严重的问题。这些都是由业务系统监控平台来完成的。概要介绍:1.统一监控告警平台设计思路2.Ganglia作为数据采集模块3.Centreon作为监控告警模块4.Ganglia与Centreon的无缝集成5.统计监控系统架构图6.数据流图***、统一监控告警平台设计思路构建智能运维监控平台,必须重点关注运行监控和故障告警两个方面,涉及的网络资源、硬件资源、软件资源、数据库资源所有业务系统都必须包括在内。在统一的运维监控平台上,通过消除管理软件和数据采集方式的差异,实现对各种数据源的统一管理、统一规范、统一处理、统一展示、统一用户登录、统一权限控制。最终实现标准化、自动化、智能化的大规模运维管理。一个智能运维监控平台,设计架构从低到高分为6层,三个模块,如图1所示:数据采集层:位于顶层,主要采集网络数据、业务系统数据,以及数据库数据、操作系统数据等,然后对收集到的数据进行归一化存储。数据展示层:位于第二层,为Web展示界面,主要将数据采集层获取的数据进行统一展示。展示方式可以是图表、柱状图、饼状图等,可以帮助运维人员了解一段时间内主机或网络的运行状态和运行趋势,为运维人员提供依据。排除故障或解决问题。数据提取层:位于第三层,主要对数据采集层得到的数据进行归一化和过滤,提取需要的数据给监控报警模块。这部分是监控和报警模块之间的连接点。告警规则配置层:位于第四层,主要根据第三层获取的数据设置告警规则、告警阈值、告警联系方式、告警方式等。告警事件生成层:位于第五层,主要实时记录告警事件,将告警结果存入数据库供调用,形成告警结果分析报告统计区域内故障率和故障发生趋势一段时间。用户展示管理层:位于顶层,为Web展示界面,主要统一展示监控统计结果和告警故障结果,实现多用户、多权限管理,实现统一的用户和管理。统一权限控制。在这6层中,按功能实现分为三个模块,即数据采集模块、数据提取模块和监控报警模块。各模块完成的功能如下:数据采集模块:该模块主要完成基础数据采集和图形显示的方式有多种,可以通过SNMP、代理模块或自定义脚本实现。这里使用数据采集工具Ganglia来实现。数据提取模块:该模板主要完成数据的过滤和采集,将数据采集模块中需要的数据提取到监控报警模块中。数据提取可以通过数据采集模块提供的接口或自定义脚本实现。监控告警模块:该模块主要完成监控脚本设置、告警规则设置、告警阈值设置、告警接点设置等,并集中显示和记录告警结果。常见的监控告警工具有Nagios、Centreon等。图2是按照图1的设计思路形成的运维监控平台的实现拓扑图。从图中可以看出,它主要由三大块组成由数据采集模块、监控报警模块和数据提取模块组成。其中,数据提取模块用于其他两个模块之间的数据通信,数据采集模块可以由一个或多个数据采集服务器组成,每个数据采集服务器可以直接从服务器组采集各种数据指标。规范数据格式,最终将数据存储在数据采集服务器中。监控报警模块通过数据提取模块从数据采集服务器获取需要的数据,然后对这些数据设置报警阈值、报警触点等,最终实现实时报警。报警方式支持手机短信报警、邮件报警等,另外报警方式也可以通过插件或者自定义脚本进行扩展。这样一整套监控告警平台就基本实现了。#p#二、Ganglia作为数据采集模块Ganglia是一个为HPC(高性能计算)集群设计的可扩展的分布式监控系统,可以监控和展示集群中节点的各种状态信息。运行在各个节点上的gmonddaemon进程收集cpu、mem、硬盘利用率、I/O负载、网络流量等数据,然后汇总到gmetaddaemon进程下,使用rrdtools存储数据,***将历史数据以曲线的形式通过php页面呈现。其特点如下:1、灵活的分布式分层架构,使Ganglia能够支持上万个监控节点的数据采集,性能稳定。Ganglia数据采集点分层灵活部署,数据采集节点可动态增删,不影响Ganglia整体监控。因此,Ganglia数据采集节点可以灵活扩展。2、Ganglia采集的数据更准确。它不仅可以采集实时数据并以图表的形式展示,还可以让用户查看历史统计数据。因此,用户可以利用这些数据做出性能调整、升级、扩容等决策,从而确保应用系统能够满足不断增长的业务需求。3.Ganglia可以通过组播和单播的方式采集数据。当被监控节点较多时,通过组播方式采集数据,可以大大降低数据采集的负载,提高监控和数据采集的性能。对于不能使用组播采集数据的网络环境,也可以通过单播采集数据,所以Ganglia在数据采集方式上非常灵活。4.Ganglia可以收集各种指标的数据。默认情况下,Ganglia可以收集六大方面的数据:cpu、内存、磁盘、I/O、进程和网络。同时,Ganglia提供了C或Python接口,用户可以通过该接口自定义数据采集模块,这些模块可以直接插入到Ganglia中,实现对用户自定义应用的监控。基于Ganglia的以上优点,非常适合作为监控报警平台的数据采集模块。Cacti/zabbix虽然也可以实现数据采集和图形化报表展示,但是当监控节点越来越多的时候,Cacti和zabbix的劣势在逐渐暴露出来,数据采集的准确性和实时性会很困难保证。因此,要搭建一个高性能的监控告警平台,Ganglia是最好的数据采集模块。第三,Centreon以Ganglia作为监控告警模块采集数据不够。运维人员不可能天天盯着数据报表看。因此,还需要对采集到的数据进行监控和报警:为每个需要监控的主机或Service,设置一个报警阈值,当采集到的数据超过这个阈值时,会自动报警并通知运维人员在第一次,如果采集到的数据没有超过规定的报警阈值,运维人员就可以做其他事情,而不是一直盯着数据报表,这是构建智能监控必须实现的功能和报警平台。实现监控主机或服务的状态值,达到指定阈值报警的功能并不难。可以通过写一个简单的脚本来实现,但是这样太原始了,没有层次感。维护性差,当需要监控告警的主机或服务越来越多时,脚本的性能变得很差,管理起来很不方便,更谈不上任何可视化效果。因此,需要专业的监控告警工具来实现该功能。Centreon就是这样一款专业的分布式监控告警工具。它可以通过第三方组件对网络、操作系统和应用程序进行监控和告警。在底层,Centreon使用nagios作为监控软件。在数据层,Centreon通过ndoutil模块定时将监控数据写入数据库。在展示层,Centreon提供Web界面来配置和管理需要监控的主机或服务,并提供多种告警通知方式。同时还可以显示监控数据和告警状态,查询历史告警记录。四、Ganglia与Centreon的无缝集成Nagios和Ganglia都是很好的数据中心监控工具。虽然它们的功能有重叠,但两者侧重于监控不同:Ganglia侧重于收集数据并随时跟踪数据状态。通过Ganglia,你不仅可以看到数据的历史状态,还可以预测数据未来的发展趋势,为我们的应用修正和硬件采购提供决策。另一方面,Nagios更侧重于监控数据和执行过载警报。综合Ganglia和Nagios的优缺点,同时运行这两个工具可以弥补它们的不足:Ganglia没有内置告警通知机制,而Nagios在这方面强。Nagios没有内置代理和分布式监控机制,而Ganglia在设计时就考虑到了这些。Nagios没有直观的报表展示(虽然可以通过PNP插件实现),而Ganglia报表功能非常强大。Ganglia内置了很多开发接口,通过这些接口可以将Ganglia收集的数据置于Nagios的监控之下。确定使用Ganglia作为数据采集模块,Centreon作为监控告警模块。这样一个智能监控报警平台的两个主要功能模块就基本实现了,但是现在的问题是如何将采集到的数据传输到监控报警模块,这个是要完成的功能数据提取模块。数据提取模块要完成的功能是:定时从数据采集模块采集指定的数据,然后将采集到的数据与指定的报警阈值进行比较,如果发现采集到的数据大于或小于指定告警阈值,然后通过监控告警模块设置的告警方式进行故障通知。在此过程中,数据采集模块仅完成数据采集。其他操作,如:数据采集时间间隔、报警阈值设置、报警方式设置、报警接点设置等均在监控报警模块完成。从数据提取模块完成的功能可以看出,该模块主要是用来连接数据采集模块和监控报警模块,进而完成Ganglia和Centreon的无缝集成。实现数据提取模块的功能,目前还没有现成的方法,需要在ganglia的基础上进行二次开发。比较简单的方法是通过程序在ganglia上开发一个数据提取接口,然后将数据提取到nagios中。该方案通过python程序实现。五、统计监控系统架构图简述如下:Cluster1-N是分布式集群,也可以认为是机房数据中心。每个数据中心的Node服务器运行一个Gmond守护进程收集数据,并将收集到的数据汇总给Ganglia代理主机,Gmetad守护进程运行在Ganglia代理主机上。同时,Gangliaproxy和Nodeserver都加载了用C或Python编写的Ganglia插件来扩展Ganglia的监控功能。Managerserver是一台管理主机,主要用于采集各个机房数据中心的监控数据。Nagios和Ganglia通过数据提取模块集成。考虑到数据安全,建议将Manager服务器作为备机。通常,主机和备份机器同时工作以收集数据。当主机出现故障时,会自动切换到备机,保证管理主机的高可用。通过Web展示监控数据和报表,集成Nagios和Gangliaweb进行二次开发,通过统一的界面展示监控状态和报表信息。六、数据流图的基本流程如下:Gmond收集本机的监控数据,发送给其他机器,收集其他机器的监控数据。Gmond通过udp通讯,传输文件格式为XDL。Gmond节点间的数据传输方式既支持单播点对点传输,也支持组播传输。Gmetad定期从gmond节点或gmetad节点轮询数据。gmetad只有一个tcp通道,gmond和gmetad之间的数据以XML格式传输。gmetad可以从gmond和其他gmetad获取xml数据。gmetad将获取到的数据更新到rrds数据库中。Nagios通过数据提取模块监控ganglia获取的数据并发出告警。通过web监控界面,从Gmetad获取数据,读取rrd数据库,生成图片展示。接下来是QA环节:1.客户端之间通过udp传输gmond有什么意义?答:通过udp传输数据,一方面是轻量级传输,在大量服务器监控的情况下,不会消耗过多的服务器和网络资源,另一方面udp的组播方式可以节省datatomultiple这样管理端可以设置多个数据采集节点。当一个节点出现故障时,会自动到另一个节点采集数据,保证数据采集的稳定性。2、如何不通过tcpip而是通过读取数据库来完成数据抓取来实现对系统的监控,在发现故障时的延迟要好多少?答:抓取数据的方式决定了是否有延迟。这与神经节无关。Ganglia可以从接口接收任何数据,但是是否有延迟取决于你的数据采集脚本。3、如果采用udp方式进行数据备份,一旦各个节点之间出现网络抖动,如何保证数据的完整性?答:数据在每个节点上的存储时间基本在10秒左右。过了这个时间,数据会再次更新,所以不存在抖动问题。至于数据完整性,你也可以无视。收集完数据后,gmetad会统一数据,更注重数据的时效性。下一期更精彩:嘉宾:UC运维老王主题:【公共运维服务实践】时间:9月10日晚8点30分记得关注下方二维码获取资讯哦!