广东电信IPTV业务近年来飞速发展,2016年用户数约400万,2017年 用户数约600万,2018年已经超过1000万。
随着用户数迅猛发展,IPTV 需要让用户得到更优体验留住用户,让用户可以充分参与内容、发现人,让看电视更加有趣,更好玩。这就需要一个电视互动系统提供消息通道,打通用户端和运营端,使运营人员,特别是第三方的运营人员,能即时有效地发送互动信息,呈现给用户,并接收用户的操作指令,完成互动业务。这些应用同时面向前向用户及后向合作伙伴。前向用户使用IPTV的互动类消息应用,可以从电视中获取更多信息并积极参与电视内容的进程,增强用户观看电视的乐趣。后向合作伙伴则可以通过广告、竞猜、投票等应用接触到前向用户,以达增加收入、活跃用户的目的。
广东电信iptv互动消息平台,就是为了支撑广东电信IPTV互动电视业务开发的一个平台。目前平台使用服务器30左右,以后还会随业务量增加而增加。需要对系统的服务器资源、应用服务器关键参数、以及业务接口可用性等多种监控项目进行监控。平台使用的服务器为广东电信云机房提供,本来已经有基本的监控功能,但该功能有效展现的内容不多,也不支持业务级别的监控,无法满足运营支撑需要。
市面上有比较成熟的监控开源软件,如nagios、heartbeat等。根据项目实际情况,需要的是一个简单有效,易于维护的监控系统。复杂,非java开发的监控系统不利于维护。因此项目组决定自行开发一套简单适用的监控系统。
为使用最合适的技术,项目对比了几种监控系统:
(1)广东电信云平台监控系统
云平台监控系统是提供给云服务器使用者自助使用。该系统提供cpu、内存、网络流量等基本资源指标的监控数据。该系统使用SNMP技术,服务器上启动snmpd进程,向采集服务器发送数据。但是该系统不支持由用户扩展监控项目,无法对业务接口、业务信息进行监控。除非建立自己的snmp数据采集服务器。而snmp采集的数据,大多数对业务需要来说是多余的。
(2)Nagios开源监控系统
Nagios是一个监视系统运行状态和网络信息的监视系统。Nagios能监视所指定的本地或远程主机以及服务,同时提供异常通知功能等。 Nagios可运行在Linux/Unix平台之上,同时提供一个可选的基于浏览器的WEB界面以方便系统管理人员查看网络状态,各种系统问题,以及日志等等。该系统由nrpe客户端插件、nagios服务器、rrdtools+pnp4nagios数据展现组成。项目组也使用过nagios一段时间,缺点包括,安装需要编译比较复杂容易出错;运行不稳定;数据展现不合要求;展示图形不符合业务要求;不好修改。
(3)Elastic Heartbeat
这个监控系统是elastic公司开发,可以和elasticsearch搜索引擎,kibana数据展现联合使用。但是该系统需要几大组件配合使用,对硬件较高;另外有大量无用的监控信息,格式冗长,非常消耗系统空间。而且elasticsearch商用并不免费。
对比之后,发现目前比较常用的监控系统要么不满足需求,要么过于复杂,难以修改,因此决定自行开发。
一般的监控系统都是由监视数据采集模块、存储模块、展示模块等基本模块构成。
采集模块基于易于实现、易于修改维护的指导思想,监控实时性、程序效率性要求不高,使用linux操作系统的前提下,客户端监控数据采集部分使用linux内生解释型的shell语言作为基础实现语言。由一组shell程序控制。Shell语言性能不高,但是用于秒级的监控数据收集已经是足够了。另外,如果该控制程序以后到达瓶颈,也可以改用效率更高的python、java等。
存储模块则采用kafka,可以对大量监控数据进行快速的检索,展现部分自行开发web页,并采用百度的图形插件。
经过需求分析,项目组对系统的要求为:
(1)易于增加监控项目。
(2)可以短信、邮件及电话告警。
(3)展示页面易于对比各个服务器差异。
(4)实时性要求不高,满足10秒级别即可。
(5)适用于linux平台
主要模块包括:
①采集模块
②存储模块
③传送模块
④展示模块
⑤告警模块
(1)采集模块:
作用:在需要监控的服务器上,执行一系列程序,获取需要监控项目的格式化数据。
实现技术:linux shell脚本,或者python程序,或者其他可以执行的任何程序。
图1 监控系统架构图
实现方法:控制程序根据配置文件制定的周期,循环执行一系列监控项目信息获取程序,得到一组格式化的输出数据。每个监控程序负责输出一个监控项目的数据。为避免不需要的数据,减少传递时的网络流量和减少存储空间,设计满足要求的最小数据集合即可。包括:监控项目名称、服务器名、服务器ip、时间、状态码。 考虑到兼容性和扩展性,任何一个监控项目,只要能够输出格式正确的数据信息即可,不管使用何种语言实现。也就是说,可以用任何一种语言编写一个监控程序,只要这个程序按照规定的格式输出数据,放入监控流程,就能实现监控、展示、以及告警。
举例:例如想对cpu的运行情况进行监控,编写一个cpu-idle.sh的脚本,利用vmstat命令获取cpu的idle数据,格式化输出监控项目名称、服务器名、ip地址、时间、监控值。类似:cpu-idle,serverna me,192.168.0.1,2018-10-06 09:28:47,100。得到格式化数据后,输出到日志文件,例如monitor.log,这样就得到一个不断增长的日志文件。
(2)存储模块:
作用:持久化存储监控数据,并提供实时获取方法和检索方法。
实现技术:考虑到服务器数量达到30台,而且未来还会随业务增长,我们使用kafka来实现存储模块,如果数据量不大也可以考虑使用数据库如mysql实现。Kafka是Apache软件基金会开发的一个开源流处理平台,是一种高吞吐量的分布式发布订阅消息系统,它可以处理大规模流数据,适合大量的数据实时处理。
实现方法:搭建好kafka后,在kafka上设置一个monitor主题,就可以使用客户端程序往这个主题发送数据和获取数据。
(3)传送模块:
作用:连接监控日志和存储模块,把不断增长的日志文件内容即监控数据传送到存储。
实现技术:使用和kafka配套的 filebeat工具,可以稳定传送监控数据。Filebeat是elastic公司开发的一个日志文件托运工具,会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并且转发这些信息到elasticsearch或者logstarsh、kafka中存放。曾经有一段时间项目组使用kafka的python客户端程序,结合tail命令来跟踪传送监控日志文件,但是这个方法难以保证python线程稳定运行,不时会产生终端。使用 filebeat之后,除了网络中断和服务器宕机,没有发生其他错误。
实现方法:下载安装 filebeat,配置文件( filebeat.yml)指明要传递的日志文件地址和接收数据的地址。例如要跟踪的日志文件为/log/monitor.dat,kafka集群服务器地址为svr1:9000,svr2:9000,kafka的topic为monitor,那么配置文件为:
filebeat.prospectors:
- input_type: log
enabled: true
paths:
-/log/monitor.dat
tail_ files: true
output.kafka:
hosts:["svr1:9000","svr2:9000"]
topic:'monitor' # hostip from env
required_acks:1 # ack from leader
max_message_bytes:20480
compression:none
codec.format:
string: '%{[message]}'
(4)展示模块
作用:将监控数据展示成便于观察的图形
实现技术:订阅kafka的monitor主题,获取数据实时接口获取数据,并利用百度图标插件的开发的图形展示页
实现方法:kafka支持实时流接口获取数据和按指定时间段等条件获取数据。Kafka有python开发包,引用开发包,初始化一个Consumer对象,可以获得订阅的主题数据。Web应用在动态展示服务器最新监控数据,然后将这些数据按监控项目,展示成折线图,多个服务器同时展示,可以马上掌握当前各个服务具体性能压力,便于对比分析。
(5)告警模块:
作用:当某监控项目超出阈值,对维护人员发出邮箱、短信、电话等告警信息。
实现技术:利用kafka实时订阅接口获取数据,使用python变成分析数据,使用邮箱接口、web电话等接口发出告警。
实现方法:获取订阅数据后,与对应监控项目的设定阈值做对比,超出阈值的记录下来,如果短期内持续超出阈值一定数量,则开始发邮件告警,另外可以调用web电话接口,进行电话告警。(如图2所示)
图2
经过近两年时间的运行,本监控系统可以稳定运行,并有效支撑了运维工作,满足设计要求:
(1)系统资源占用小:虽然监控脚本基于shell运行,存储基于文件日志,在实际运行中,系统资源的占用很小,不影响业务系统运行。
(2)结构简单:已经是最简的监控系统设计,一些业务场景如果不需要存储和展示,还可以做成单机版,对单个服务器进行监控。
(3)易于维护:如果需要增加监控项目,增加一个监控程序,按格式输出监控数据即可。
(4)稳定运行:控制好文件大小即使清理陈旧数据,系统可一直稳定运行。
(5)便于对比监控:可以方便对比服务器运行情况,发现问题。
监控图形举例:
①对tcp orphaned连接的监控。此监控项目一般的监控系统没有,但却是是iptv互动平台项目关系的核心系统参数。(如图3所示)
②对于redis服务器instantaneous_ops_per_sec参数的监控。系统用到redis服务器,是一个定制化的监控项目。(如图4所示)
图3 tcp-orphaned监控图
图4 redis instantaneous_ops_per_sec 监控图
③监控某端口收到的请求数。这也是一般监控系统没有的监控项目,但是可以反映系统的繁忙程度。(如图5所示)
图5 网络端口接收请求数监控图
这套系统是一个结构简单、稳定、易于维护的监控系统,满足中小规模大多数业务的业务需求。该系统在iptv互动电视平台上稳定运行,足以支撑iptv互动业务未来多年的监控需求,可以推广的其他应用系统使用。