前面介绍过了GREENPLUM数据库的备份和恢复。这部分主要介绍GREENPLUM的高可用性配置。GREENPLUM的高可用性是通过master和segment的镜像来实现的。这种镜像是基于服务器级别的镜像。因此,不仅可以提供存储级别的保护,还可以防止其它PC服务器硬件的损坏。

segment级别的镜像是通过把primary segment对应的mirror segment放置到不同的物理主机实现的。正常情况下,只有primary segment的instance处于工作状态,所有primary segment上的变化通过文件块的复制技术拷贝到mirror segment。因此,存放mirror segment的主机上只有复制用的进程,而不存在mirror segment instance。一旦primary segment出现故障,mirror segment的复制进程停止,并启动instance,保证数据库的操作继续。


segment的故障检测是通过后台进程ftsprobe实现的,并可以进行自动容错,不需要DBA进行干预。ftsprobe的检测间隔是通过global服务参数gp_fts_probe_interval进行定义的,默认值是1分钟,通常这个参数的设置应该与参数gp_segment_connect_timeout保持一致。一旦ftsprobe进程发现primary segment出现故障,它会在数据字典中标记该segment已经停止。只有管理员对其进行恢复后,才会改变状态。

如果系统没有进行segment级别的镜像,当出现segment故障后,整个系统都将脱机,直到恢复故障segment后,才可以重新启动。

启用segment镜像,既可以在初始化系统时进行,也可以为存在的系统添加mirror。

如果在初始化系统是要求添加镜像,需要在初始化配置文件中添加如下参数

MIRROR_PORT_BASE  指定第一个mirror segment的端口号,其它mirror segment在此基础上加1,它的设置范围是1到65535,但是设置时要注意不能与primary segment冲突。

REPLICATION_PORT_BASE 指定第一个primary segment用于数据复制的端口号,其它primary segment以此为基础,每次加1,计算复制用端口号。它的设置也不要与primary segment冲突。取值范围1到65535

MIRROR_REPLICATION_PORT_BASE   指定第一个mirror segment用于数据复制的端口号,其它mirror segment以此为基础,每次加1,计算复制用端口号。它的设置也不要与mirror segment冲突。取值范围1到65535

MIRROR_DATA_DIRECTORY 指定了mirror segment的数据目录,声明的目录数量必须与primary segment的目录数量一致,而且要保证进行初始化操作的os用户对这些目录有读写权限。

然后调用gpinitsystem进行初始化,默认是使阵列中的主机相互存放对方的镜像。如果主机的数量多于segment的数量,可以使用-S选项,指定使用哪些主机作为镜像用。

如果原有系统没有镜像,我们也可以向存在的系统添加镜像。首先要获取添加镜像的构造文件。这个文件可以自己编辑,也可以通过gpaddmirrors自动生成,然后在此基础上根据需要进行修改。比如自动生成添加mirror的构造文件

$ gpaddmirrors -o filename

文本编辑器打开该构造文件,可以看到其格式如下

mirror[content]=content:hostname:address:port:mir_replication_port:pri_replication_port:datadir_location

默认配置是原有的主机间互为镜像,我们也可以添加新的主机作为镜像使用,从而减少镜像对性能的影响。

在得到mirror构造文件后,可以掉用命令启用镜像。

$ gpaddmirrors -i mirror_config_file

这时系统会根据配置文件设置,复制镜像,并对镜像进行同步,提供保护。需要注意的是,在添加镜像前应该先备份数据库,防止镜像添加失败(比如网路配置问题,内核参数设置不正确可能导致添加镜像失败)。因为GREENPLUM目前只能添加镜像,不能删除镜像。如果添加镜像失败会导致系统处于不正常状态。

由于mirror segment可以自动failover,因此当primary segment出现故障时,管理员可能无法及时察觉。所以一方面管理员应该对系统定期检查,另外一方面如果系统性能大幅下降(理论上,如果采用互为镜像方式,当一个主机出现故障时,整个系统性能下降一半)管理员也应该进行系统检查,判断是否有segment已经down掉了。

检查是否有segment down掉,可以在master上执行gpstate,如果看到类似这样的内容[WARN]:-Total primary segment failures (at master) = 1 <<<<<

此外,DBA还应该检查master和segment上的日志,通过$ gplogfilter -t可以获取WARNING, ERROR, FATAL 或者PANIC级别的日志信息帮助进行troubleshooting。

一般来说,造成segment故障的原因主要就是三大类,一类是segment主机由于硬件问题或者网络问题无法访问,一类是segment的相关进程出现故障,比如被kill掉了。还有就是存储问题,比如控制器故障等等。在这些问题被解决之后,系统不会自动恢复故障segment,必须由DBA手工进行恢复。这需要在master上调用命令$ gprecoverseg 进行。它从故障之后产生的变化开始捕获,整个操作会在后台进行。所以需要DBA调用命令gpstate -m判断恢复操作完成的进度情况。

如果原始主机无法恢复,并且启用mirror,用命令$ gprecoverseg -i recover_config_file,指定新的主机进行恢复。配置文件的格式如下

failed_host_address:port:datadir

recovery_host_address:recovery_host_name:port:replication_port:fselocation

当然替代主机需要事先装好greenplum的软件。另外,3.x版本中的参数gp_fault_action已经废弃掉了。gprecoverseg在4.x版本中可以联机执行。

注:如果segment出现故障,已经执行的操作会中断,需要重新提交操作