IaaS通过数据库管理和记录了各种资源的信息和数据。是否能从海量和复杂的数据库中找到想要的内容,直接关系IaaS管理员的工作效率。例如我们可能希望从10万个虚拟机里查找一个使用了EIP,并且其EIP地址为10.10.1.10的虚拟机。或者查询当天中午12点以后创建的,带有数据卷的,有一个Volume的Snapshot叫做sp1的,虚拟机的名字叫做My-VM的全部虚拟机(有可能有很多叫My-VM的虚拟机)。请问使用了当前“任何”一款云产品的同学,你们是不是可以想到该怎么做呢?也许不会有答案,因为他们都做不到。
ZStack深度集成了强大的查询功能,提供各种查询资源和查询条件,允许用户使用类似SQL语句的查询方式,到数据库中找到对应的结果。ZStack目前可以提供的单一查询条件超过了400万种。如果再进行条件组合,可以得到查询的方式将会无穷无尽。熟悉bug管理工具JIRA的同学们,你一定会被他界面上展示的查询能力所吸引。ZStack的查询功能就是能够让IaaS的管理界面变的和JIRA一样的强大。
ZStack为了构建强大的查询功能,特别开发了一个Query的架构,和每个资源都进行深度的结合。用户不必编程,ZStack就可以把对应的查询条件转换成查询各种资源的方法,而且还可以生成各种条件的组合查询。让我们来看一些实际的例子吧。在ZStack里,一个Zone的数据结构如下表定义:
FIELD | DESCRIPTION |
uuid | zone UUID |
name | zone name |
description | zone description |
state | zone state |
type | zone type |
createDate | the time the zone was created |
lastOpDate | the last time the zone was operated |
查询Zone的API,叫做QueryZone。如果不加任何条件,QueryZone会返回当前IaaS系统里管理的全部的Zone的信息(包含上表中的所有元素)。不过我们通常会进行一些内容匹配,例如要查询一个名字是 'beijing-zone'的Zone,那我们就可以在zstack-cli命令行工具输入:
QueryZone name=beijing-zone
可以看到我们用了Zone的一个元素‘name’来进行了内容的匹配。除了‘=’操作符,ZStack还支持其他的常见的SQL语法操作,例如'!=', '>', '>=', '<', '<=', 'in', 'not in', 'is null', 'is not null', 'like', 'not like'。
通过名字查询Zone的例子,实在是太简单了。来看一个稍微复杂一点的吧。有可能,我们有一个虚拟机,它的名字叫做‘SanLiHe',我们想知道它是属于哪个Zone的,以及这个Zone的详细信息,那我们该怎么办呢?ZStack是通过“扩展查询”(Expanded Query)来实现的。所谓扩展查询,就是待查询内容的UUID存在于提供的查询条件所在的表中(作为外键),ZStack就可以提供自动的查询能力。这个例子里,虚拟机本身不是Zone的元素,但是Zone的UUID是VM表中的一个外键元素。我们在zstack-cli中输入的查询语句便是:
QueryZone vmInstance.name=SanLiHe
根据类似的原理,ZStack还支持继续深入的扩展查询。比如我们开头说的,要找一个EIP为10.10.1.10的VM所在的Zone的信息:
QueryZone vmInstance.vmNics.eip.vipIp=10.10.1.10
如果这样的查询条件还不能让你感到满足,让我们来看看下面的这个查询组合吧:
QueryVolumeSnapshot volume.vmInstance.vmNics.l3Network.l2Network.attachedClusterUuids=13238c8e0591444e9160df4d3636be82
它想干什么呢?他是想查询一个Volume的快照,查询的条件是要求这个快照原始Volume所在的虚拟机上的某个网卡所在的L3网络所归属的L2网络挂载在一个UUID是’13238c...’的Cluster上。恩,这需要一些空间的想想能力才能够还原整个场景。这样的例子可能在真是场景中并不多见,但是一旦需要又没有对应能力的时候,就会遇到很大的麻烦。实际中,我们的确会经常遇到一些非常复杂和特殊的查询条件。另外我们也是借这个例子说明一下ZStack查询的能力。
除了超强的查询条件,QueryAPI们还支持各种基本的查询操作,例如,查询组合,查询有限的表项(只想知道名字和UUID),排序,只返回有限的查询结果(例如只返回满足条件的第100到110个虚拟机的内容),所有符合查询条件的结果的数量等等。