规划Greenplum系统扩展

规划Greenplum系统扩展

细心的规划将帮助确保一个成功的Greenplum扩展项目。

这一节中的主题将帮助确保用户已经准备好执行一次系统扩展。

系统扩展检查列表

这个检查列表摘要了一次Greenplum数据库系统扩展包括的任务。
表 1. Greenplum数据库系统扩展检查列表

扩展前的在线任务

* 系统已启动并且可用
为订购、构造新硬件平台并用网络连接它们或者准备云资源设计并且执行一个计划。
设计一个数据库扩展计划。映射每个主机上的Segment数量、安排用于性能测试和创建扩展方案所需的停机时段并且安排用于表重新分布的时段。
执行一个完整的方案转储。
在新主机上安装Greenplum数据库的二进制文件。
复制SSH密钥到新主机(gpssh-exkeys)。
验证新硬件或者云资源的操作系统环境(gpcheck)。
验证新硬件或者云资源的磁盘I/O和内存带宽(gpcheckperf)。
验证Master的数据目录中在pg_log或者gpperfmon/data目录下面没有极大的文件。
验证没有目录问题(gpcheckcat)。
准备一个扩展输入文件(gpexpand)。

离线扩展任务

* 在此处理期间系统被锁定并且对所有用户活动不可用。
验证新旧硬件或者云资源的操作系统环境(gpcheck)。
验证新旧硬件或者云资源的磁盘I/O和内存带宽(gpcheckperf)。
把新Segment初始化到阵列中并且创建一个扩展方案(gpexpand-i input_file)。

在线扩展和表重新分布

* 系统已启动并且可用
在用户开始表重新分布之前,停止任何自动的快照处理或者其他消耗磁盘空间的进程。
在扩展后的系统中重新分布表(gpexpand)。
移除扩展方案(gpexpand -c)。
运行analyze来更新分布统计信息。

在扩展期间使用gpexpand -a,在扩展之后使用analyze

规划新的硬件平台

一个深思熟虑的、周密的部署兼容硬件的方法会大大地最小化扩展处理的风险。

新Segment主机的硬件资源和配置应该匹配现有主机。在购买硬件扩展Greenplum数据库之前,请与Greenplum Platform Engineering合作。

规划和设置新硬件平台的步骤在每一次部署中都有不同。下面是一些相关的考虑:

  • 为新硬件准备物理空间,考虑冷却、电力供应和其他物理因素。
  • 确定连接新旧硬件所需的物理网络和布线。
  • 为扩展后的系统映射现有的IP地址空间和开发中的网络规划。
  • 从现有的硬件捕捉系统配置(用户、配置文件、NIC等等),这将被用作订购新硬件时的清单。
  • 为在特定站点和环境中用期望的配置部署硬件创建一个自定义的建设计划。

在选择并且增加新硬件到网络环境中后,确保执行验证OS设置中描述的任务。

规划新Segment初始化

扩展Greenplum数据库要求很有限的系统停机周期。在这个周期内,会运行gpexpand把新Segment初始化到阵列中并且创建一个扩展方案。

所需要的时间取决于Greenplum系统中的方案对象的数量以及其他与硬件性能相关的因素。在大部分环境中,新Segment的初始化要求不超过30分钟的离线时间。

注意: 在用户开始初始化新Segment之后,用户就不再能用扩展系统之前创建的备份文件来恢复系统。当初始化成功完成后,扩展会被提交且不能被回滚。

规划镜像Segment

如果现有的阵列有镜像Segment,新的Segment也必须有镜像配置。如果为现有的Segment没有配置镜像,则不能用gpexpand工具给新主机增加镜像。

对于带有镜像Segment的Greenplum数据库阵列,确保增加了足够的新主机来容纳新的镜像Segment。所需的新主机数量取决于镜像策略:

  • 散布镜像 — 向阵列中增加比每个主机上的Segment数量至少多一台的主机。要确保平均散布,阵列中独立主机的数量必须大于每台主机上的Segment实例数量。散布镜像会把每台主机的镜像散布到集群中剩余的主机上并且要求集群中的主机数量比每个主机上的主要Segment数量更多。
  • 组镜像 — 增加至少两台新主机,这样第一台主机的镜像可以被放在第二台主机上,并且第二台主机的镜像可以被放在第一台上。更多信息请见关于Segment镜像

对每个主机增加Segment

默认情况下,新主机上初始化后会有和现有主机上数量相同的主要Segment。可以增加每台主机上的Segment或者向现有主机上增加新的Segment。

例如,如果现有主机当前在每台主机上有两个Segment,可以使用gpexpand在现有主机上初始化两个额外的Segment来得到总共四个Segment,这样将在新主机上有四个新的Segment。

创建扩展输入文件的交互式处理会提示这个选项,还可以在该输入配置文件中手工指定新Segment的目录。更多信息请见为系统扩展创建一个输入文件

关于扩展方案

在初始化时,gpexpand会创建一个扩展方案。如果没有在初始化时指定一个数据库(gpexpand -D),会在环境变量PGDATABASE指示的数据库中创建该方案。

扩展方案存储了系统中每个表的元数据,因此在扩展处理的全过程中能跟踪其状态。扩展方案由两个表和一个跟踪扩展操作进度的视图组成:

  • gpexpand.status
  • gpexpand.status_detail
  • gpexpand.expansion_progress

通过修改gpexpand.status_detail可以控制扩展处理的方方面面。例如,从这个表中移除一个记录会阻止系统在新Segment上扩展该表。通过更新一个记录的rank值,可以控制表在重新分布过程中被处理的顺序。更多信息请见为重新分布对表排名

规划表的重新分布

表重新分布会在系统在线时被执行。对于很多Greenplum系统,表重新分布会在一个安排在低利用率时期执行的单一gpexpand会话中完成。更大的系统可能会要求多个会话并且设置表重新分布的顺序来最小化对性能影响。在一个会话中完成表重新分布也是可能的。

重要:要执行表重新分布,Segment主机必须具有足够多的磁盘空间来临时地保存最大表的一份拷贝。在重新分布期间,所有的表对于读写操作都不可用。

表重新分布的性能影响取决于一个表的尺寸、存储类型以及分区设计。对于任何给定的表,用gpexpand重新它需要消耗和一次CREATE TABLE AS SELECT操作相同的时间。在重新分布一个T字节尺度的事实表时,扩展工具能使用许多可用的系统资源,这可能会影响其他数据库负载的查询性能。

在大尺度Greenplum系统中管理重新分布

可以通过调整表的排名来管理表被重新分布的顺序。详见为重新分布对表排名。操纵重新分布顺序可以帮助适应有限的磁盘空间以及尽快恢复对高优先级查询的最优查询性能。

在规划重新分布阶段时,要考虑重新分布期间在每个表上取得的排他锁的影响。一个表上的用户活动可能会延迟它的重新分布,而且表在重新分布期间对用户活动不可用。

空间磁盘空间充裕的系统

如果系统由充裕的空闲磁盘空间(要求用来存储最大表的一份拷贝),可以通过首先重新分布查询使用最多的重点表来尽快恢复最优的查询性能。为这些表分配高的排名,并且在系统使用量低的时候安排重新分布操作。一次运行一个重新分布处理,直到大的或者关键的表被重新分布完。

空闲磁盘空间有限的系统

如果现有的主机磁盘空间有限,可以先重新分布较小的表(例如维度表)来腾出空间存储最大表的一份拷贝。由于每个表会被重新分布到被扩展后的阵列上,在原始Segment上的可用磁盘空间会增加。当在所有Segment上存在足够的空闲空间以存储最大表的一份拷贝后,就可以重新分布大的或者关键的表了。大表的重新分布要求排他锁,请把这种过程安排在非峰值时段。

还要考虑下面的事情:
  • 在非峰值时段运行多个并行的重新分布处理以最大化可用的系统资源。
  • 在运行多个处理时,处理的数量不能高于Greenplum系统的连接限制。有关限制并发连接的信息请见限制并发连接

重新分布追加优化且压缩过的表

gpexpand以与堆表不同的速率重新分布未压缩和压缩的追加优化表。压缩和解压数据所需的CPU能力会导致增加对系统性能影响。对于具有类似数据的类似尺寸的表,可以发现如下的总体性能区别:
  • 扩展未压缩的追加优化表比堆表快10%。
  • 扩展zlib-压缩的追加优化表比未压缩的追加优化表要明显慢得多,最多可能要慢80%。
  • 使用了ZFS/LZJB等数据压缩的系统需要更长时间重新分布。
重要: 如果系统节点使用数据压缩,在新结点上使用相同的压缩来避免磁盘空间短缺。

重新分布有主键约束的表

在新Segment的初始化和成功的表重新分布之间,有一段时间内无法实施主键约束。在这期间表中被插入的重复数据会妨碍扩展工具重新分布受影响的表。

在表被重新分布之后,主键约束被再次正确地实施。如果一个扩展处理违背约束,扩展工具会记录错误并且在完成时显示警告。要修正约束违背,执行下列补救措施之一:
  • 在主键列中清除重复数据,并且重新运行gpexpand
  • 删除主键约束,并且重新运行gpexpand

重新分布有用户定义数据类型的表

不能在有用户定义数据类型的列被删除的表上用扩展工具执行重新分布。要重新分布有用户定义数据类型的列被删除的表,首先用CREATE TABLE AS SELECT重新创建该表。在这一处理移除了被删除列之后,再使用gpexpand重新分布该表。

重新分布被分区的表

因为该扩展工具可以处理一个大型表上的每个分区,一个有效的分区设计能降低表重新分布的性能影响。只有一个分区表的子表会不被设置为随机分布策略。一次只对一个子表应用重新分布所需的读/写锁。

重新分布建有索引的表

因为gpexpand工具必须在重新分布之后重新索引每个被索引的表,一次高级的索引会带来很大的性能影响。在有很多索引要建立的系统中,表的重新分布要慢很多。