如何提升关键词排名软件,揭密首个面向IaaS的查询言语:ZStack Query Language(ZQL)

搜索引擎本身的产品,以占我国国内搜索引擎市长/市场份额70%的百度为例,百度有几个重要的自己的产品,其权重非常高。在关键词搜索结果中,排名往往占据主页。包括百度知道、百度贴吧、百度百科、百度文库、百度经验、百度照片、百度地图我的建议是,阿里巴巴和企业网站一起推广,因为对于一个正规企业来说,网站是必不可少的。另外,如果企业网站做好SEO,在同行业的竞争中优势是很明显的。

为了简化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的count();

经由过程fields参数指定要返回的字段,相似SQL的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’ (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的uuid,name from …的功用,可以在资本名后指定字段名,多个字段名用逗号断绝,比方:

query vminstance.uuid,name,cpuNum

该查询返回一切虚拟机的UUID、称号以及CPU数目。

除了query关键字,查询也能以count和sum关键字开头,前者返回满足查询前提资本的总数,后者可以对资本的某个字段举行乞降。比方:

vminstance where cpuNum > 8

返回体系中CPU数目凌驾8核的虚拟机的总数。

sum vminstance.memorySize by name where cpuNum > 8 

用虚拟机名字对CPU核数凌驾8个的虚拟机举行分组,对它们的memorySize字段举行乞降。假如体系中有两个10CPU8G的虚拟机都名为webvm,则乞降后返回webvm虚拟机总内存运用数为16G。翻译成SQL则为:

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分组,统计各地区中各集群中虚拟机的数目。

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关键字对查询语句定名,比方:

SEO、网站优化和SEM分得清吗?

网站seo优化技术是通过美化网站内容,改善结构和改善用户体验来推广网站。如果使用主动优化技术,则排名会更长,成本也会降低。互联网行业必须增加曝光率,这是吸引更多用户组,用户单击网站并最终带来流量以获利的唯一方法。长尾关键词是除了相对核心关键词以外最重要的短语,长尾关键词主要由核心关键词和相关关键词组合而成,可以在网站上获得更多的流量。

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从句)

在ZStack中运用了两种数据库:关联数据库寄存元数据,时序数据库寄存监控数据。因为差别数据库查询体式格局不一样,在ZQL之前,用户要查询一个资本的监控数据,须要先经由过程Query API取得该资本的元数据,再经由过程ZWatch的查询API取得其监控数据。比方要查询一个名为webvm虚拟机的CPU运用率监控数据,要实行以下API:

QueryVmInstance fields=uuid name=webvm

GetMetricData namespace=ZStack/VM metricName=CPUUsedUtilization labels=VMUuid=QueryVmInstance返回的UUID offsetAheadOfCurrentTime=60

ZQL经由过程return with子句处理这个问题。return with是一种插件机制,它许可子体系 经由过程插件将自身的查询前提注入ZQL中,ZQL会先实行关联数据库查询,将满足前提资本的原数据查询出来后,再将资本的主键(primary key)作为输入前提挪用完成return with子句的插件,末了将插件的查询效果一并返回给ZQL的挪用者。

上述查询虚拟机监控数据的需求可以经由过程一条ZQL语句完成:

query vminstance.hostUuid,uuid where name = ‘webvm’ return with (zwatch{resultName=’webvm-cpu’,metricName=’CPUAllUsedUtilization’,offsetAheadOfCurrentTime=60})

返回:

{

“results”: [

{

“inventories”: [

{

“hostUuid”: “f8271f58468b4281a212a43e530b5535”,

“uuid”: “05781209d24341ac84fc055ae71820ac”

}

],

“returnWith”: {

“webvm-cpu”: [

{

“labels”: {

“VMUuid”: “05781209d24341ac84fc055ae71820ac”

},

“time”: 1533280402,

“value”: 0.8

},

{

“labels”: {

“VMUuid”: “05781209d24341ac84fc055ae71820ac”

},

“time”: 1533280462,

“value”: 0.8

}

]

}

}

],

“success”: true

}

这里我们用一条ZQL语句中即返回了我们感兴趣的元数据字段:uuid和hostUuid,也返回了该虚拟机的监控数据。仔细的读者已注重到我们在ZWatch查询字段中指定了参数resultName=’webvm-cpu’,而且在返回的JSON map中监控数据的key也是webvm-cpu。跟named as关键字一样,这是为了实行多条ZWatch查询子句时轻易检索返回效果预备的。 ZStack UI运用异常庞杂的ZQL查询语句,比方在TOP 5页面,一条ZQL查询包括多达13个ZWatch查询:

ZQLQuery zql=”query vmInstance.uuid,name where zoneUuid=’89e148fb667c404dbc5309a2e956fa28′ hypervisorType=’KVM’ type=’UserVm’ state=’Running’ return with (zwatch{resultName=’CPUAllUsedUtilization’,metricName=’CPUAllUsedUtilization’,offsetAheadOfCurrentTime=60,period=6,functions=’average(groupBy=\”VMUuid\”)’,functions=’top(num=5)’},zwatch{resultName=’MemoryUsedInPercent’,metricName=’MemoryUsedInPercent’,offsetAheadOfCurrentTime=60,period=6,functions=’average(groupBy=\”VMUuid\”)’,functions=’top(num=5)’},zwatch{resultName=’MemoryFreeInPercent’,metricName=’MemoryFreeInPercent’,offsetAheadOfCurrentTime=60,period=6,functions=’average(groupBy=\”VMUuid\”)’,functions=’top(num=5)’},zwatch{resultName=’DiskAllReadOps’,metricName=’DiskAllReadOps’,offsetAheadOfCurrentTime=60,period=6,functions=’average(groupBy=\”VMUuid\”)’,functions=’top(num=5)’},zwatch{resultName=’DiskAllWriteOps’,metricName=’DiskAllWriteOps’,offsetAheadOfCurrentTime=60,period=6,functions=’average(groupBy=\”VMUuid\”)’,functions=’top(num=5)’},zwatch{resultName=’DiskAllReadBytes’,metricName=’DiskAllReadBytes’,offsetAheadOfCurrentTime=60,period=6,functions=’average(groupBy=\”VMUuid\”)’,functions=’top(num=5)’},zwatch{resultName=’DiskAllWriteBytes’,metricName=’DiskAllWriteBytes’,offsetAheadOfCurrentTime=60,period=6,functions=’average(groupBy=\”VMUuid\”)’,functions=’top(num=5)’},zwatch{resultName=’NetworkOutBytes’,metricName=’NetworkOutBytes’,offsetAheadOfCurrentTime=60,period=6,functions=’average(groupBy=\”VMUuid,NetworkDeviceLetter\”)’,functions=’top(num=5)’},zwatch{resultName=’NetworkInBytes’,metricName=’NetworkInBytes’,offsetAheadOfCurrentTime=60,period=6,functions=’average(groupBy=\”VMUuid,NetworkDeviceLetter\”)’,functions=’top(num=5)’},zwatch{resultName=’NetworkOutPackets’,metricName=’NetworkOutPackets’,offsetAheadOfCurrentTime=60,period=6,functions=’average(groupBy=\”VMUuid,NetworkDeviceLetter\”)’,functions=’top(num=5)’},zwatch{resultName=’NetworkInPackets’,metricName=’NetworkInPackets’,offsetAheadOfCurrentTime=60,period=6,functions=’average(groupBy=\”VMUuid,NetworkDeviceLetter\”)’,functions=’top(num=5)’},zwatch{resultName=’NetworkOutErrors’,metricName=’NetworkOutErrors’,offsetAheadOfCurrentTime=60,period=6,functions=’average(groupBy=\”VMUuid,NetworkDeviceLetter\”)’,functions=’top(num=5)’},zwatch{resultName=’NetworkInErrors’,metricName=’NetworkInErrors’,offsetAheadOfCurrentTime=60,period=6,functions=’average(groupBy=\”VMUuid,NetworkDeviceLetter\”)’,functions=’top(num=5)’})”

上例是在ZStack CLI中实行时的例子,运用\对引号转义

当资本迥殊多时,时序数据库查询机能大概成为多条ZWatch查询的机能瓶颈,故return with会经由过程并发的体式格局实行插件,默许并发度为10。比方上述例子中的13条ZWatch查询会在10个线程中并发实行。用户可以经由过程全局设置zql.returnWith.concurrency变动并发度,比方

UpdateGlobalConfig category=query name=zql.returnWith.concurrency value=15

限制查询 (restrict by从句)

ZStack的企业治理模块包括一个功用,可以对治理绑定某个地区,使得该治理员只能治理该地区内的资本,这就要求我们的ZQL对该治理员的查询要求只返回与其绑定戋戋中的资本。

关于虚拟机如许的资本,其元数据自身就带zoneUuid字段用于标识地点地区。但关于eip如许的资本,其元数据并没有任何字段示意地区属性,地区属性是由其地点的三层收集或绑定的虚拟机肯定的。比方要查询某个地区内的eip,可以运用:

# 经由过程与虚拟机的绑定关联查询

query eip where vmNic.vmInstance.zoneUuid = ’52fdad0a2c0d4131a6c0fc6c1b7141a6′

# 经由过程地点三层收集肯定

query eip where vip.l3Network.zoneUuid = ’52fdad0a2c0d4131a6c0fc6c1b7141a6′

不管那种体式格局,都须要挪用者相识晓得eip跟zone之间的关联关联,这对API的运用者提出了异常刻薄的要求。ZQL经由过程restrict by从句处理这个问题。跟return with从句相似,restrict by也是个插件框架,它许可别的效劳经由过程插件解读restrict by从句中指定的前提,向生成的SQL中注入分外前提。比方上面的eip例子经由过程restrict by从句可以写成:

query eip restrict by (zone.uuid=’52fdad0a2c0d4131a6c0fc6c1b7141a6′)

这里挪用者无需晓得eip跟zone之间的逻辑关联,restrict by的途径插件会自动盘算二者的逻辑关联,并生成对应的SQL join从句。这里eip既可以经由过程地点三层收集,也可以经由过程绑定的虚拟机肯定和地区的关联,插件会自动盘算途径权重,运用权重最高的途径生成SQL语句。

关于eip这个例子,插件会拔取经由过程三层收集的关联生成SQL语句。因为eip大概没有跟虚拟机绑定,但其肯定处于某个三层收集,故三层收集这条途径的权重更高。

restrict by支撑多个前提,经由过程逗号分开,多个前提之间是AND关联。

除了给ZQL挪用者运用外,restrict by插件在ZStack内部也被别的效劳普遍运用。比方账号体系会经由过程插件在一般账户挪用ZQL的时刻注入跟账号关联的SQL语句,使得一般账号只能查询到属于该账号的资本;又比方SNS效劳会经由过程插件注入语句让ZQL只能查询到非体系范例的吸收端。

将来

ZQL为ZStack供应了一种相似SQL的IaaS查询言语,而且可以经由过程return with插件框架跟别的非关联数据库体系举行查询整合。在将来的版本中我们还会继承雄厚其功用,现在有两个方向:

filter by从句

虽然return with的ZWatch插件能让我们在查询资本元数据的同时查询其监控数据,但还不能将监控数据作为元数据的查询前提,比方没法经由过程一条ZQL完成查询某个集群中一切CPU运用率凌驾90%的虚拟机。这在将来版本中会经由过程filter by从句完成,比方:

query vminstance where clusterUuid = ’33e26bd547d149fbb190436cc9aca824′ filter by (zwatch{metricName=’CPUAllUsedUtilization’, offsetAheadOfCurrentTime=60, threshold>90})

一样,filter by从句会完成成相似return with的插件框架,用于整合非关联数据库的查询前提。

智能CLI

ZQL有大批的从句,每一个ZStack又有大批的可查询字段,现在ZStack CLI可以对Query API的可查询字段举行补全,但ZQL还临时没法补全。将来版本中,我们会对CLI举行在加强,使其对一切查询前提可以举行提醒和补全。

对于老网站而言,做目标关键词排名到首页的操作,就变得相对的容易,主要原因就是老站点,具有一定的搜索引擎信任度。关键词竞争度高
对于老网站,具有一定权重的站点,做关键词竞争度高的词,你可以通过如下小方法:
① 栏目页·置顶相关目标URL。
② 站外自有网站,比如:个人博客,适当的增加该目标关键词的超链接,如果日均搜索量异常大的话,可以将其,防止在博客的友情链接处。
③ 利用新媒体账号,发布相关内容,适当的引导对目标URL的搜索点击。

seo优化-智能名片品牌有哪些?互联网创业加盟首选!

本网站部分素材来源网络,如有侵犯,请联系删除!作者:wesipy,如若转载,请注明出处:http://www.kpxlt.com/archives/31918

(0)
wesipy的头像wesipy小灵通用户
上一篇 2020年11月7日 上午3:26
下一篇 2020年11月7日

相关推荐

QQ:576598726

QQ:576598726