GreenPlum数据迁移工具之gpcopy

0    275    2

Tags:

👉 本文共约7664个字,系统预计阅读时间或需29分钟。

简介

gpcopy是一个数据迁移实用程序,可以在不同集群之间进行传输数据,可以将一个集群中的Greenplum数据库的元数据和数据复制到另一个集群的Greenplum数据库中。gpcopy可以迁移数据库的全部内容,包括数据库架构、表数据、索引、视图、角色、用户自定义函数、资源队列、资源组。

gpcopy 是新一代的 Greenplum 数据迁移工具,可以帮助客户在不同集群间,不同版本间,快速稳定地迁移数据。同上一代迁移工具 gptransfer 相比,gpcopy 具有巨大的优势:更快,更稳定,更易用,功能更丰富,是gptransfer的升级版

gpcopy 可以干什么

gpcopy 可以迁移整个集群,也可以具体传输某些数据库、某些命名空间和某些表;可以从文件读取传输或者略过的表,支持正则表达式;可以略过、追加或者替换目标集群的数据;可以并行传输;可以只迁移结构信息;可以静默自动化执行……

简单说,就是集群间迁移所存储的信息,使得用户业务可以迁移:

img

和gptransfer的速度对比

img

(1)复制数据更快:注意这里说的是数据,而不是元数据。gpcopy更快速原因可分为三点:segment间直接传输、Snappy压缩传输、数据校验。

​ ①segment间直接传输:当一个表的数据超过指定数据行数(--on-segment-threshold默认为10000行)时,gpcopy会利用COPY ON SEGMENT特性使得gpcopy可以做到两个cluster的多节点间并发传输。除此之外,gpcopy的数据传输本身就是利用copy命令,而gptransfer则是通过外部表的SELECT和INSERT进行逐条操作,copy使用批量操作自然而然要比insert更快。

​ ②Snappy压缩传输:gpcopy默认使用Google的Snappy格式对数据进行压缩和传输,而gptransfer使用zlib格式进行压缩和传输,百度snappy和zlib压缩性能对比,Snappy性能明显要高很多。

​ ③数据校验:gpcopy和gptransfer都有两种校验方式,第一种校验方式相同:比较源表数据和目标表数据之间的行数,第二种校验方式也都是基于md5校验,但是gptransfer是先对源表和目标表进行排序,再对排序后的行计算MD5哈希值并逐行比较,反观gpcopy,先将每一行的所有列转换为文本,然后计算每行的md5值,最后对md5值进行XOR(异或)比较。

(2)数据迁移更稳定:命名管道以文件的形式存在于文件系统中,任何进程只要有权限,打开该文件即可通信。导致命名管道文件难以管理,也容易出问题。gpcopy没有命名管道文件。而gptransfer使用可写和可读外部表、Greenplum的gpfdist并行数据装载工具以及命名管道来从源数据库传输数据到目标数据库,所以命名管道必不可少。

为什么 gpcopy 可以更快速

·segment 间直接传输

gpcopy 的数据传输利用了 Greenplum 最新的 COPY ON SEGMENT 特性,首先 COPY 相较于 gptransfer 单纯使用的外部表就更快,因为它是批量操作,而外部表的 SELECT 和 INSERT 都是逐条操作;另外 COPY ON SEGMENT 特性使得 gpcopy 可以做到两个集群的多节点间并发传输,快上加快。

以下是 gpcopy 应用于相同节点数 Greenplum 集群间传输的架构,还是很简单直接的。

img

·Snappy 压缩传输

gpcopy 默认打开压缩选项,使用 Google 的 Snappy 格式对所传输得数据进行压缩,网络传输少了很多压力,速度也更快。

Snappy 对大多数的输入比 zlib 的最快模式要快几个数量级。在 core i7 的单核64位模式下,Snappy 压缩速度可以达到250MB/s或者更快,解压缩可以达到大约500MB/s或更快。

· 更快的数据校验

判断两个数据库系统的表是否一致从来不是一个简单的问题,简单使用哈希校验的话要考虑条目的顺序,排序的话又会把速度拖得更慢。如果这两个数据库系统和 Greenplum 一样是集群系统,这个问题就更难了。而 gpcopy 灵活地解决了这个问题,不需要排序,数据校验的速度是对所导出CSV格式文件做哈希的几倍!

为什么 gpcopy 可以更稳定

· 没有命名管道文件

命名管道以文件的形式存在于文件系统中,任何进程只要有权限,打开该文件即可通信。命令管道遵守先进先出的规则,对命名管道读总是从开始处返回数据,读过的数据不再存在于命名管道中,对它写则是添加到末尾,不支持lseek等操作。

命名管道文件难以管理,也容易出问题。例如不限制其它进程读、读过的数据不再存在这两个特点,结合起来会发生什么?想象一下,如果用户系统中存在着杀毒软件,所有文件都会被它读取采样……(这是一个真实案例)

· 完善的日志记录和错误处理

gpcopy 在这一块花了很大力气,每一步的操作,执行的查询,命令和结果都写到了日志文件,并根据用户指定的级别显示到标准输出。

迁移操作也都在事务内,发生错误可以做到表一级的回滚。运行结束的时候会有详细的成功和失败总结,同时生成和提示用户运行命令去重试所有的错误。

可以说,万一用户环境出现了错误,结合 gpcopy 和 Greenplum 的日志文件,我们的支持人员可以迅速地定位问题和给出解决方案,最大程度保障客户顺利迁移。

· “能用”而且好用的数据校验

这个前面提过了,前代 gptransfer 的数据校验是对数据进行排序然后哈希,用户基本都因为太慢而不得不略过,“稳定和一致”也就无从谈起了。

· gpcopy 可以用于升级

Greenplum 版本升级一般会有 catalog 变化,只升级可执行文件是不兼容的。而利用 gpcopy 则可以做到原地升级,另外因为有了快速好用的数据校验,用户也可以放心地一边迁移数据一边释放空间。(即使这样也强烈建议备份)

GPCOPY版本发展史

gpcopy改动变迁比较大的版本分别为1.0.0、1.1.0、1.5.0。

gpcopy1.0.0:始于greenplum-db-5.9.0,仅支持相同segment数的gpdb之间的数据迁移。

gpcopy1.1.0:始于greenplum-db-5.12.0,支持不同segment数的Greenplum集群间传输,分为两种情况,

①gpcopy从小集群到大集群传输

②gpcopy从大集群到小集群传输

gpcopy1.5.0:从4.3.33.0、5.21.0开始,gpcopy不再捆绑在greenplum的安装包中,成为Pivotal gpcopy的第一个独立发行版,gpcopy1.5.0相比较于之前版本做出了如下更改:

​ ①在复制表数据时可以更改目标schema和table名称,前提是目标表必须存在,且必须具有与源表完全相同的表结构。

​ ②默认支持传输表所有权和特权信息,以前只有在使用-full选项时才复制所有权和特权信息。

支持不同节点数的 Greenplum 集群间传输

gpcopy 1.1.0 现已支持不同节点数的 Greenplum 集群间传输!

现阶段导出依然是最快的COPY ON SEGMENT,导入则是利用外部表。多节点间并发传输、压缩和更快的数据校验,一个特性也不少。后续还会针对这个场景做更多的优化,敬请期待。

以下是 gpcopy 从小集群到大集群传输的基本架构,图片之外我们还做了传输量倾斜的优化。

img

以下是 gpcopy 从大集群到小集群传输的基本架构,一样也会有避免倾斜的优化。

img

下载

https://network.pivotal.io/products/gpdb-data-copy

大小:12MB

安装使用

解压后,将gpcopy和gpcopy_helper文件拷贝到源端和目标端的所有节点的$GPHOME/bin目录下。

其实就是:

帮助

命令示例

关于--on-segment-threshold参数

The --on-segment-threshold setting determines where gpcopy performs the data transfer:

  • When --on-segment-threshold is set to -1 (the default), gpcopy copies table data using the source and destination Greenplum Database segment instances.
  • When --on-segment-threshold is set to -2, gpcopy copies table data using the source and destination Greenplum Database coordinators.
  • When --on-segment-threshold is set to a positive value, it identifies a row number threshold. If a table contains this number of rows or less, gpcopy copies the table data using the source and destination coordinators. If the number of rows in a table is more than the threshold, gpcopy copies the data using the source and destination segment instances. gpcopy uses the source table statistics to determine the number of table rows. If a source table is not analyzed, gpcopy assumes that the table is a small table, ignores the threshold setting, and copies the table data using only the coordinators. If your database has large tables without statistics, set the --on-segment-threshold option to -1 to force gpcopy to copy table data using segment instances.

关于--no-distribution-check参数

gpcopy does not support table data distribution checking when copying a partitioned table that is defined with a leaf table that is an external table or if a leaf table is defined with a distribution policy that is different from the root partitioned table. You can copy those tables in a gpcopy operation and specify the --no-distribution-check option to deactivate checking of data distribution.

Caution

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
AiDBA后续精彩内容已被站长无情隐藏,请输入验证码解锁本文!
验证码:
获取验证码: 请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“AiDBA”或者“dbaup6”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复