加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

揭密首个面向IaaS的查询说话:ZStack Query Language(ZQL)

发布时间:2018-08-17 04:05:00 所属栏目:移动互联 来源:ZStack研发团队
导读:技能沙龙 | 邀您于8月25日与国美/AWS/转转三位专家配合切磋小措施电商拭魅战 为了简化UI事变并为运维职员提供一种越发机动的资源查询方法,ZStack在2.6版本中推出了首个面向IaaS的查询说话 ZStack Query Language,简称ZQL。 配景 IaaS打点着海量的数据中心资
副问题[/!--empirenews.page--] 技能沙龙 | 邀您于8月25日与国美/AWS/转转三位专家配合切磋小措施电商拭魅战

为了简化UI事变并为运维职员提供一种越发机动的资源查询方法,ZStack在2.6版本中推出了首个面向IaaS的查询说话 —— ZStack Query Language,简称ZQL。

配景

IaaS打点着海量的数据中心资源,怎样对这些资源举办机动快速的查询是运维职员面对的一个困难。在以往的IaaS软件中,每每只对单个资源的某些字段提供有限的API查询支持,譬喻可以通过假造机的IP字段查询,这不敷够也不机动。运维职员在做伟大查询时每每得绕开IaaS软件直接查询厥后端数据库,这既要求运维职员要相识IaaS资源的内部相关,又带来了数据库误操纵的风险。

从ZStack正式宣布的第一个版本ZStack0.6开始,我们就致力在API层面提供跟数据库级此外查询成果,ZStack的每个资源都包括一个Query API,可以或许通过资源的自身字段以及资源的关联资源字段举办查询。譬喻

QueryVmInstance name~=web-vm state=Running

这里查询全部名字包括web-vm字符串,正在运行中的VM。又譬喻

QueryVmInstance vmNics.eip.vip.ip='22.22.22.22'

EIP是假造机的关联资源,这里查询网卡绑定了EIP为22.22.22.22的假造机。

Query API成果强盛:

用户可以通过count参数返回满意查询前提资源数目,相同SQL的select count(*);

通过fields参数指定要返回的字段,相同SQL的select uuid,name from;

通过sortBy、sortDirection参数指定排序的字段和偏向,相同SQL的order by;

通过start、limit参数实现分页查询,相同SQL的limit和offset。

Query API除了行使利便外,界说也很简朴。措施员在ZStack中增进了一种新资源后,只必要在代码中界说如下class:

@AutoQuery(replyClass = APIQueryVmInstanceReply.class, inventoryClass = VmInstanceInventory.class)

public class APIQueryVmInstanceMsg extends APIQueryMessage {

}

不必要写任何实现,对应资源就具有了Query API。

ZStack内部包括一个Query Service认真处理赏罚全部资源的Query API,将他们翻译成响应的SQL语句,在查询前提中包括关联资源前提时会天生对应的Join子句。

基于Query API, ZStack0.6版本就包括了高出400万个单项查询前提,组合查询前提数为400万的阶乘。极大的利便了运维和伟大UI的计划。但Query API如故包括一些缺陷:

Ø 查询前提之间只能是AND逻辑,无法执行OR逻辑,前提之间也无法加括号实现伟大逻辑组合

Ø 不支持相同SQL中的sub query子句

Ø 单个API只能查询一种资源,查询多种资源时必要挪用多个API

Ø 不支持跟监控体系的查询说话整合

跟着ZStack UI的场景越来越富厚,Query API的限定使得UI端的事变越来越多,许多场景必要多次挪用Query API举办数据组合。譬喻在监控Top 5页面(用于检测体系中CPU、内存、磁盘、收集等资源行使率最高5个资源的页面),必要先回收Query API将假造机、物理机等资源信息查询返来,再挪用监控体系ZWatch的API查询对应的监控数据。

Query API在将来的ZStack版本中会一向保存并维护,厥后端实现已经从原本的Query Service替代成ZQL

ZStack Query Language

行使过闻名issue打点体系JIRA的开拓者都知道JIRA在举办高级搜刮的时辰提供一种查询说话JQL (JIRA Query Language),可以或许行使一种相同SQL的DSL(Domain Specific Language)对JIRA中ticket的各个字段举办高效的查询。ZQL跟JQL相同,也是一种相同SQL的DSL,先来看一个例子:

query vminstance where name='webvm' or vmnics.ip='192.168.0.10' or (vmnics.eip = '172.20.100.100' and (cpuNum >= 8 or clusterUuid in ('fe13b725c80e45709f0414c266a80239','73ca1ca7603d454f8fa7f3bb57097f80')))

在这个简朴例子中,可以看到许多认识的SQL元素,譬喻and/or前提、括号、>=/in操纵符等。ZQL可以看作SQL的一个子集外加ZStack按照自身需求举办的加强的查询说话。它的根基布局如下:

QUERY queryTarget (WHERE condition+)? restrictBy? returnWith? groupBy? orderBy? limit? offset? filterBy? namedAs?

query要害词

一条ZQL语句凡是以query要害字开头,queryTarget暗示要查询的资源或资源字段的荟萃。前面的例子中vminstance代表假造机,譬喻host代表物理机、zone代表地区,全部可被查询的资源都有本身的名称。假如不但愿返回资源的全部字段,只但愿得到资源的一个或多个字段,实现相同SQL的select uuid,name from ...的成果,可以在资源名后指定字段名,多个字段名用逗号断绝,譬喻:

query vminstance.uuid,name,cpuNum

该查询返回全部假造机的UUID、名称以及CPU数目。

除了query要害字,查询也能以count和sum要害字开头,前者返回满意查询前提资源的总数,后者可以对资源的某个字段举办求和。譬喻:

count vminstance where cpuNum > 8

返回体系中CPU数目高出8核的假造机的总数。

sum vminstance.memorySize by name where cpuNum > 8

用假造机名字对CPU核数高出8个的假造机举办分组,对它们的memorySize字段举办求和。假如体系中有两个10CPU8G的假造机都名为webvm,则求和后返回webvm假造机总内存行使数为16G。翻译成SQL则为:

select sum(memorySize) from vminstance where cpuNum > 8 group by name

WHERE从句

ZQL的WHERE从句跟SQL的WHERE从句相同,支持and/or逻辑操纵符、括号组合,前提的较量符支持=,!=,>,>=,<, <=, like, not like, is null, is not null, in, not in,查询前提名为资源的字段名。跟SQL纷歧样的处地址于,ZQL的查询前提可所以关联资源的字段,譬喻:

query vminstance where vmNics.eip.vip.ip='22.22.22.22'

留意where从句前无需写相同SQL的from xx从句,由于query vminstance已经限制了被查询的资源

这里vip跟eip关联,eip跟vmnic关联,vmnic又跟vminstance关联,则我们可以指定vip的IP作为查询前提。这正是ZQL的强盛之处,对付多个关联资源的查询,无需挪用多次API在应用端组合数据,也无需像SQL一样写伟大的join从句,只必要像编程一样通过点号(.)引用另一个资源即可, ZQL的翻译器会自动将跨资源引用翻译成对应的SQL join从句。

WHERE从句可以包括子查询,相同于SQL的sub query成果,譬喻:

query vminstance where vmNics.l3NetworkUuid in (query l3network.uuid where ipRanges.networkCidr='10.1.0.0/24')

这里找出全部CIRD为10.1.0.0/24的三层收集上运行的假造机。

上面这个例子也可以用更简朴的要领实现:query vminstance where vmNics.l3network.ipRanges.networkCidr='10.1.0.0/24',这里只是为了演示子查询成果

GROUP BY、ORDER BY、LIMIT、OFFSET 子句

跟SQL一样,ZQL支持GROUP BY、ORDER BY、LIMIT、OFFSET要害字,以实现分组、排序、分页等成果。

GROUP BY:

通过假造机的地区UUID和集群UUID分组,统计各地区中各集群中假造机的数目。

count vminstance group by zoneUuid,clusterUuid

ORDER BY:

查询全部假造机,行使cpuNum字段降序排序。

1. query vminstance order by cpuNum desc

LIMIT、OFFSET:

行使limit和offset实现分页:

query vminstance limit 100 offset 10

多资源查询

对付多个资源的查询,可以通过多条query查询语句实现,语句之间行使分号脱离,譬喻:

query vminstance where name = 'my-vm';

query host where cpuNum > 10;

query zone;

则一次挪用即可返回三种资源的查询功效。因为返回的功效是一个map的JSON布局,为了利便得到对应语句的查询功效,可以行使named as要害字对查询语句定名,譬喻:

query vminstance where name = 'my-vm' named as 'vm';

query host where cpuNum > 10 named as 'host';

query zone named as 'zone';

则在返回的JSON map中,可以通过vm、host、zone作为key得到对应语句的查询功效。

归并监控查询 (return with从句)

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读