【摘要】云计算平台下的资源分为物理机资源和虚拟机资源,对这些资源进行适当合理的监控,是保证云平台稳定运行的前提。使用开源监控软件nagios和libvirt插件设计了监控系统。针对云计算平台下不同的资源,监控系统的设计也分为物理机监控和虚拟机监控两个方面。物理机监控使用nagios,采用相应插件来实现监控目的,最终将监控信息反馈给nagios服务器,定义相应的阀值,并进行实时监控报警。虚拟机监控使用基于libvirt API编写的C/S架构的应用程序。云平台监控系统,有利于系统管理员更加了解云平台的运行情况,及时处理故障,充分保证云平台的正常运行。

【关键词】云计算;物理机监控;虚拟机监控;Nagios;Libvirt

1 绪论

1.1 选题背景

云计算是一种分布式计算模型,它将庞大的计算任务让大量计算机共同完成,继而提供给用户服务,云计算是以服务概念为主的新型计算方式,并通过虚拟化强大的网络和计算资源提供计算、存储服务[1]。

  云计算的主要特点:超大规模、虚拟化、高可靠性、通用性、高可伸缩性、按需服务、极其廉价。正是这些特点吸引了越来越多的IT企业。如Google、思科、Vmware、微软等国际大公司,在国内包括百度、腾讯等公司也积极投入云计算[2]。由于云计算的成本廉价,普通用户都可以体验到云计算平台提供的服务。业界认为云计算是未来IT技术领域发展的趋势。   

为了保证云平台的可靠性,必须对云平台的资源进行实时监控,在云平台出现故障的时候及时报警。在现有云平台基础上集成了物理机监控和虚拟机监控,提高了云平台正常运行的可靠性。

1.2  国内外研究现状

目前云计算还是在发展阶段,对于底层虚拟化为核心的云计算中心的监控[3]还没具体成形。但是已经出现了很多开源分布式监控工具,如nagios、cacti等开源监控工具。nagios和cacti是不同功能的监控软件,nagios适用于监控大量服务器的大量服务是否运行正常,在图像界面上没有那么直观形象,其强大的报警机制就是cacti所欠缺的,cacti主要作用还是体现在收集历史数据和画图,所以cacti的web表现界面比nagios形象具体。这些监控软件通常应用于集群监控,集群监控的目的就是高可用性和高性能。监控获取到的数据可用于故障处理、错误检测性能分析,对数据建立数学模型分析性能瓶颈,还可以用来做负载均衡,当前在对云计算的研究中,针对云计算平台下的动态负载均衡是一个研究热点。

1.3 论文主要工作

(1)探究了云平台下监控物理机的方法。监控流程主要有:物理机性能数据的收集、阀值实时监控、数据持久化存储、故障实时报警等。

(2)探究了云平台下监控虚拟机的方法。监控流程主要有:虚拟机性能数据收集、阀值实时监控、数据持久化存储、故障报警等。

1.4 论文组织结构

本文主要探究云计算平台数据中心的监控,本文组织内容如下:

第一部分是论文绪论部分,介绍了本人选题背景,国内外研究现状,并探究了现有监控技术的不足之处。

第二部分是介绍了云平台构建技术和监控技术,并分析了nagios的工作原理。

第三部分是介绍云监控平台的设计。

第四部分是详细设计了物理机监控模块和虚拟机监控模块。

第五部分对本文内容做总结,并对监控系统的整体设计做了总结。

2云平台构建及监控技术

2.1  云平台构建技术

云计算平台是是一个新生平台,并以按需付费的方式来构建,以服务的方式提供资源,将计算资源、存储资源以服务的方式提供给客户[4]。    

本文中使用开源虚拟化技术KVM部署批量虚拟机,利用Openstack来管理虚拟机。OpenStack的是开发人员和云计算技术专家制造无处不在的开源云计算平台[5],为公共云和私有云的全球协作。该项目旨在通过简单实现,可大规模扩展,提供对所有类型的云解决方案,以及丰富的功能。该技术是由一系列相互关联的项目提供各种组件的云基础架构解决方案[6]。

OpenStack是一个云操作系统,控制计算(compute),存储(storage)和网络(storage)资源的大池在整个数据中心,通过一个仪表板(dashboard),为管理员提供了所有的管理控制,同时通过Web界面赋予他们的用户提供资源[7]。

图2-1:Openstack 整体结构图

针对Openstack 整体结构图,这里介绍下Openstack几个重要模块的功能:

1   Openstack计算模块(Openstack Compute):管理员通常使用在虚拟化环境中的多个虚拟机管理程序支持的一个部署OpenStack的计算模块。 KVM和Xen是目前最流行的开源虚拟化技术之一。还支持场景,用户希望最大限度地减少虚拟化开销,实现更高的效率和性能Linux的容器技术,如LXC。除了不同的虚拟机管理程序,OpenStack的支持ARM和替代硬件架构。

2   Openstack存储模块(Openstack Storage):对象和块存储与服务器和应用程序的使用。对象存储是理想的成本效益,扩展存储。它提供了一个完全分布式的,API可访问存储平台,它可以直接集成到应用程序或用于备份,存档和数据保留。块存储允许块设备被暴露,并连接到计算的扩展存储,更好的性能和企业级存储平台,例如NetApp,Nexenta的和SolidFire整合实例。

3  Openstack网络模块(Openstack Networking):OpenStack的网络是一个可插拔的,可扩展的API和驱动系统来管理网络和IP地址。OpenStack的网络,确保网络不会成为一个云部署的瓶颈或限制因素,并为用户提供了真正的自我服务,甚至在他们的网络配置。

4  Openstack仪表盘模块(Openstack Dashboard):OpenStack的仪表板提供图形界面给管理员和用户。OpenStack可扩展的设计可以很容易地结合第三方产品和服务,如计费,监控以及其它额外的功能。

2.2  云平台监控技术

监控主要是实现对物理机或虚拟机的cpu负载、磁盘IO等信息进行实时监控,以帮助系统管理员更好地了解系统运行状况[8]。现如今,监控体系也从原来的集中式监控逐渐变为分布式监控,这使得其监控功能大大增强。

Nagios是一款很好的开源分布式监控软件, 它能够在影响关键业务流程之前识别并解决IT基础设施问题[9]Nagios的组成包括主程序(Nagios Core)、插件程序(Nagios-plugins)和四个附件(NRPE、NSCA、 NSClient+、NDOUtils)组成。

表2-1:nagios四种附件的区别[10]

附件名称

安装位置

功能

NRPE

客户端

可以让nagios服务器远程连接到被被监控的linux主机上执行本地插件采集检测结果

NSCA

服务器端、客户端

让被监控主机主动发送检测结果给nagios服务器,在冗余监控模式中用到

NSClient++

客户端

监控windows主机时需要安装的组件

NDOUtils

服务器端

将检测到的性能数据存入数据库

图2-2:nrpe的工作原理图

如图2-2所示,nagios监控服务器端执行check_nrpe插件;通过SSL,check_nrpe连接到远程被监控主机的nrpe守护进程;nrpe执行本地的插件去检测相应的服务和状态(如check_disk,check_load等);nrpe把检测的结果反馈给check_nrpe,check_nrpe再把结果反馈给nagios[11]。

图2-3:nsca的工作原理图

如图2-3所示,远程被监控主机执行本地脚本检测服务和状态,通过send_nsca连接到nagios监控服务器端的NSCA守护进程上;并把检测结果主动发送给NSCA;NSCA再把检测结果主动发送给外部命令文件;外部命令文件最后把检测结果主动发送给nagios。

本文采用nrpe和nsca的架构,这种架构的好处是nrpe无法将监控结果进行多级路由传递,可以采用nsca将nagios服务器的监控信息传递给上级nagios服务器。

图2-4:云平台监控系统拓扑图

如图2-4所示,nagios子服务器使用check_nrpe连接到远程物理机上的nrpe守护进程,物理机上的nrpe执行本地的插件检测相应的服务和状态,然后把检测结果最终反馈给nagios子服务器,nagios子服务器使用send_nsca把检测结果主动发送给nagios服务器。nagios服务器把所有nagios子服务器发送来的检测结果统一存储到mysql数据库服务器中去。

上图中每台物理机底下使用开源虚拟化技术kvm运行多台虚拟机,这些虚拟机各自运行自身的操作系统,资源按需分配[12]给这些虚拟机,这些独立的虚拟机单独提供不同的应用,大大提高了硬件资源的利用率[13]。kvm是免费的开源软件。

就目前而言,还没有很好的开源虚拟机监控软件,RedHat提供的Virt-Manager也仅仅只是对虚拟机操作的一些简便化,无法全面地监控虚拟机运行情况。因此我们需要在kvm与云平台之间引入libvirt,libvirt是一组软件的集合,提供管理虚拟机的便捷方式。这些软件包含API库,Libvirtd守护进程,virsh命令行工具。libvirt的主要目标就是提供一个通用稳定的抽象层[14]来安全地管理本地节点或者远程节点上的虚拟机。

图2-5:使用libvirtd控制远程虚拟机监控程序

该模式使用一种运行于远程节点上名libvirtd的特殊守护进程。当在新节点上安装 libvirt 时该程序会自动启动,且可自动确定本地虚拟机监控程序并为其安装驱动程序。该管理应用程序通过一种通用协议从本地 libvirt 连接到远程 libvirtd。对于 QEMU,协议在 QEMU 监视器处结束。QEMU 包含一个监测控制台,它允许检查运行中的来宾操作系统并控制虚拟机(VM)各部分[15]

使用libvirt API库之前,需要安装libvirt-devel包,本文用到的libvirt API[16]主要有:如下表所示

表2-2:libvirt 常用API说明

函数原型

参数说明

功能

virConnectPtr virConnectOpenReadOnly(const char * name)

name:uri of hypervisor,NULL代表本地连接

获得一个hypervisor连接

int virConnectListDomains(virConnectPtr conn,int *ids,int maxids)

conn:hypervisor指针

ids:存储域id的数组

maxids:域数量的上限

获取所有域的id

virDomainPtr vir  DomainLookupByID(virConnectPtr conn,int  id)

conn:hypervisor指针

id:域id

根据域id获取域指针

int virDomainGetInfo(virDomainPtr domain,virDomainInfoPtr info)

domain:域指针

info:存储域信息结构的指针

通过域指针获取关于这个域的全部信息

const char * virDomainGetName(virDomainPtr domain)

domain:域指针

获得域的名称

int virConnectClose(virConnectPtr conn)

conn:hypervisor指针

释放hypervisor连接

int virDomainFree(virDomainPtr domain)

domain:域指针

释放域指针

这里介绍下libvirt中的一些概念,域指的是虚拟机;hypervisor是一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件。也可叫做VMM( virtual machine monitor ),即虚拟机监视器。它可以访问服务器上包括磁盘和内存在内的所有物理设备。Hypervisors不但协调着这些硬件资源的访问,也同时在各个虚拟机之间施加防护。当服务器启动并执行Hypervisor时,它会加载所有虚拟机客户端的操作系统同时会分配给每一台虚拟机适量的内存,CPU,网络和磁盘。

2.3  本章小结

本章对云计算平台的构建技术进行了详细介绍。介绍了kvm虚拟化技术、openstack技术。还介绍了nagios监控原理和libvirt API。

3  云监控平台的设计

本章主要讲述物理机监控的设计和虚拟机监控的设计,物理机监控的四个参数指标:内存,负载,网卡流量,磁盘IO;虚拟机监控的三个参数指标:cpu利用率,网卡流量,磁盘IO。

3.1 物理机监控的设计

本文采用开源监控软件nagios实现对物理机的实时监控,nagios强大的报警功能可以保证云平台的正常运行。

图3-1:nagios监控流程图

如图3-1所示,nagios服务器端运行nagios 核心进程,每台物理机上运行nrpe守护进程,nagios服务器端执行check_nrpe插件,check_nrpe告知nagios哪些服务需要检测,nagios采用轮询的机制,通过check_nrpe连接到被监控物理机上的nrpe守护进程,然后在被监控物理机上执行本地插件检测服务和状态,将检测结果反馈给check_nrpe,check_nrpe再将检测结果反馈给nagios。如果检测结果超过预定义的阀值就会触发报警,报警方式多样,有email,飞信,声音报警。nagios服务器端通过在nagios.cfg配置文件中设置这个选项broker_module=/usr/local/nagios/bin/ndomod-3x.o,加载了ndomod模块,阻断了nagios原本将检测结果写入文件的机制,通过tcp domain socket连接到远程mysql服务器上的ndo2db守护进程,最终实现将数据写入mysql。rrdtool是一个功能强大的开源工具,它不仅仅可以采集数据,还可以根据采集结果绘图,本文使用rrdtool的绘图功能,pnp4nagios是一个小巧的开源软件包,它基于PHP和PERL,pnp4nagios可以利用rrdtool工具将Nagios采集的数据绘制成相关的图表,然后显示主机或者服务在一段时间内的运行状况。

3.2 虚拟机监控的设计

本文采用libvirt API实现对虚拟机的实时监控,通过自行编写基于libvirt API的c/s模式的应用程序实现监控目的,虚拟机监控流程如下:

图3-2:虚拟机监控流程图

如图3-2所示,服务器端运行server程序,处于监听状态,等待客户端也就是物理机的连接,因为虚拟机是租用给用户的,所以只能在其运行的物理机上进行数据采集,server程序中包含select系统调用允许服务器端同时在多个底层文件描述符上等待输入的到达(或输出的完成)。这意味着终端仿真程序可以一直阻塞到有事情可做为止。也就是说服务器可以通过同时在多个打开的套接字上等待请求到来的方法来处理多个客户[17]。

如果是在一个单用户系统中,运行一个“忙等待”循环还是可以接受的,它不停地扫描输入设备看是否有数据,如果有数据到达就读取它。但这种做法很消耗cpu的时间。server.c中的select系统调用允许程序同时在多个底层文件描述符上等待输入的到达(或输出的完成)。这意味着终端仿真程序可以一直阻塞到有事情可做为止。类似地,服务器也可以通过同时在多个打开的套接字上等待请求到来的方法来处理多个客户。物理机上运行vm_monitor程序,进行虚拟机数据的采集,如cpu使用率、磁盘读写情况、网卡流量进出情况。server程序包含server_op_mysql、server_notify_by程序,server_op_mysql程序负责往mysql数据库中的monitor_data表插入数据,创建monitor_data表的脚本如下:

server_notify_by程序定义报警手段,有email、飞信报警。监控流程就如上所述。

3.4 本章小结

本章介绍了监控系统监控云平台的整体架构,通过分析对监控体系的需求,总体上设计了物理机监控和虚拟机监控的整体结构。

4 云平台监控主要模块实现

4.1 物理机性能数据采集的实现

监控服务器安装nagios和nagios-plugin,nagios-plugin中提供了非常丰富的插件,帮助我们实现监控的目的。被监控物理机只需安装nrpe客户端和nagios-plugin,并配置好nrpe.conf配置文件。物理机数据采集流程:

1    被监控物理机启动nrpe服务,并配置好nrpe.conf配置文件

2    nagios服务器执行check_nrpe,通过ssl连接上被监控主机的nrpe

3    在被监控主机上执行本地插件,并将检测结果最终反馈给nagios服务器   

在定义nagios监控的服务之前,我们需要对nagios配置文件有所了解,nagios之所以功能强大,一方面是它的配置灵活,下面是nagios主要配置文件:

             

Web页面显示:

图4-1:nagios web界面

4.2 虚拟机性能数据采集的实现

虚拟机是分配给用户使用的资源,虚拟机的可靠性是保证云平台正常运行的前提。只有对虚拟机实时监控才能及时发现虚拟机的异常状况,提高整个云平台的性能。虚拟机是租用给用户的,在虚拟机里面安装nrpe客户端不现实,所以我们不能使用监控物理机的方式来监控虚拟机,本文使用libvirt API来实现监控虚拟机的目的,虚拟机性能数据采集有3个指标,分别为:cpu利用率、网卡进出流量情况、磁盘读写速率。

1  计算cpu利用率

libvirt库中没有直接获取cpu利用率的API,但是我们可以通过结构体virDomainInfo中的cpuTime变量计算出来。计算虚拟机cpu利用率时要使用到的数据结构:

通过两次调用virDomainGetInfo()获取时间段开始前和结束的虚拟cpu运行时间,二者差值知道cpu的运行时间。间隔时间段用sleep()实现。在sleep()前后用gettimeofday()取得真实的时间差。这个时间段内cpu运行时间与真实时间的比就是这段时间内的cpu使用率。计算公式如下:

     %CPU = 100 ×(cpuTimenow — cpuTimet seconds ago) / (t × nr_cores × 109)

核心代码:

2  计算网卡流量进出情况

   计算虚拟机虚拟网卡的流量,必须先获取虚拟网卡的名称,在物理机的/etc/libvirt/qemu/目录下有相应的虚拟机配置文件。

这是xml格式的文件,通过libxml2函式库,能简单方便的提供对XML文件的各种操作。就是说使用libxml2就能获取到虚拟网卡的名称。虚拟网卡流量分为上传流量和下载流量,使用到的libvirt数据结构如下: 

根据libvirt库中的virDomainInterfaceStats可以计算出网卡进出流量情况。通过两次次调用virDomainInterfaceStats获取时间段开始前和结束的进出网卡总字节数,两者之差除以间隔时间就是网卡发送接收的速率了。间隔时间段用sleep()实现。

计算公式如下:

网卡发送速率 net_tx_bytes = (tx_bytes now –tx_bytest seconds ago)/interval

网卡接收速率net_rx_bytes= (rx_bytesnow –rx_bytest seconds ago)/interval

核心代码:

3  计算磁盘读写速率

计算磁盘读写速率,也必须知道虚拟机虚拟磁盘的名称,同样也可以在虚拟机配置文件中获取虚拟磁盘名称,使用libxml2可以读取xml配置文件。

磁盘使用情况分为读磁盘和写磁盘两种情况,使用到的libvirt数据结构如下:

根据libvirt库中的virDomainBlockStats可以计算磁盘读写速率情况,通过两次调用

virDomainBlockStats获取时间段开始前和结束的磁盘读写总字节数,两者之差除以间隔时间就是磁盘读写的速率了。间隔时间段用sleep()实现。

计算公式如下:

磁盘读速率 disk_rd_bytes = (rd_bytesnow –rd_bytest seconds ago)/interval

磁盘写速率disk_wr_bytes= (wr_bytesnow –wr_bytest seconds ago)/interval

核心代码:

4.3 故障报警机制的实现

为了持久化存储虚拟机性能数据,自定义了一个结构体:

结构体data是跟Mysql数据库中的monitor_data表的字段一一映射,被监控物理机发送data结构体数组给监控服务器。

效果展示:

从结果可以看出磁盘读写速率和网卡速率都为0,需要人为制造流量,使用VNC登录虚拟机进行一系列操作。

图4-2:VNC登录window server虚拟机

虚拟机监控服务器端再次采集数据:

磁盘和网卡速率不再都为0,虚拟机监控服务器端采集的性能数据会随着虚拟机运行状况的改变而改变。使用开源软件phpmyadmin网页登录查看mysql表情况,发现在数据表中的确添加了一条虚拟机性能数据记录。

图4-3:phpmyadmin查看mysql数据库

物理机监控报警

    监控的目的就是保证云平台的正常运行,一旦发生故障状况,能够在第一时间进行故障处理,因此配置报警手段是必要的。在众多的开源监控软件当中,nagios的强大报警功能一直被人所称道,而这些报警手段属于模块化,想用的时候可以添加进来,不想用的时候就可以卸载。nagios软件自带的email报警使用的是linux系统自带的mail软件,这里我们使用第三方开源软件sendEmail,功能更强大,使用方便。通过定义联系人对象,就能达到报警通知的目的。

虚拟机监控报警

虚拟机监控报警是通过server_notify_by程序实现的,server_notify_by程序中定义报警的联系人,可以自定义修改。

server_notify_by程序中报警代码,通过popen函数调用sendEmail这个二进制程序,达到邮件报警的功能。popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。

server_notify_by程序中核心代码:

4.4 本章小结

本章介绍了物理机和虚拟机性能数据的采集,以及采集数据所需要的libvirt API,还介绍了报警机制的配置。

5 总结与展望

5.1  总结

    随着科学技术的发展,云计算现如今是当代的主流。对云平台资源中心的有效监控是保障云平台高效安全运行的有力保障。本文是通过使用Nagios等开源监控软件在开源云平台openstack下进行部署与研究,监控云平台中的主机、虚拟机以及相关的网络设备,测量如CPU负载、温度、网络流量,磁盘IO等参数,并设置各种参数阀值进行有效预警提示。系统设计实现以下几个方面:

(1)使用开源软件KVM搭建云计算平台。

(2)研究和分析了Nagios监控软件的工作原理,制定相应的监控模式对物理机数据的采集,并对性能数据的异常进行实时报警。

(3)阅读libvirt C API虚拟化函数库,编写简易C/S架构的应用程序进行虚拟机数据的采集。

(4)使用开源软件sendEmail对虚拟机性能数据的进行实时报警。

5.2  展望

目前对云平台实现了初步的监控,但尚存在不足之处,还需要在后期进行完善。对于采集到的性能数据,可以建立数学模型来预测云平台性能的瓶颈,保证云平台的稳定运行。物理机底下运行的虚拟机如果过多,会导致物理机负载过大,进而导致死机等故障问题。将采集到的性能数据做为一种负载均衡迁移策略不失为一种明智的选择;迁移的策略:将负载大的物理机下运行的虚拟机迁移到负载小的物理机下。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐