虚拟数据库(Virtual Database–VDB) 是将一个或多个物理数据源组合起来以提供更简单的数据集成解决方案,它提供了包含组件的容器,这些组件用来集成不同数据源的数据,并通过一致的 API 来访问它们。这些物理数据源包括: JDBC 数据源、CSV 文本文件、数据表,甚至可以是 Web services。这种技术被称为是“数据联邦” -Data federation。数据联邦技术提供了一种为数据提供抽象的数据接口的能力。这些多个数据源组成的虚拟视图可以使数据消费者(应用)不需要知道数据的物理位置、数据结构和保存方式。
与其它数据集成技术相比,数据联邦技术的明显优势在于获取数据的方便性和实时性。现在很多企业都在实现 SOA,SOA 的灵活性和敏捷性要求组织提供数据时应该具有更少的时延。以前的利用批量任务或者 ETL 的方式创建数据集市和数据仓库的方式的实时性都不太好,在很多应用场景中被数据联邦技术所取代。
但是数据联邦技术访问数据是通过一个“联邦”视图(federation view)来实现的,视图是实时的。随着企业数据量的增大,性能问题是所有数据集成(Data Integration tools)都面临的问题,但是由于设计上的根本缺陷,数据联邦在这方面虽有很大进展,但是仍无法和另外一些数据集成技术相比。这种缺点制约了它在数据集成领域的适用性,虽然很多领域都使用了数据联邦技术,但是在关键的核心业务系统它的应用非常少。
目前已实施数据联邦项目的特点如下:使用简单的有限的数据源,数据结果集不大,只读性的数据访问,数据质量要求简单。比较典型数据联邦产品有:BEA 的 AquaLogic Data Services Platform、IBM 公司的 Federation Server、Software AG 公司的 Enterprise Information Integration、Sybase 的 DataFederation 以及 Red Hat 公司的 JBoss MetaMatrix,其开源实现即 Teiid。
什么是 Teiid?
Teiid 是一个数据虚拟化系统,由工具、组件、和服务组成,用于创建和执行双向数据服务,它提供了针对虚拟数据库(VDB)执行查询的运行时,使应用程序能够使用来自多个异构存储的数据。通过抽象和联邦技术,实现分布式数据源的实时数据访问和集成,无需从记录系统中复制或移动数据。利用 Teiid, 用户可以用设计器或者动态 VDB 等功能来创建 VDB,然后以联邦方式来访问数据了。如图 1-2。
Teiid 中的模型
在计算机科学中,模型是信息结构集合的表现形式。常见的模型有关系模式,它定位了由列和数据记录构成的表格。另一种常见的模型是 XML 模型, 它定义了层级的数据集合。在 Teiid 虚拟数据库也有模型的概念,模型被定义为实体和实体之间的关系,实体代表着被集成且暴露给应用的信息,必须被完整地定义。
在 Teiid 中使用两大类模型 — 源模型(Source Model) 和视图模型 (View Model)。所谓源模型定义了数据源所包含的信息的结构化和数据特征。Teiid 将源模型中的信息映射到不同数据源中的信息,从用户的角度上看,就如同单一的数据源一样。
在源模型之外,Teiid 还提供了定义视图模型的功能。视图是模型之间的变,通过视图模型可以在物理层之上再定义一个抽象层,因此呈现给用户的信息可以更贴近商业需要,而不是其原始的物理存储。这些商业视图可以以多种形式呈现:关系型、XML 或 Web Services 等等。
总之,源模型表示的是物理数据源的结构和特征,而视图模型则表达的是要呈现给应用的抽象数据结构的结构与特征。
模型必须处于有效状态,这样 VDB 才能将之用于数据访问。对单个模型的验证意味着该模型必须是处于自洽(self-consistent)和完整状态,也就是该模型无任何缺失或引用不存在的实体。对多个模型的验证将会检查所有内部模型的依赖是存在且可分解的。
Teiid 的组件
Teiid 包括以下组件:
各组件的关系如下:
此外在 Teiid 发布包中还包括一些工具,主要有:
在 Teiid 有两种方法来创建 VDB 。你可以创建动态 VDB,这种 VDB 由简单的 XML 文件定义,该 XML 文件定义了它想要集成的数据源,并通过 JDBC 提供了访问。用户编写针对该 VDB 的查询,可以使用所有定义的数据源,就象是用单一的数据源一样。但是动态 VDB 不提供视图抽象层。
你也可以使用 Teiid 设计器来创建 VDB。它不但可以用来定义数据源模型,并由此导入元数据和统计资料(statistics),还允许在这些数据源之上定义关联和 XML 视图。这可以让用户对底层的物理数据结构进行抽象,暴露出所需的信息结构给应用程序使用。
VDB 必须总是处于一种完整状态(complete state),这意味着所有的信息都包含在 VDB ,不能有外部的依赖。当定义好 VDB 之后,它必须被部署到 Teiid runtime 中,如果部署过程中没有错误,而且底层的数据源被正确配置,VDB 就可以被客户应用访问了。一旦 VDB 被部署,就可以通过 JDBC-SQL,SOAP (Web Services), SOAP-SQL, 或者 XQuery 进行访问。
至此,我们介绍了 Teiid 的一些重要概念,接下来我们将学习如何创建和发布一个虚拟数据库。so let’s begin!
下载和安装 Teiid
为了运行 Teiid ,你需要先在系统里安装下面组件:
一切就绪之后,就可以下载安装 Teiid 运行时了,目前最新版本是 8.2.0 (teiid-8.2.0.Final-jboss-dist.zip),你只需要将所有的内容解压到 JBoss AS 的安装目录中去即可。 由于 Teiid 和 JBoss AS 的目录结构完全一样,因此 Teiid 会被归并到相应的目录中。建议下载 Admin Console 和 Admin Shell 这两个管理工具包,安装方式和 runtime 类似。
用下面的命令来启动 JBoss AS 的 Standalone 模式:
要进入Admin Console 必须添加管理用户,运行 add-user.bat 并输入:
Enter the details of the new user to add.
Realm (ManagementRealm) :
Username : raylinn
Password :
Re-enter Password :
About to add user ‘raylinn’ for realm ‘ManagementRealm’
Is this correct yes/no? yes
Added user ‘raylinn’ to file ‘C:\jboss\standalone\configuration\mgmt-users.properties’
Added user ‘raylinn’ to file ‘C:\jboss\domain\configuration\mgmt-users.properties’
Press any key to continue . . .
现在你可以在浏览器中输入 http://localhost:8080/ 进入到 JBoss 欢迎界面,点击界面上的 “Administration Console” 链接就看到管理界面,如图1-5所示:
。
建立虚拟数据库
在 Teiid 中,你可以用设计器或者通过称为动态 VDB 的 XML 文件来创建虚拟数据库。我们首先了解如何使用动态 VDB 的方式,稍后我们会学习使用设计器。注意:如果你的应用需要在数据源之上使用视图层,你必须使用设计器。
我们用投资组合来作为示例,演示 Teiid 如何集成多个数据源,并使用单个查询从多个数据源中返回结果。使用数据联邦技术很容易就能集成新的数据源,而不需要暴露任何访问信息。
在这个例子中,我们会用到两个数据源: 存储在 H2 数据库的帐户信息(关系型),以及在保存在 CSV 文件中的股票价格(非关系型)。我们会创建一个动态 VDB,名为 DynamicPortfolio,在该 XML 文件中为每个数据源定一个模型:即 Account 和 MarketData。当你将这个 VDB 将部署到 Teiid 运行时,应用程序就能够使用 JDBC 来访问它。
查询语句会关联模型 Accounts 和 MarketData 中的数据,在后台,Teiid 会同时访问关系型和非关系型数据源,计算出投资利润,并返回结果。DynamicPortfolio 的内容如下(portfolio-vdb.xml):
这里我们来解释一下上面的 VDB XML 结构:
当然我们还需要为这两个数据源建立其 JNDI 查找,这样动态 VDB 才能获得数据库连接信息。如何编写JNDI 查找的 XML 文件可以参考 docs/teiid/datasource 目录中的例子和说明。不过注意 marketdata 的JNDI 查找是要归并到 standalone-teiid.xml 配置文件中,这和数据库的不太一样。
一旦 JNDI 查找部署成功,就可以部署动态 VDB 了,只需要将 “portfolio-vdb.xml” 拷贝到以下文件夹中,
该动作会触发 Teiid 运行时自动加载 VDB,同时还会验证数据源是否可用,一旦成功加载,在 Admin Console 中 VDB 状态将显示为 “Active”。
除了这种方式外,你还可以使用 Admin Console 或者 Admin Shell 来将虚拟数据局部署到远程服务器或者群集上,这里给出用命令行方式的部署方法: