数字革命对数据管理系统造成了巨大的破坏。数据的急剧增长,企业存储、管理和理解他们收集的数据比以往任何时候都困难。与此同时,随着数据日益多样化,企业不仅要管理来自不断发展的连接性设备网络的大量结构化数据,还要管理半结构化和非结构化数据。
因此,就需要能够支持多种数据类型的解决方案。这一需求将传统的数据中心转变成了可以高效处理各种大数据的数据管理技术的混合体。这些技术包括关系型数据库、独立的 NoSQL 解决方案和专门处理地理空间数据的扩展,这里就不一一列举了。实际上,Dell 最近研究发现,数据库管理员所负责的基础设施比以往任何时候都复杂,其中有72% 的人表示他们必须支持的数据库数量正在增加。调查还发现,80% 的受访者说他们必须支持多个应用,45% 的受访者说他们必须支持多个用户组,而72% 的受访者说他们的岗位职责总体上不断增加。
与此同时,为了加速应用程序交付及更加直接地响应业务线的需求,开发人员面临的压力也在增加。这就导致了“阴影IT(Shadow IT)”工作——这个术语用于描述在没有IT 领导参与的情况下在组织内构建或使用的IT 系统和解决方案。许多开发人员已经转向了NoSQL-only 数据库解决方案。但是,使用这些技术为新的、专门的应用程序创建本地或异地集群,供它们分析来自社交媒体、移动或应用程序等各种使用图片或图形的数据源的、新的非结构化数据,会引入数据筒仓——使整个数据环境比以往任何时候都更难理解。另外,对企业而言,这也使数据管理更加困难,而且长期来看,更难保证数据的完整性。
在Postgres 中集成“外部数据类型(Foreign Data Types)”
Postgres 有一个针对这一难题的解决方案:一个名为“外部数据封装器(Foreign Data Wrapper,FDW)”的特性。该特性最初由PostgreSQL 社区领袖Dave Page 四年前根据SQL 标准SQL/MED(SQL Management of External Data)开发。FDW 提供了一个SQL 接口,用于访问远程数据存储中的远程大数据对象,使DBA 可以整合来自不相关数据源的数据,将它们存入Postgres 数据库中的一个公共模型。
这样,DBA 就可以访问和操作其它系统管理的数据,就像在本地Postgres 表中一样。例如,使用FDW for MongoDB ,数据库管理员可以查询来自文档数据库的数据,并使用 SQL 将它与来自本地 Postgres 表的数据相关联。借助这种方法,用户可以将数据作为行、列或 JSON 文档进行查看、排序和分组。他们甚至可以直接从 Postgres 向源文档数据库写入(插入、更细或删除)数据,就像一个一体的无缝部署。也可以对 Hadoop 集群或 MySQL 部署做同样的事。FDW 使 Postgres 可以充当企业的中央联合数据库或“Hub”。
基于这些功能,FDW 可以减轻与管理 NoSQL 解决方案所导致的各种数据筒仓相关的痛苦。首先,如果不恰当地处理(许多都没有)使用 NoSQL-only 解决方案的应用程序,就会损害企业数据的长期价值。按 Gartner 报告的说法,“由于没有运用信息治理策略和规划,到 2017 年,存储在 NoSQL DBMS 中的数据,50% 都是对企业有害的。”[ i ]
Postgres FDW 可以帮助 DBA 和开发人员保证数据完整性,提高开发人员效率,扩展现有资源的价值。
保证数据完整性
NoSQL-only 数据库不遵从 ACID;因此,跨数据集实现健壮的数据完整性(企业通常都需要他们的数据集具有完整性)就需要复杂的应用程序开发。此外,由于 NoSQL-only 解决方案只存储数据而不处理数据,所以数据必须交由应用程序分析。这意味着,应用程序(及每个应用程序开发人员)负责高效地访问数据、实现业务规则以及保持数据一致性——这降低了系统之间的一致性,增加了 DBA 将数据部署到应用程序的复杂度。
而且,每一种 NoSQL 数据库产品都使用一种不同的数据表示方式和数据访问 / 操作语言,这进一步增加了复杂度,这也是为什么组织可能会发现他们使用了多种互不兼容的 NoSQL 解决方案。这样,就不得不将数据处理从数据库中拿出来放在应用程序中——尤其是在缺少 ACID 遵从性的情况下——这可能会有问题,因为:
- 创建了更多的数据筒仓:由于每个应用程序都需要自己的数据存储,企业数据分散到筒仓中,管理松散,使得企业很难或不可能有效地整合、信任并使用那些存储在多个 NoSQL-only 数据库筒仓中的数据。另外,这还使得单个数据对象的修改非常困难,因为那需要跨多个应用程序识别并更新。
- 失去控制:企业会失去对应用程序逻辑的控制,因为每个开发人员都使用他们自己的解决方案所特有的处理语言,并使用他们自己喜欢的技术。这会进一步损害来自不同 NoSQL-only 应用程序的数据的质量和可用性。
提高开发人员的生产力
现如今,开发人员有能力重用代码及开发存储过程,提升了开发速度,开发过程仅需几天,而不是数周。然而,NoSQL-only 解决方案不支持存储过程,而且,由于它们并不代表一种单一的技术,所以它们抑制了重用代码、建立标准和发现人才的能力。Postgres FDWs 可以在以下三个方面简化开发人员的工作:
- 支持结构化和非结构化数据类型:使用 Postgres 的开发人员将不受严格的数据模型范围所限制。借助支持和处理文档数据的 JSON/JSONB 及面向键 / 值对的 HStore 数据类型,Postgres 提供了灵活的数据模型,使开发人员能够创建可以随着业务目标变化而进化的应用程序。
- 灵活性:Postgres 支持非结构化的数据存储,但又允许开发人员应用模式规则根据业务需求选择数据。Postgres 还能使用同 NoSQL 解决方案一样的最终一致性技术增强性能。
- 数据集中管理:开发人员可以将外部的结构化和半结构化数据整合进 Postgres,使 Postgres 可以读取及编写 SQL 查询外部数据源。现在已经有面向 MongoDB、CouchDB、MySQL、Redis、Neo4j、甚至是 Twitter 等的 FDWs 了。
新解决方案带来了好处,但同时也带来了挑战,需要新的技能集、维护规定、操作过程及部署、优化、升级要求。在应用程序部署时使用 NoSQL-only 解决方案可能会帮助开发人员快速交付,但在整体环境以及企业的数据策略方面的成本会很高。Postgres FDWs 使组织可以在一个统一的平台上综合运用企业级关系型数据库和 NoSQL 能力来达到利用现有数据部署的目的。将互不相干的潜在筒仓数据源整合在一起,FDWs 使 IT 部门对信息、商品、服务、利益相关人或信息描述的其它物品有一个全面的、整体的认识。这样,企业就能获得更多的信息,做出更明智的决策和推介,实现业务目标,推动战略计划。
MongoDB FDW 实战
鉴于 MongoDB 的普及性,FDW for MongoDB 的升级版本已经创建完成。该版本加入了 PostgreSQL 9.3 增强功能中新增的 WRITE 功能。最初,FDWs 仅支持读取功能。借助扩展工具以及 EDB 针对 FDW 性能提升和数据稳定性所进行的开发,开发人员很容易使用简单的 SQL 语句(SELECT/INSERT/UPDATE/DELETE)操作 MongoDB 中的数据。
点击这里,可以从GitHub 库中下载FDW。
下面是一些使用mongo_fdw 的例子及MongoDB 等效语句。
-- 安装完成后首次加载扩展 CREATE EXTENSION mongo_fdw; -- 创建服务器对象 CREATE SERVER mongo_server FOREIGN DATA WRAPPER mongo_fdw OPTIONS (address '127.0.0.1', port '27017'); -- 创建用户映射 CREATE USER MAPPING FOR Postgres SERVER mongo_server OPTIONS (username 'mongo_user', password 'mongo_pass'); -- 创建外表 (注意:表的第 1 列必须是类型为“NAME”的“_id”。) CREATE FOREIGN TABLE warehouse( warehouse_id int, warehouse_name text, warehouse_created timestamptz) SERVER mongo_server OPTIONS (database 'db', collection 'warehouse'); -- 在表中查找行 SELECT * FROM warehouse WHERE warehouse_id = 1; _id | warehouse_id | warehouse_name | warehouse_created ------------------------ +----------------+--------------------------- 53720b1904864dc1f5a571a0| 1 | UPS | 12-DEC-14 12:12:10 +05:00 -- MongoDB 中相应的查找语句 db.warehouse.find({"warehouse_id" : 1}).pretty() { "_id" : ObjectId("53720b1904864dc1f5a571a0"), "warehouse_id" : 1, "warehouse_name" : "UPS", "warehouse_created" : ISODate("2014-12-12T07:12:10Z") } -- 向表插入行 INSERT INTO warehouse values (0, 1, 'UPS', to_date('2014-12-12T07:12:10Z')); -- MongoDB 中相应的插入语句 db.warehouse.insert ( { "warehouse_id" : NumberInt(1), "warehouse_name" : "UPS", "warehouse_created" : ISODate("2014-12-12T07:12:10Z") }) -- 从表中删除行 DELETE FROM warehouse where warehouse_id = 3; -- MongoDB 中相应的删除语句 db.warehouse.remove( { "warehouse_id" : 3 }) -- 更新表的一行数据 UPDATE warehouse set warehouse_name = 'UPS_NEW' where warehouse_id = 1; -- MongoDB 中相应的更新语句 db.warehouse.update ( { "warehouse_id" : 1 }, { "warehouse_id" : 1, "warehouse_name" : "UPS_NEW" } ) -- 解释表 EXPLAIN SELECT * FROM warehouse WHERE warehouse_id = 1; QUERY PLAN ----------------------------------------------------------------- Foreign Scan on warehouse (cost=0.00..0.00 rows=1000 width=44) Filter: (warehouse_id = 1) Foreign Namespace: db.warehouse b.warehousedwarehousems (4 rows) -- 收集数据分布统计 ANALYZE warehouse;
本文包含的实例代码是由 EnterpriseDB 数据库架构师 Ibrar Ahmed 编写的。
关于作者
Lenley Hensarling目前是 EnterpriseDB 战略和产品管理部门的副总裁。他的主要职责是在产品开发过程中确定战略方向以及同客户与合作伙伴交流。Lenley 在大型企业技术组织中积累了 20 多年的软件行业经验。他曾在 J.D. Edwards 作过很长时间的主管,之后又先后在 PeopleSoft 和 Oracle 担任领导角色。在 Novell,他最初是名工程技术人员,但很快就升职为工程部门的副总裁。Lenley 在德克萨斯州大学奥斯汀分校获得了经济学学士学位。
评论