GreenPlum数据迁移工具之gpcopy

0    39    2

Tags:

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

简介

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

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

gpcopy 可以干什么

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

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

GreenPlum数据迁移工具之gpcopy

和gptransfer的速度对比

GreenPlum数据迁移工具之gpcopy

(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 集群间传输的架构,还是很简单直接的。

GreenPlum数据迁移工具之gpcopy

·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 从小集群到大集群传输的基本架构,图片之外我们还做了传输量倾斜的优化。

GreenPlum数据迁移工具之gpcopy

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

GreenPlum数据迁移工具之gpcopy

下载

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

GreenPlum数据迁移工具之gpcopy

大小:12MB

安装使用

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

帮助

命令示例

我的示例1(单库迁移)

日志:

我的示例2(全集群迁移)

gpcopy官方提示注意点

(1)如果gpcopy命令指定了无效的选项,或者指定了不存在的源表或数据库,则该实用程序将返回错误并退出。并且没有数据被复制。

(2)gpcopy在复制数据时是不会在源表上添加事务锁的,此时是可以修改源表数据的。

(3)gpcopy无法复制宽度大于1GB(PostgreSQL限制)的行。

(4)如果使用--dbname,--include-table,--include-table-file或--include-table-json选项复制一组数据库表,而目标数据库不存在,则该实用程序将创建数据库,然后再复制表。如果目标数据库存在,则该实用程序根据需要在数据库中创建表。如果目标表存在但是表结构不一致,该实用程序将返回错误然后回滚当前数据表的复制操作并继续开始下一个数据表迁移操作。

(5)除非指定--full选项,否则gpcopy实用程序不会复制依赖的数据库对象。

例如,如果一个表在一个用户定义的函数的列上有一个默认值,那么在使用--dbname、--include-table、--include-table-file或--include-table-json选项时,该函数必须存在于目标系统数据库中。

(6)复制表时,为表定义的序列被视为表数据并被复制。如果使用序列列创建表或将序列指定为默认值,则将复制序列。如果指定--truncate选项,则会重置序列。

(7)gpcopy仅在使用--full或--drop选项后重新创建表索引。

(8)gpcopy不会复制配置文件,例如postgresql.conf和pg_hba.conf。您必须单独设置目标系统配置。

(9)gpcopy实用程序不会复制外部对象,例如Greenplum数据库扩展名,第三方jar文件和共享对象文件。您必须单独安装外部对象。

(10)gpcopy实用程序将消息记录在master主机上~/ gpAdminLogs目录中的日志文件gpcopy_date.log中。如果您在同一天运行多个gpcopy命令,该实用程序会将消息追加到当天的日志文件中。

GPCOPY使用测试注意点

(1)gpcopy支持也只支持从Greenplum低版本往高版本进行数据迁移:因为Greenplum不同版本(4、5、6)之间分别基于PostgreSQL8.2.x、8.3.x、9.x为内核开发的,它们的pg_dump版本不一致,测试发现gpcopy在复制数据时使用了pg_dump工具,所以在这种情况下只能复制元数据。

(2)gpcopy实用程序分为元数据迁移和表数据迁移,当指定--metadata-only选项时,gpcopy就可以实现很多特殊环境的迁移工作,如:

​ ①gpcopy1.0.0执行迁移工具时,集群间可以具有不同的segment数。

​ ②高版本gp往低版本gp迁移工作:gp5.x为源集群往gp4.x目标集群迁移。

(3)gpcopy与gpcopy_helper在源集群和目标集群的作用,测试情况有如下几种:

​ ①仅迁移元数据时,源集群只需要master主机有gpcopy文件,目标集群只需要master主机上有gpcopy_helper文件。

​ ②迁移的表数据行数都低于10000行时(--on-segment-threshold默认为10000行),源集群需要master主机有gpcopy文件和gpcopy_helper文件,目标集群只需要master主机上有gpcopy_helper文件。

分析猜测为gpcopy用于源集群迁移元数据、gpcopy_helper用于源和目标集群迁移元数据和表数据。总之,在实际生产环境中不要考虑这些,都装上即可。

Notice:我的测试环境是:source集群(1个master实例,4个segment实例)、dest集群(1个master实例,4个segment实例)。

(4)源集群的主机和目标集群的主机之间需要互相ping通,假设有test1、test2两个cluster,test1能够ping通test2,而test2不能ping通test1,大致场景:test1为局域网,test2为公网。gpcopy的source-host为test1时,可以向test2迁移数据进行正常操作,而当test2为source-host、test1为dest-host时,gpcopy能够将所有表的元数据迁移,但是在迁移表数据时会报错并回滚整个表的复制操作,如果指定--metadata-only能正常操作。

(5)gpcopy诞生于Greenplum5.9.0,不代表只能从5.9.0开始使用,也不是说5.x的版本都能够使用。经过测试,gpcopy实际能够运行环境分别为4.3.20.0及以上、5.4.1及以上、6.x。除此之外,gptransfer在Greenplum6.x中已被移除。

错误

Error: pq: SSL is not enabled on the server (172.72.6.40:5432)

解决:

Error: pq: password authentication failed for user "gpadmin" (172.72.6.50:5432)

解决:

注意:md5需要放在最后

命令总结

总结

1、将gpcopy和gpcopy_helper文件拷贝到源端和目标端的所有节点$GPHOME/bin目录下

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!
GreenPlum数据迁移工具之gpcopy后续精彩内容已被小麦苗无情隐藏,请输入验证码解锁本站所有文章
验证码:
请关注本站微信公众号,回复“小麦苗博客”,获取验证码。在微信里搜索“DB宝”或者“www_xmmup_com”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

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

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部