往年的两会和政府工作报告中屡次强调“增强新型基础设施建设,倒退新一代信息网络,拓展 5G 利用”等拓展新基建的措施,年初暴发的新冠肺炎疫情也让“新基建”初露锋芒,互联网 +、5G、IoT、人工智能等新基建技术正在飞速发展。无论是最近十多年数字经济宠儿的互联网大数据技术,还是将来踌躇满志亟待倒退的 5G 物联网技术,都离不开海量数据的存储与计算。随着智能技术的推动和倒退,如何在保障海量数据计算和存储的安全性问题时,能高效利用数据库计算能力计算热数据而又能够有限存储冷数据成为亟待解决的难题。
京东智联云云数据库 PostgreSQL 是京东智联云数据库团队历时 1 年多精心研发的产品,该产品凝聚了京东智联云数据库团队多年来的 PostgreSQL 应用教训,可能提供 一个稳固、牢靠的数据存储服务。云数据库 PostgreSQL 易于部署、治理和扩大,默认反对主从热备架构,提供数据备份、故障复原、监控等全套解决方案,彻底解决数据库运维的懊恼。同时,京东智联云“云数据库 PostgreSQL”通过应用网络隔离、白名单限度外网拜访等形式,为数据库服务提供了高级别的安全性需要,帮忙用户省去绝大部分简单而繁琐的管理工作,从而使用户可能更专一于业务流程的开发与建设。云数据库 PostgreSQL 目前已上线反对 9.6、10.6、11.2、12.2 版本。
为了实现冷热数据拆散,京东智联云基于云数据库 PostgreSQL 推出自研插件 s3_fdw,该插件可实现云数据库 PostgreSQL 和对象存储服务 OSS 双向买通。用户海量数据可有限存储在 OSS 上,实时业务数据存储在 PostgreSQL 做计算,在 PostgreSQL 计算实现后通过 s3_fdw 插件转存在 OSS 上。
目前,s3fdw 插件已广泛应用于京东物流相干业务。快递配送员每天从各个快递站点配送到用户地区会产生大量的轨迹数据,而站点负责人只须要理解配送员当天的配送路线和配送效率,定期对配送员历史轨迹和配送效率打分。在技术实现上,配送员每天会产生大量轨迹数据,最高达到 TB 级别。如果每天的轨迹都存在数据库中很快就会达到存储下限,而站长仅须要剖析当天的数据作为热数据,历史数据仅作为定期剖析场景的参考。因而,咱们能够通过云数据库 PostgreSQL 实现当天配送员轨迹数据的存储和剖析,再通过 s3_fdw 把历史轨迹数据定期同步到 OSS 上,实现冷热数据拆散。
应用 s3_fdw 插件买通云数据库 PostgreSQL 与 OSS 之间的数据流转,无需简单的程序操作,用户仅须要几行代码,即可轻松实现。上面咱们就来展现在 PostgreSQL 中应用 s3_fdw 读写 OSS 内部表的操作过程:
# 筹备数据 postgres=# CREATE TABLE local_table(id integer, name character varying, password character varying);CREATE TABLEpostgres=# insert into local_table select generate_series(1,40000000), md5(random()::text), md5(random()::text);INSERT 0 40000000# 创立插件 postgres=# create extension s3_fdw;CREATE EXTENSIONpostgres=# CREATE SERVER s3_fdw_server FOREIGN DATA WRAPPER s3_fdw options(host 's3-internal.cn-north-1.jdcloud-oss.com', bucket 'postgresql');CREATE SERVERpostgres=# CREATE USER MAPPING FOR CURRENT_USER SERVER s3_fdw_server OPTIONS (access_key_id 'xxxxxx', secret_access_key 'xxxxxx');CREATE USER MAPPING# 创立内部表 postgres=# CREATE FOREIGN TABLE local_table_oss_1_10000000(id integer, name character varying, password character varying) SERVER s3_fdw_server OPTIONS(dir 's3_fdw_local_table/1_10000000/', format 'csv');CREATE FOREIGN TABLEpostgres=# CREATE FOREIGN TABLE local_table_oss_10000001_20000000(id integer, name character varying, password character varying) SERVER s3_fdw_server OPTIONS(dir 's3_fdw_local_table/10000001_20000000/', format 'csv');CREATE FOREIGN TABLEpostgres=# CREATE FOREIGN TABLE local_table_oss_20000001_30000000(id integer, name character varying, password character varying) SERVER s3_fdw_server OPTIONS(dir 's3_fdw_local_table/20000001_30000000/', format 'csv');CREATE FOREIGN TABLEpostgres=# CREATE FOREIGN TABLE local_table_oss_30000001_40000000(id integer, name character varying, password character varying) SERVER s3_fdw_server OPTIONS(dir 's3_fdw_local_table/30000001_40000000/', format 'csv');CREATE FOREIGN TABLE# 开启 4 个客户端,并行地将云 PostgreSQL 实例的数据导入 OSSpostgres=# insert into local_table_oss_1_10000000 select * from local_table where id <= 10000000;postgres=# insert into local_table_oss_10000001_20000000 select * from local_table where id >= 10000001 and id <= 20000000;postgres=# insert into local_table_oss_20000001_30000000 select * from local_table where id >= 20000001 and id <= 30000000;postgres=# insert into local_table_oss_30000001_40000000 select * from local_table where id >= 30000001 and id <= 40000000;# 间接读取 OSS 数据源 postgres=# select * from local_table_oss_1_10000000 limit 5;id | name | password ----+----------------------------------+----------------------------------1 | b6c4d3e0efff1ff051ed7989ade43287 | 2859055a8d51b2f8888993887340fe7d2 | f718eb7452c59bae2ee06dd88eae1488 | bd21f8468c8d2f5d7bb756a55203d2043 | 95735e3472903502f0a08dc895220ff9 | d06704faad7a247d29d6257af85d29064 | 3b690bb8912fe96567d04287fc9fa701 | d04ad214f9dd1d22cb680b72a0a9d0bb5 | 849842e47625c271de0221adc55608a6 | 8e961dcffcef418200f623c1b5f34d7f(5 rows)# 本地创立新表 postgres=# create table local_table_2 (like local_table);CREATE TABLEpostgres=# select * from local_table_2;id | name | password ----+------+----------(0 rows)# 开启 4 个客户端,并行地将数据从 OSS 上 load 到云 PostgreSQL 实例 postgres=# insert into local_table_2 select * from local_table_oss_1_10000000;postgres=# insert into local_table_2 select * from local_table_oss_10000001_20000000;postgres=# insert into local_table_2 select * from local_table_oss_20000001_30000000;postgres=# insert into local_table_2 select * from local_table_oss_30000001_40000000;# 数据一致性校验 postgres=# select sum(hashtext(t.*::text)) from local_table t;sum ----------------10851381716282(1 row)postgres=# select sum(hashtext(t.*::text)) from local_table_2 t;sum ----------------10851381716282(1 row)
< 左右滑动以查看残缺代码 >
具体操作可点击链接查看:
https://docs.jdcloud.com/cn/r…_fdw
以上能够看出,利用 s3_fdw 通过 PostgreSQL 对 OSS 内部表进行读写,能够很不便地实现对数据的荡涤、过滤、导出。通过扭转上文中的 ”insert into … select …”语句中的 select 子句,能够轻松达到数据处理的目标。除此之外,数据从 PostgreSQL 流转到 OSS 后,另一端并不一定是 PostgreSQL 能力 load 数据,很重要的一点是:京东智联云数据仓库 JDW,同样提供了相似 s3_fdw 的插件,能够将云 PostgreSQL 导出的数据轻松 load 进云 JDW 实例,进行数据分析。
整体架构图如下所示:
通过上述内容,想必大家对云数据库 PostgreSQL 到 OSS 之间的数据流转有了进一步的理解。通过在 OSS 上正当管制目录构造并应用 s3_fdw 写入数据,能够轻松将云 PostgreSQL 数据导入 OSS 中,进一步地,更能够将 OSS 数据导入云数据仓库 JDW,无效笼罩 OLTP 和 OLAP 一体化的场景。还在为海量数据存储与计算懊恼么?赶快试试京东智联云自研的 s3_fdw 插件,轻松搞定多样化数据利用场景。
点击 ” 浏览原文 ”,理解京东云数据库 PostgreSQL