greenplum Segment镜像配置介绍

时间:2024-03-19 17:51:01

Segment镜像允许数据库查询在主Segment失效或者不可用时转移到备份Segment上。Pivotal要求对其支持的生产Greenplum数据库系统采用镜像。

为了确保高可用,主Segment及其镜像必须位于不同主机上。Greenplum数据库系统中的每一台主机都有相同数量的主Segment和镜像Segment。多连接主机应该在每个接口上有相同数量的主Segment和镜像Segment。这能确保所有主Segment运行时,Segment主机和网络资源的负载均衡,并且带来最多的资源承担查询处理。

当Segment变得不可用时,它位于另一台主机上的镜像Segment会变成活动的主Segment并且处理可以继续。主机上的额外负载会导致倾斜以及性能退化,但是应该能允许系统继续运行。直到所有的Segment返回结果之前,一个数据库查询并不完整,因此有一个额外的活动主Segment的主机带来的效果和在集群中每一台主机上增加一个额外的主Segment的效果相同。

在失效场景中,当没有主机上有超过一个镜像Segment承担主要Segment角色时,出现的性能退化最小。如果多个Segment或者主机失效,性能退化的程度取决于其上有最多镜像Segment承担主要Segment角色的主机。将一台主机的镜像散布在其余的主机上可以最小化任意单主机失效时的性能退化。

也有必要考虑集群对于多主机失效的容忍能力以及通过增加主机扩展集群时如何维护镜像配置。没有一种适合任意情况的理想镜像配置。

用户可以允许Greenplum数据库使用两种标准配置之一在集群中的主机上安排镜像,或者可以设计自己的镜像配置。

两种标准的镜像布置是组镜像 and 散布镜像

  • 组镜像 — 每台主机镜像另一台主机的主Segment。这是gpinitsystem和gpaddmirrors的默认选择。
  • 散布镜像 — 镜像散布在可用的主机上。这要求集群中的主机数大于每台主机上的Segment数。

用户可以设计一种自定义的镜像配置并且使用Greenplum的gpaddmirrors或者gpmovemirrors工具来建立该配置。

块镜像是一种自定义镜像配置,它把集群中的主机划分成相等尺寸的块并且在块内的主机上均匀地分布镜像。如果一个主Segment失效,其在同一块的另一主机上的镜像会变成活动的主Segment。如果一台Segment主机失效,在该块中其他每一台主机上的镜像Segment都会变成活动的。

下面的小节比较了组镜像、散布镜像和块镜像三种配置。

组镜像

组镜像是最容易设置的镜像配置,并且是Greenplum的默认镜像配置。组镜像的扩展代价最低,因为可以通过增加仅仅两台主机来完成扩展。在扩展之后无需移动镜像来维持镜像配置的一致性。

下面的图显示了一个在四台主机上带有八个主Segment的组镜像配置。

greenplum Segment镜像配置介绍

除非同一个Segment实例的主Segment和镜像都失效,最多可以有一半的主机失效并且集群将继续运行,只要资源(CPU、内存和IO)足以满足需求。

任何主机失效将会让性能退化一半以上,因为具有镜像的主机将承担两倍的活动主Segment。如果用户的资源利用通常会超过50%,用户将不得不调整其负载,直至失效主机被恢复或者替换。如果用户通常的资源利用低于50%,则集群会继续以退化的性能水平运行,直至失效被修复。

散布镜像

通过散布镜像,每台主机的主要Segment的镜像被散布在若干台主机上,涉及到的主机数量与每台主机上Segment数量相同。在集群初始化时设置散布镜像很容易,但是要求集群中的主机数至少为每台主机上的Segment数加一。

下面的图展示了一个在四台主机上有三个主Segment的集群的散布镜像配置。

greenplum Segment镜像配置介绍

扩展使用散布镜像的集群要求更多的规划并且可能会花费更多时间。用户必须要么增加一组数量等于每台主机上主Segment数加一的主机,要么在组镜像配置中增加两个节点并且在扩展完成时移动镜像来重建散布镜像配置。

对于单主机失效,散布镜像的性能影响最小,因为每台主机的镜像都散布在最大数量的主机上。负载的增加是1/N,其中N是每台主机上主Segment的数量。不过,如果两台以上主机同时失效,散布镜像是最有可能遭受到灾难性失效的配置方案。

块镜像

对于块镜像,节点被划分成块,例如具有四台或者八台主机的块,而每台主机上Segment的镜像被放置在块中的其他主机上。根据块中主机的数量以及每台主机上主Segment的数量,每台主机会为其他每一台主机的Segment维护超过一个镜像。

下面的图展示了单块镜像配置,块中有四台主机,每台主机有八个主Segment:

greenplum Segment镜像配置介绍

如果有八台主机,则额外增加的一个四主机块中有32至63号主Segment的镜像,其设置也是同样的模式。

使用块镜像的集群很容易扩展,因为每一个块都是一个自包含的主镜像组。集群可以通过增加一个或者多个块来扩展。扩展之后无需移动镜像来维持镜像设置的一致。只要失效的主机处于不同的块中,这种配置就能够容忍多主机失效。

因为块中的每台主机都有块中其他每台主机的多个镜像实例,对于主机失效块镜像的性能影响比散布镜像更大,但比组镜像影响要小。预期的性能影响随着块尺寸和每节点主Segment数变化。和组镜像类似,如果资源可用,性能将会受到负面的影响,但是集群仍将可用。如果资源不足以容纳增加的负载,用户必须降低负载直至失效节点被替换。

实现块镜像

在用户设置或者扩展集群时,块镜像并非Greenplum数据库提供的一种自动选项。要使用块镜像,用户必须创建自己的配置。

对于一个新的Greenplum系统,用户可以把集群初始化为没有镜像,然后用一个自定义镜像配置文件运行gpaddmirrors -i mirror_config_file来为每一个块创建镜像。在用户运行gpaddmirrors之前,用户必须为镜像Segment创建文件系统位置。详见Greenplum数据库管理工具指南中的gpadmirrors参考页。

如果用户扩展一个有块镜像的系统或者用户想要在扩展集群时实现块镜像,推荐用户先用默认的组镜像配置完成扩展,然后使用gpmovemirrors工具把镜像移到块配置中。

要在使用不同镜像方案的现有系统中实现块镜像,用户必须首先根据其块配置确定每个镜像的位置,然后确定哪些现有的镜像必须被重定位。按照下列步骤:

  1. 运行下列查询来查找主Segment和镜像Segment的当前位置:
    SELECT dbid, content, address, port, 
       replication_port, fselocation as datadir 
       FROM gp_segment_configuration, pg_filespace_entry 
       WHERE dbid=fsedbid AND content > -1
       ORDER BY dbid;

    gp_segment_configuration、pg_filespace以及 pg_filespace_entry系统目录表包含当前的Segment配置。

  2. 用当前镜像位置和想要的块镜像位置创建一个列表,然后从中移除已经在正确主机上的镜像。
  3. 用列表中必须要移动的每一个项(镜像)为gpmovemirrors工具创建一个输入文件。gpmovemirrors输入文件的格式如下:
    filespaceOrder=[filespace1_fsname[:filespace2_fsname:...]
    old_address:port:fselocation new_address:port:replication_port:fselocation[:fselocation:...]

    第一个非注释行必须是以filespaceOrder=开始的行。不要在文件空间列表中包括默认的pg_system文件空间。如果用户只使用pg_system文件空间,则让该列表为空。

    下面的gpmovemirrors输入文件例子指定了三个要移动的镜像Segment。
    filespaceOrder=
    sdw2:50001:/data2/mirror/gpseg1 sdw3:50000:51000:/data/mirror/gpseg1
    sdw2:50001:/data2/mirror/gpseg2 sdw4:50000:51000:/data/mirror/gpseg2
    sdw3:50001:/data2/mirror/gpseg3 sdw1:50000:51000:/data/mirror/gpseg3
    
  4. 用下面这样的命令运行gpmovemirrors:
    gpmovemirrors -i mirror_config_file

gpmovemirrors工具会验证该输入文件、调用gp_recoverseg来重定位每一个指定的镜像,并且移除原始的镜像。它会创建一个撤销配置文件,该文件可以被用作gpmovemirrors的输入来撤销所作的更改。撤销文件和输入文件同名,但会增加后缀_backout_timestamp。

关于gpmovemirrors工具的完整信息请见Greenplum数据库管理工具参考 。

转载地址:https://gp-docs-cn.github.io/docs/common/gpdb-features.html