Segment镜像配置
Segment镜像允许数据库查询在主Segment失效或不可用时转移到备份Segment。Pivotal要求Greenplum数据库用于生产系统使用镜像。
为了确保高可用,主Segment及其镜像必须位于不同的主机上。Greenplum数据库系统中的
每台主机都有相同数量的primary Segment和mirror Segment
。主机应该在
每个接口上有相同数量的主Segment和镜像Segment
。这确保了当所有的主Segment都可以运行时,Segment主机和网络资源的负载均衡,并将最大资源用于查询处理。
当一个Segment不可用时,它在另一台主机上的镜像Segment将成为活动的主Segment并处理可以继续。主机上的额外负载会造成倾斜并性能退化,但应允许系统继续运行。直到所有的Segment返回结果,一个数据库查询才完成,因此额外活动主Segment的单个主机与向集群中的每台主机添加额外的主Segment具有相同的效果。
在失效场景中,当没有主机超过一个镜像Segment承担主Segment角色时,性能退化程度最小。如果多个Segment或主机失效,性能退化的程度取决于其上有最多镜像Segment承担主要Segment角色的主机。将主机镜像散布在其余主机上可以最大限度地减少单个主机失效时的性能退化。
在通过添加主机扩展集群时,考虑集群对多主机失效的容忍度以及如何维护镜像配置也是很重要的。没有一种适合任意情况的理想镜像配置。
用户可以允许Greenplum数据库使用两种标准配置之一在集群中的主机上安排镜像,或者可以设计自己的镜像配置。
-
组镜像(group mirroring)
每个主机镜像另一个主机的主Segment。这是gpinitsystem和gpaddmirrors的默认值。 -
散布镜像(spread mirroring)
镜像分布在可用主机上。这要求
集群中的主机数大于每台主机的Segment数
。 -
块镜像(block mirroring)
块镜像是一种自定义镜像配置,它把集群中的主机划分成大小相等的块并且在块内的主机上均匀地分布镜像。如果一个主Segment失效,其在同一块的另一主机上的镜像会变成活动的主Segment。如果一台Segment主机失效,在该块中其他每一台主机上的镜像Segment都会变成活动的。
下面将比较组镜像、散布镜像和块镜像三种配置:
组镜像
组镜像是Greenplum的默认镜像配置。组镜像的扩展代价最低,因为可以通过增加仅仅两台主机来完成扩展。在扩展之后无需移动镜像来维持镜像配置的一致性。
如图显示了一个在四台主机上带有八个主Segment的组镜像配置。
除非同一个Segment实例的主Segment和镜像都失效,最多可以有一半的主机失效并且集群将继续运行,只要资源(CPU、内存和IO)足以满足需求。
任何主机失效将会让性能退化一半以上,因为具有镜像的主机将承担两倍的活动主Segment。如果用户的资源利用通常会超过50%,用户将不得不调整其负载,直至失效主机被恢复或者替换。如果用户通常的资源利用低于50%,则集群会继续以退化的性能水平运行,直至失效被修复。
散布镜像
通过散布镜像,每台主机的主要Segment的镜像被散布在若干台主机上,涉及到的主机数量与每台主机上Segment数量相同。在集群初始化时设置散布镜像很容易,但是
要求集群中的主机数至少为每台主机上的Segment数加一
。
如图展示了一个在四台主机上有三个主Segment的集群的散布镜像配置。
集群扩展使用散布镜像要求更多的规划并且可能会花费更多时间。
- 用户新增的主机数必须等于等于每个主机上primary Segment的数量加1。
- 在组镜像配置中增加两个节点并且在扩展完成时移动镜像来重建散布镜像配置。
对于单主机失效,散布镜像的性能影响最小,因为每台主机的镜像都散布在最大数量的主机上。负载的增加是1/N,其中N是每台主机上主Segment的数量。不过,如果两台以上主机同时失效,散布镜像是最有可能遭受到灾难性失效的配置方案。
块镜像
对于块镜像,节点被划分成块,例如具有四台或者八台主机的块,而每台主机上Segment的镜像被放置在块中的其他主机上。根据块中主机的数量以及每台主机上主Segment的数量,每台主机会为其他每一台主机的Segment维护超过一个镜像。
下面的图展示了块镜像配置,块中有3台主机,每台主机有4个主Segment:
如果有12台主机,则额外增加的一个3主机块中有36至47号主Segment的镜像,其设置也是同样的模式。
使用块镜像的集群很容易扩展,因为每一个块都是一个自包含的主镜像组。集群扩展可以通过增加一个或者多个块。扩展之后无需移动镜像来维持镜像设置的一致。只要失效的主机处于不同的块中,这种配置就能够容忍多主机失效。
因为块中的每台主机都有块中其他每台主机的多个镜像实例,
对于主机失效,块镜像的性能影响比散布镜像更大,但比组镜像影响要小
。预期的性能影响随着块尺寸和每节点主Segment数变化。和组镜像类似,如果资源可用,性能将会受到负面的影响,但是集群仍将可用。如果资源不足以容纳增加的负载,用户必须降低负载直至失效节点被替换。
实现块镜像
在用户创建或者扩展集群时,块镜像并非Greenplum数据库提供的一种自动选项。要使用块镜像,用户必须创建自己的配置。
对于一个新的Greenplum系统,用户可以把集群初始化为没有镜像,然后用一个自定义镜像配置文件运行gpaddmirrors -i mirror_config_file来为每一个块创建镜像。在用户运行gpaddmirrors之前,用户必须为镜像Segment创建文件系统位置。
如果用户扩展一个有块镜像的系统或者用户想要在扩展集群时实现块镜像,推荐用户先用
默认的组镜像配置完成扩展,然后使用gpmovemirrors工具把镜像移到块配置中。
要在使用不同镜像方案的现有系统中实现块镜像,用户必须首先根据其块配置确定每个镜像的位置,然后确定哪些现有的镜像必须被重定位。按照下列步骤:
- 运行下列查询来查找主Segment和镜像Segment的当前位置
postgres=# SELECT dbid, content, role, port, hostname, datadir FROM gp_segment_configuration WHERE content > -1 ; dbid | content | role | port | hostname | datadir
------+---------+------+-------+----------+-----------------------------------------------
6 | 4 | p | 40000 | dhss229 | /home/gpadmin/gpdata1/primary/default/gpseg4
22 | 4 | m | 50000 | dhss206 | /home/gpadmin/gpdata1/mirror/default/gpseg4
7 | 5 | p | 40001 | dhss229 | /home/gpadmin/gpdata1/primary/default/gpseg5
23 | 5 | m | 50001 | dhss206 | /home/gpadmin/gpdata1/mirror/default/gpseg5
8 | 6 | p | 40002 | dhss229 | /home/gpadmin/gpdata2/primary/default/gpseg6
24 | 6 | m | 50002 | dhss206 | /home/gpadmin/gpdata2/mirror/default/gpseg6
9 | 7 | p | 40003 | dhss229 | /home/gpadmin/gpdata2/primary/default/gpseg7
25 | 7 | m | 50003 | dhss206 | /home/gpadmin/gpdata2/mirror/default/gpseg7
10 | 8 | p | 40000 | dhss232 | /home/gpadmin/gpdata1/primary/default/gpseg8
18 | 8 | m | 50000 | dhss229 | /home/gpadmin/gpdata1/mirror/default/gpseg8
11 | 9 | p | 40001 | dhss232 | /home/gpadmin/gpdata1/primary/default/gpseg9
19 | 9 | m | 50001 | dhss229 | /home/gpadmin/gpdata1/mirror/default/gpseg9
12 | 10 | p | 40002 | dhss232 | /home/gpadmin/gpdata2/primary/default/gpseg10
20 | 10 | m | 50002 | dhss229 | /home/gpadmin/gpdata2/mirror/default/gpseg10
13 | 11 | p | 40003 | dhss232 | /home/gpadmin/gpdata2/primary/default/gpseg11
21 | 11 | m | 50003 | dhss229 | /home/gpadmin/gpdata2/mirror/default/gpseg11
2 | 0 | p | 40000 | dhss206 | /home/gpadmin/gpdata1/primary/default/gpseg0
14 | 0 | m | 50000 | dhss232 | /home/gpadmin/gpdata1/mirror/default/gpseg0
3 | 1 | p | 40001 | dhss206 | /home/gpadmin/gpdata1/primary/default/gpseg1
15 | 1 | m | 50001 | dhss232 | /home/gpadmin/gpdata1/mirror/default/gpseg1
4 | 2 | p | 40002 | dhss206 | /home/gpadmin/gpdata2/primary/default/gpseg2
16 | 2 | m | 50002 | dhss232 | /home/gpadmin/gpdata2/mirror/default/gpseg2
5 | 3 | p | 40003 | dhss206 | /home/gpadmin/gpdata2/primary/default/gpseg3
17 | 3 | m | 50003 | dhss232 | /home/gpadmin/gpdata2/mirror/default/gpseg3
(24 rows)
- 用当前镜像位置和想要的块镜像位置创建一个列表,然后从中移除已经在正确主机上的镜像。
- 用列表中必须要移动的每一个项(镜像)为gpmovemirrors工具创建一个输入文件。gpmovemirrors输入文件的格式如下:
contentID|address|port|data_dir new_address|port|data_dir
- 运行gpmovemirrors
gpmovemirrors -i mirror_config_file