NOSQL领域的SQL“基因”:N1QL基础介绍

来源:互联网 发布:文字和符号的区别 知乎 编辑:程序博客网 时间:2024/05/21 17:23

NoSQL 对于关系型世界严格的schema也有了适应。关系数据库通过SQL查询语言灵活的查询和使用数据。Couchbase最新的4.0版本,已经增加了上述的SQL“基因”的支持。在Couchbase上使用SQL语言,即保留了JSON文档灵活的数据模型,又支持了强大的SQL语言。N1QL, 是目前针对JSON数据最强大的表达式语言。JSON和SQL的组合使我们在这个新的数据时代有了更简单的编程方式和快速构建企业数据应用的利器。

为什么要在Couchbase中加入SQL“基因”?

  • SQL是最强大的数据查询方式,SQL发明至今已有40年。虽然它同期的其他语言已经不在活跃,但是SQL目前仍然持续成为许多现代的数据处理平台的选择 

  • SQL 已经是不同数据工具和平台数据查询使用的事实标准,广泛被数据可视化工具,企业报表,ETL和分析应用所使用

  • 因为逾40年的历史,拥有广泛的使用者。

NoSQL 对于关系型世界严格的schema也有了适应。关系数据库通过SQL查询语言灵活的查询和使用数据。Couchbase最新的4.0版本,已经增加了上述的SQL“基因”的支持。在Couchbase上使用SQL语言,即保留了JSON文档灵活的数据模型,又支持了强大的SQL语言。N1QL, 是目前针对JSON数据最强大的表达式语言。JSON和SQL的组合使我们在这个新的数据时代有了更简单的编程方式和快速构建企业数据应用的利器。

下载包含N1QL的couchbase 4.0 beta版本: http://www.couchbase.com/nosql-databases/downloads#PreRelease


N1QL的第一印象:

使用N1QL,你拥有了表达形式的查询语言和查询引擎, N1QL使用了新的索引机制— global secondary indexs

如下是一个N1QL的例子,应该看起来看熟悉

SELECT * FROM bucketWHERE bucket.quantity>100 OR bucket.price < 9.95

看起来和SQL很相似对么?确实语法表达上非常类似,但是从底层实现来看N1QL还是有很多独到之处。

  • N1QL 是SQL+JSON的组合: Couchbase Server是文档数据库,提供了灵活的数据模型。 在JSON文档上使用SQL让开发变得异常简单。N1QL不仅支持复杂的SQL能力,例如跨文档的连接 Join操作,还提供了专门针对Json 数据的嵌套格式,例如NEST 和UNNEST操作。 

  • N1QL 提供了良好的性能保障,因为包含了新的强大的索引机制- GSI: Global secondary indexes 有极好的低延迟和扩展性。GSI提供了最低的扫描延迟以满足现代数据应用的需求。

  • N1QL 使用新的多维度扩展模型:N1QL的查询服务和 索引服务(global secondary indexes)从架构设计上就是和couchbase本身的数据操作是完全独立的,查询服务,数据服务,索引服务都是相互独立,可以独立的选择水平扩展或垂直扩展;而不像传统的关系数据库或者其他NoSQL一样,从数据操作到索引到数据查询工作负载都是一样的扩展模型。

我来详细讲解一下上述三个N1QL的特性:

N1QL: SQL+JSON vs 关系数据中的SQL

关系数据库的SQL操作数据表和列,需要定义表的schema。但N1QL,所有的查询针对JSON数据,无需明确的表定义,也无需担心数据结构的变更。 

N1QL 会自适应JSON文档的结构,不像SQL,数值型的属性,会被参考引用到的数据,在N1QL中也可以missing。你可以在你的query表达式中,让不包含属性的文档不返回,或者只有当属性值存在才能查询该属性。例如如下方式:

SELECT * FROM bucket b1WHERE b1.quantity>100 OR(b1.price IS NOT MISSING AND b1.price < 9.95)

N1QL的另一个重要特性是,N1QL返回的结果集是JSON格式,如下显式;所以你可以使用 Joins,Nest,Unnest操作对结果进行处理加工。

"results": [        {            "beer_name": "Benchwarmer Porter",            "brewery_name": "Cooperstown Brewing Company",            "country": "United States"        },        {            "beer_name": "Old Jubilation Ale",            "brewery_name": "Avery Brewing Company",            "country": "United States"        }, ...

对于使用经典报表,数据可视化工具或者ETL工具的开发人员,好消息是您可以使用ODBC/JDBC drivers来从N1QL取得熟悉的“行列式”查询结果集;您可以在如下链接下载N1QL的jdbc和odbc驱动器,http://www.simba.com/couchbase/couchbase-odbc-jdbc-connectivity-solutions-beta-now-available;

你现在已经可以使用Tableau,excel或者informatica 工具利用odbc/jdbc driver来访问couchbase并用N1QL进行数据查询!快试一下吧!

使用新的 Global Secondary Indexing (GSI)完成高性能的数据查询

在Couchbase4.0版本中,除了增量Map-Reduce视图和空间索引外,我们还增加了新的强大的二次索引功能GSI ,GSI设计的目的就是为了满足性能要求高数据查询比例高的大数据应用,GSI通过独特的架构设计,最小化了分布式索引scatter-gathers的性能开销(下面会说明),以达到最好的查询性能。

GSI 使用了couchbase4.0的多扩展性的特性,下面会进行介绍。而且GSI底层的数据存储是缓存使用的Couchbase的新一代存储ForestDB。

在下图中,简要的说明了一个普通查询的执行步骤

  • 不使用GSI进行的查询:左图示例,不适用GSI的情况下,索引是分布式的,每个节点上维护自己的数据分区所对应的索引分区;一个查询的执行计划是首先通知N个节点在本节点的索引上查找满足条件的记录(scatter),然后从N个节点上聚集结果集(gather),最后将结果集合并一同返回查询结果给客户端。

  • 使用GSI进行的查询: 右图所示,无需scatter-gather的过程,查询首先在一个节点上进行索引查询,然后返回命中的记录(索引和数据分离,不再相同的节点上)。



创建和管理GSI非常简单,如果熟悉关系数据库的索引:

CREATE INDEX friends_indexON user_profiles(friends.id)WHERE type=”user profile”USING GSI;

新的扩展模型: 多维度扩展能力

解释什么是多维度扩展,让我们先看一下couchbase4.0的节点架构:在4.0版本中,每个节点都包换一个集群管理器,数据服务,索引服务,和查询服务,同时还有存储层和缓存层。


以下是每个组件的功能详述:

  • Cluster Manager(集群管理器):负责集群层的操作,节点加入或者退出集群,或者数据的重分布都是由集群管理器来控制。 

  • Data Service (数据服务):负责核心的数据操作,提供get/set API 支持基于Key值的查询。Data Service也包含视图引擎:基于Map-Reduce的增量更新的数据视图索引(在4.0版本以前是唯一的索引方式,4.0版本后可以还可以使用Global Secondary Index)。

  • Index Service(索引服务):管理新的global secondary indexes 索引机制,提供给N1QL使用。 

  • Query Service(查询服务):管理N1QL的查询接口,接收和执行数据查询命令,并将结果集返回给应用。

  • 所有的服务都有自己的存储和缓存层。

  • 所有的客户端和ODBC,JDBC驱动器都包含一个“cluster map”,告知API那个节点上有他们请求的数据,以保证最有效的数据访问和最低的延迟。

即使所有节点上都包含相同的组件,使用新的多维度扩展模型,我们可以灵活的选择在某个节点上开启或者关闭某项或几项蓝色的服务(data service,index service,query service),然后在单独的zone上 进行某项服务的scale out 或者scale up。所以可以根据工作负载的情况来为不同的zone选择合适的硬件环境。例如给query service配置CPU资源更好的节点。

您也可以像部署3.0版本一样来部署集群,即给整个集群的全部节点选择一样的硬件,在全部节点上启用一致的服务,这是我们统一的旧的水平扩展模式;但实际上,不同的工作负载,例如核心的数据get/put操作,和数据索引检索,以及数据查询引擎的工作,是完全不同的资源要求和开销。所以在所有的节点上共享资源部署所有的服务并不完全是最优化的资源分布和利用情况,未必能保证数据使用和查询的最好性能。

这个新增的多维度扩展模型使得我们可以将整个集群分成不同的“区域”-zone,在不同的zone上运行独立的服务(数据,查询后者索引),可以根据每个服务的资源要求分配对应的合适硬件。你可以将最好的硬件分配给查询服务或者索引服务(一般有更高的CPU要求),同时还能继续保持数据基本操作的高吞吐和低延迟。

在下图中,这个集群包括3个不同的zone,分别运行数据服务,索引服务和查询引擎服务。每个节点上灰色的部分表示这个节点上禁用的服务。


总结.....

这篇博客给大家从架构上介绍了Couchbase4.0 最重要的模块N1QL,数据查询语言和查询引擎;为更深入的了解和操练,以下是在线资源和产品下载链接:

1)下载Couchbase Server 4.0:http://www.couchbase.com/nosql-databases/downloads#PreRelease

2)N1QL的在线文档:http://n1ql.couchbase.com/




0 0