APP下载

云平台安全监控数据采集关键技术研究

2019-12-07张伟华

网络安全技术与应用 2019年12期
关键词:调用插件组件

张伟华

云平台安全监控数据采集关键技术研究

张伟华

(华为西安研究所 陕西 710068)

Openstack技术中项目之间的通信使用RESTful API进行通信,项目内部不同的组件之间的通信使用消息总线;Ceilometer为Openstack项目提供信息收集功能;Esper是事件流处理和事件关联引擎,主要面对的是实时事件驱动架构(Event Driven Architecture),构成云平台监控数据采集和分析处理的关键技术,本文介绍了云平台安全监控数据采集关键技术,供相关读者参考。

云平台;监控;数据采集

1 云平台监控数据采集技术

Openstack是IaaS层软件,允许用户自行建立和提供云端的运算服务[1-2]。此外,openstack也用作建立防火墙内的私有云,提供机构或企业内部各个部门共享资源。它是以python编程语言编写,遵循Open Virtualization Format、AMQP、SQLAlchemy等标准,所支持的虚拟化软件包括KVM、Xen、VirtualBox、VMware、Hyper-V等。

Openstack项目中包含了众多的子项目:Nova、Swift、Glance、Horizon、Cinder、Keystone、Neutron、Heat、Ceilometer、Trove、Saharad等。这些细化的子项目分别负责相应的功能,以保证云平台的正常运行。由于项目众多且篇幅有限,本文中只对云平台监控相关的通用技术以及云平台监控项目Ceiloemeter进行详细的说明。

2 Openstack通用技术

Openstack的设计原则是:项目之间的通信使用RESTful API进行通信,项目内部不同的组件之间的通信使用消息总线[3]。

Ceilometer使用公用的Python库Stevedore将监控不同类型部件的监控插件在运行时动态加载到进程中。

(1)RPC(Remote Procedure Call,远程过程调用):通过RPC远程调用,一个服务进程可以调用其他远程服务进程的方法。

在Openstack项目中,属于相同子项目的不同服务进程之间使用RPC进行相互调用。例如,Nova组件主要负责的是虚拟机的创建,删除,挂起等的操作,Nova又由nova-api、nova-conductor、nova-scheduler,nova-compute组成。在用户发出创建虚拟机的指令后,nova-api接受请求,完成权限校验和参数校验之后将请求传递给nova-conductor,nova-conductor调用nova-scheduler完成虚拟机创建位置的选取,然后再调用nova-compute的方法调用下层驱动完成虚拟机的创建。在这个过程中,Nova组件内部的通信就是通过RPC消息总线完成的。

消息总线有两种调用方式:call和cast。RPC.call远程调用的方法会被同步执行,调用者会被阻塞直到返回结果;RPC.cast远程调用的方法会被异步执行,调用者在完成调用后会继续往下执行,并不会等待远程方法返回结果[4]。

RPC消息总线是一种概念,Openstack的消息总线支持AMQP(Advanced Message Queuing Protocol)[5]。默认的具体实现为RabbitMQ。

RabbitMQ实现了AMQP,它的工作流程如图1所示。

RabbitMQ为消息传递的中间件,它会实现消息交换(Exchange)模块和消息队列(Queue)模块。部件内部通讯时,消息产生的一方称为生产者(即消息的发送方),接收消息的一方称为消费者(即消息的接收方)。RabbitMQ作为中间件,在接收到从生产者发送来的消息的时候,会根据消息的属性以及消息头部信息将消息与相应的队列进行绑定(Binding),这个动作是由Exchange模块实现的。然后消费者会从它所监听的消息队列中读出相应的消息,完成远程方法的调用。如果使用的是RPC.call的方式进行远程调用,那么在远程函数执行完毕后,将执行结果以消息的形式发送给RabbitMQ,然后由Exchange发送给相应的消息队列,原先的生产者现在变成了执行结果消息的消费者,从消息队列中读取所需消息,然后继续向下执行。

图1 RPC工作流程

(2)RESTful API(Representational State Transfer)是由HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器软件的作者之一、Apache基金会的第一任主席Roy Thomas Fielding博士2000年在他的论文中提出的[6],目的是为了想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。

REST(Representational State Transfer,表现层状态转化),也可以理解为资源状态转化(Resource State Transfer)。RESTful API将网络上的所有内容都看作是一种资源,可以是一张图片,一段音频视频,也可以是一种服务。使用一个特定的URL(统一资源定位符)指向这个资源,一个特定的URL指向独一无二的资源,如果需要对这个资源进行操作,那么就需要通过与之绑定的URL对其进行访问,这个URL就成了这个资源的识别符[7]。

用户与网站服务器的交互,实质上就是用户通过浏览器发送请求,对网络服务器上的资源的状态进行改变的过程。互联网通信协议HTTP协议是无状态的,因此资源状态都保存在服务器上面。用户需要使用HTTP协议的4个基本操作:GET、POST、PUT、DELETE使服务器上的资源发生状态转化,这就是RESTful API架构的核心原则。

Openstack各个部件都提供了RESTful架构的API作为对外接口,以方便部件之间内部的相互调用以及用户通过浏览器对各个部件的访问[8]。依旧以创建虚拟机的过程为例子:用户通过Horizon或者命令行调用Nova-API向Openstack发送创建虚拟机的请求,从而改变后端计算、存储、网络资源的状态。而在创建虚拟机的过程中,Nova部件不仅要选取合适的位置创建服务器,还需要向Cinder以及Neutron组件发送请求,调用相应API完成卷的创建和网络资源的准备,只有在计算、存储、网络资源都被正确选取之后,才能真正开始创建虚拟机,供用户使用。

WSGI(Web Server Gateway Interface)是一种接口,定义了Python程序与Web服务器之间的通信规范。Python库Paste中的Deploy组件可以发现和配置WSGI Appliaction和Server。在Openstack的设计中,用户发送RESTful API请求到云平台,用以操作云服务提供商提供的计算资源,而整个云计算平台的所有组件都以应用的形式部署在服务器端,以供用户和平台内部调用。Paste.Deploy组件在Openstack项目中的功能就是让服务器识别各个组件,使服务器在接受到来自用户和平台内部其他组件的RESTful请求的时候,可以找到相应的组件应用。因此,Openstack项目中例如Nova、Cinder、Neutron、Swift等主要子部件中,都包含了自己的Paste.Deploy的配置文件Paste.ini,以完成功能在服务端的注册。Paste.Deploy配置文件的格式如下:

[type:name]

其中,方括号括起的Section声明一个新Section的开始,Section的声明由两部分组成,Section的类型(Type)和Section的名称(Name),如:[app:main]等。Section的Type可以有:app、composite、filter、pipeline、filter-app等。每个Section中具体配置项的格式就是基本的ini格式: key = value ,所有从PasteDeploy配置文件中提取的参数键、值都以字符串的形式传入底层实现。以Nova组件的Paste.ini文件中的部分进行说明:

此外,PasteDeploy的配置文件中使用“#”标注注释。

(3)动态加载是指程序在开始运行的时候再将所需要的库文件以及代码加载到内存中,而不是在运行开始之前就将所有的代码加载到内存里。这样做的目的是为了减轻内存压力,使程序运行速度加快。动态加载技术在云计算中的应用十分重要:云计算平台结构复杂,代码量在千万行以上,虽然Openstack项目以分布式的方式部署在各个节点,但使用动态加载技术仍然十分有意义。

对于Openstack各个项目组件来说,调用公用的函数库,例如访问数据库操作,鉴权操作以及相互之间调用各项服务的API的时候,都需要先将对应的函数库加载到自己的代码中,然后才能使用这些函数完成相应的操作。

对于Openstack的监控组件Ceilometer来说,动态加载还有更重要的意义:Ceilometer分布式的部署在Openstack集群的不同节点,Ceilometer的不同插件监控的部件也不相同,如果所有节点上都全量加载Ceilometer的所有组件的话就会造成性能下降和资源不必要的浪费,另外,部署在不同节点上的相同组件,因为物理环境不同需要加载的插件也不相同。因此,Ceilometer监控组件使用动态加载的方式,可以在不同的节点上按照需求,加载不同的监控插件。

Openstack项目就采用了Stevedore库来实现动态加载以及创建发布Python包。它对Setuptools库有依赖关系。Python Enterprise Application Kit(PEAK)项目中的子项目Setuptools是对Python 标准库中的Distutils模块的增强,而Stevedore是对Setuptools的简化,更加方便了创建和发布Python包。

Stevtedore实现程序动态载入插件的过程主要分为三个部分:插件函数功能的实现,插件注册,以及插件的动态载入。插件的实现和正常的函数功能的编写没有什么区别,继承公共接口后,在指定的函数名下完成对相应特性的实现。

插件注册的过程是在Setuptools的相关文件中注册,注册的格式为:

namespace=

插件名=相关函数实现位置:函数名

...

在Openstack项目的实例中,只有在setup.cfg中完成了相应插件的注册,才能被Stevedore库所识别。因此,每个组件对外所提供的接口在组件的相应的setup.cfg中都明确地给出,setup.cfg文件也就成为快速熟悉组件的“项目地图”。

在代码中将steverdore库引入后,使用stevedore.driver.插件函数名即可完成插件的载入。

[1]李阿妮,张晓,赵晓南,等.面向IaaS的云计算系统可用性评估[J].计算机科学,2016,43(10):33-39.

[2]梁宇,杨海波,李鸿彬,等.基于OpenStack资源监控系统[J].计算机系统应用,2014,23(4):44-47.

[3]Wang Y,Li X. Achieve high availability about point-single failures in OpenStack[C]// International Conference on Computer Science and Network Technology. IEEE,2015.

[4]王姜,余萍,曹春,等.开放网络环境下的程序设计:从RPC到REST[J].计算机工程与应用,2013,49(17):30-37.

[5]Ismail M A,Ismail M F,Ahmed H. Openstack cloud performance optimization using linux services[C]//Cloud Computing (ICCC), 2015 International Conference on. IEEE,2015:1-4.

[6]Fielding R T. Architectural styles and the design of network-based software architectures[D]. University of California,Irvine,2000.

[7]Salvadori I,Siqueira F. A Maturity Model for Semantic RESTful Web APIs[C]//Web Services (ICWS),2015 IEEE International Conference on. IEEE,2015:703-710.

猜你喜欢

调用插件组件
无人机智能巡检在光伏电站组件诊断中的应用
Kistler全新的Kitimer2.0系统组件:使安全气囊和安全带测试更加可靠和高效
基于CTK插件框架的太赫兹人体安检系统软件设计
一种嵌入式软件组件更新方法的研究与实现
自编插件完善App Inventor与乐高机器人通信
通用(OA)办公自动化系统的组件运用
核电项目物项调用管理的应用研究
基于OSGi的军用指挥软件插件机制研究
系统虚拟化环境下客户机系统调用信息捕获与分析①
基于jQUerY的自定义插件开发