重分布表

重分布表

重新分布表让现有数据在新扩展后的集群上得以平衡。

在创建了一个扩展方案后,用户可以重新让Greenplum上线并且用gpexpand在整个阵列中重新分布表。应该在使用较少的时段来运行这项任务,这样该工具用到的CPU使用和表锁对操作的影响会最小。还要对表进行排名,先对最大或者最重要的表进行重新分布。

注意: 在重新分布数据时,Greenplum数据库必须运行在生产模式中。Greenplum数据库不能处于受限模式或者Master模式中。不能指定gpstart选项 -R或者-m来启动Greenplum数据库。

当表重新分布正在进行中时,任何新创建的表会按照普通操作那样被分布在所有的Segment上。查询也能访问所有的Segment,即使相关的数据还没有被完全分布在新Segment上的表中也行。正在被重新分布的表或者分区会被锁定并且对于读或者写操作不可用。当其重新分布完成后,常规操作才会继续。

为重新分布对表排名

对于大型的系统,用户可以控制表重新分布的顺序。在扩展方案中调整表的rank值就能让重度使用的表优先并且最小化性能影响。可用的空闲磁盘空间可能会影响表的排名,参见在大尺度Greenplum系统中管理重新分布

要通过在gpexpand.status_detail中更新rank值来为重新分布对表排名,用psql或者另一个被支持的客户端连接到Greenplum数据库。用这样的命令更新gpexpand.status_detail

=> UPDATE gpexpand.status_detail SET rank=10;

=> UPDATE gpexpand.status_detail SET rank=1 WHERE fq_name = 'public.lineitem';
=> UPDATE gpexpand.status_detail SET rank=2 WHERE fq_name = 'public.orders';

这些命令把所有表的优先级降低到10,然后把排名1分配给lineitem并且把排名2分配给。 orders。当表的重新分布开始时,lineitem会首先被重新分布,接着是ordersgpexpand.status_detail中所有的其他表。要从重新分布中排除一个表,将它从gpexpand.status_detail中移除。

使用gpexpand重新分布表

要用gpexpand重新分布表

  1. 作为将要运行用户的Greenplum数据库系统的用户(例如gpadmin)登入到Master主机。
  2. 运行gpexpand工具。用户可以使用-d或者-e选项来定义扩展会话时限。例如,要运行该工具最多60个连续的小时:
    $ gpexpand -d 60:00:00

    该工具会重新分布表,直到方案中的最后一个表完成或者它达到了指定的持续时间或者结束时间。当一个会话开始并且结束时,gpexpand会在gpexpand.status中更新状态和时间。

监控表的重新分布

用户可以在表重新分布处理的过程中查询扩展方案。视图gpexpand.expansion_progress提供了一个当前进度摘要,包括估计的表重新分布率以及估计的完成时间。用户可以查询表gpexpand.status_detail来得到每个表的状态信息。

查看扩展状态

在第一个表完成重新分布后,gpexpand.expansion_progress会计算其估计值并且基于所有表的重新分布比率刷新它们。每次用户用gpexpand开始一次表重新分布会话时计算都会重新开始。要监控进度,可以用psql或者另一种受支持的客户端连接到Greenplum数据库,然后用下面这样的命令查询gpexpand.expansion_progress

=# SELECT * FROM gpexpand.expansion_progress;
             name             |         value
------------------------------+-----------------------
 Bytes Left                   | 5534842880
 Bytes Done                   | 142475264
 Estimated Expansion Rate     | 680.75667095996092 MB/s
 Estimated Time to Completion | 00:01:01.008047
 Tables Expanded              | 4
 Tables Left                  | 4
(6 rows)

查看表状态

gpexpand.status_detail存储着方案中每一个表有关的状态、最近更新时间和更多情况。要查看一个表的状态,可以用psql或者另一种受支持的客户端连接到Greenplum数据库,然后查询gpexpand.status_detail

=> SELECT status, expansion_started, source_bytes FROM
gpexpand.status_detail WHERE fq_name = 'public.sales';
  status   |     expansion_started      | source_bytes
-----------+----------------------------+--------------
 COMPLETED | 2017-02-20 10:54:10.043869 |   4929748992
(1 row)