【实战经验】Greenplum集群Master與Segment节点故障检测与恢复

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第1张图片

了解更多Greenplum相关内容,欢迎访问Greenplum中文社区网站

Greenplum集群主要包括Master节点和Segment节点,Master节点称之为主节点,Segment节点称之为数据节点。Master节点与Segment节点都是可以有备份的,其中Master节点的备节点为Standby Master(不能够自动故障转移),Segment是通过Primary Segment与Mirror Segment进行容错的。通过本文你可以了解:

  • Greenplum数据库的高可用(HA)原理

  • Greenplum生产集群中master节点故障恢复

  • Greenplum生产集群中segment故障检测与恢复

  • Segment节点故障恢复原理与实践

Greenplum数据库的高可用原理

1. master mirroring概述

可以在单独的主机或同一主机上部署master实例的备份或镜像。如果primary master服务器宕机,则standby master服务器将用作热备用服务器。在primary master服务器在线时,可以从primary master服务器创建备用master服务器。

Primary master服务器持续为用户提供服务,同时获取Primary master实例的事务快照。在standby master服务器上部署事务快照时,还会记录对primary master服务器的更改。在standby master服务器上部署快照后,更新也会被部署,用于使standby master服务器与primary master服务器同步。

Primary master服务器和standby master服务器同步后,standbymaster服务器将通过walsender 和 walreceiver 的复制进程保持最新状态。该walreceiver是standby master上的进程, walsender流程是primary master上的进程。这两个进程使用基于预读日志(WAL)的流复制来保持primary master和standby master服务器同步。在WAL日志记录中,所有修改都会在应用生效之前写入日志,以确保任何进程内操作的数据完整性。

由于primary master不包含任何用户数据,因此只需要在主master和standby master之间同步系统目录表(catalog tables)。当这些表发生更新时,更改的结果会自动复制到备用master上,以确保与主master同步。

如果primary master发生故障,管理员需要使用gpactivatestandby工具激活standby master。可以为primary master和standby master配置一个虚拟IP地址,这样,在primary master出现故障时,客户端程序就不用切换到其他的网络地址,因为在master出现故障时,虚拟IP地址可以交换到充当primary master的主机上。

2. mirror segment概述

当启用Greenplum数据库高可用性时,有两种类型的segment:primary和mirror。每个主segment具有一个对应的mirror segment。主segment接收来自master的请求以更改主segment的数据库,然后将这些更改复制到相应的mirror segment上。如果主segment不可用,则数据库查询将故障转移到mirror segment上。

Primary segment和Mirror segment之间的同步与primary master和standby master相同,也是采用基于WAL流的同步。

3. group mirroring方式

只要primary segment实例和mirror segment实例位于不同的主机上,mirror segment就可以以不同的配置方式放置在群集中的主机上。每个主机必须具有相同数量的mirror segment和primary segment。默认mirror segment配置方式是group mirroring,其中每个主机的primary segment的mirror segment位于另一个主机上。如果单个主机发生故障,则部署该主机的mirror segment主机上的活动primary segment数量会翻倍,从而会加大该主机的负载。下图说明了group mirroring配置。

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第2张图片

4. Spread mirroring方式

Spread mirroring方式是指将每个主机的mirror segment分布在多个主机上,这样,如果任何单个主机发生故障,该主机的mirror segment会分散到其他多个主机上运行,从而达到负载均衡的效果。仅当主机数量多于每个主机的segment数时,才可以使用Spread方式。下图说明了Spread mirroring方式。

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第3张图片

Master节点故障恢复

如果primary master节点失败,日志复制进程就会停止。可以使用gpstate -f命令查看standby master的状态,使用gpactivatestandby命令激活standby master。

1. 激活Standby master

(1)确保原来的集群中配置了standby master

(2)确保primary master已经停止运行,如果primary master仍在运行,提升standby master后,系统可能会有2个primary master,造成数据不一致

(3)在standby master主机上运行gpactivatestandby命令

$ gpactivatestandby -d /data/master/gpseg-1

-d参数是指standby master的数据目录,一旦激活成功,原来的standby master就成为了primary master。

(4)执行激活命令后,运行gpstate命令检查状态

$ gpstate -f

新激活的master的状态是active,如果已经为集群配置一个新的standby master节点,则其状态会是passive。如果还没有为集群配置一个新的standby master,则会看到下面的信息:No entries found,该信息表明尚未配置standby master。

(5)在成功切换到了standbymaster之后,运行ANALYZE命令,收集该数据库的统计信息

$ psql postgres -c 'ANALYZE;'

(6)可选:如果在成功激活standby master之后,尚未指定新的standby master,可以在active master上运行gpinitstandby命令,配置一个新的standby master

$ gpinitstandby -s new_standby_master_hostname -P  -S 

2. 恢复到原来的设置(可选的)

(1)确保之前的master节点能够正常使用

(2)在原来的master主机上,移除(备份)原来的数据目录gpseg-1,比如:

$ mv /data/master/gpseg-1  /data/master/backup_gpseg-1

(3)在原来的master节点上,初始化standby master,在active master上运行如下命令

$ gpinitstandby -s mdw

(4)初始化完成之后,检查standby master的状态

$ gpstate -f

显示的状态应该是--Sync state: sync

(5)在active master节点上运行下面的命令,用于停止master

$ gpstop -m

(6)在原来的master节点(mdw)上运行gpactivatestandby命令

$ gpactivatestandby -d /data/master/gpseg-1

(7)在上述命名运行结束之后,再运行gpstate命令查看状态

$ gpstate -f

确认原始的primary master状态是active。

(8)在原来的standby master节点(smdw)上,移除(备份)数据目录gpseg-1

$ mv /data/master/gpseg-1  /data/master/backup_gpseg-1

(9)原来的master节点正常运行之后,在该节点上执行如下命令,用于激活standby master

$ gpinitstandby -s smdw -P  -S 

3. 检查standby master的状态

可以通过查看视图pg_stat_replication,来获取更多的同步信息。该视图可以列出walsender进程的信息,下面的命令是查看walsender进程的进程id和状态信息。

$ psql postgres -c 'SELECT pid, state FROM pg_stat_replication;'

 Segment节点故障检测与恢复

1. 概述

Greenplum数据库主节点服务器上,postmas进程有一个子进程ftsprobe,它的主要作用是处理segment节点的故障检测和提升。ftsprobe 监视Greenplum数据库segments节点,它周期性地扫描所有segment节点。如果 ftsprobe无法连接到segment,它会在Greenplum数据库系统目录中将segment标记为”down”。在管理员启动恢复进程之前,该segment是不可以被操作的。

启用mirror备份后,如果primary segment不可用,Greenplum数据库会自动故障转移到mirror segment。如果segment实例或主机发生故障,系统仍可以运行,前提是所有在剩余的活动segment上数据都可用。

要恢复失败的segment,管理员需要执行 gprecoverseg 恢复工具。此工具可以找到失败的segment,验证它们是否有效,并将事务状态与当前活动的segment进行比较,以确定在segment脱机时所做的更改。gprecoverseg将更改的数据库文件与活动segment同步,并使该segment重新上线。管理员需要在在Greenplum数据库启动并运行时执行恢复操作。

禁用mirror备份时,如果segment实例失败,系统将变得几乎不可用。管理员需要手动恢复所有失败的segment。

2. 检测和管理失败的segment

使用工具命令查看

启用mirror备份后,当primary segment发生故障时,Greenplum会自动故障转移到mirror segment。如果每个数据部分所在的segment实例都是在线的,则用户可能无法意识到segment已经出现故障。如果在发生故障时正在进行事务(还未进入两阶段提交的第二阶段),则正在进行的事务将被回滚。

如果整个Greenplum数据库系统由于segment故障而变得不可访问(例如,如果未启用mirror备份或没有足够的segment在线),则用户在尝试连接数据库时将看到错误。返回到客户端程序的错误可能表示失败。例如:

ERROR:  failed to acquire resources on one or more segments

在master节点上,运行gpstate命令,使用-e参数显示错误的segment

$ gpstate -e
值得注意的是,即便是一组primary和mirror都发生了故障(double failure),在gp_segment_configuration中也只会有一个的status显示为’d'。这是因为mirror发生故障时,ftsprobe不会再向primary进行探测了,进而不会将剩下的节点标记为’d’。在进行query派发的时候,由于创建interconnect失败,QD进程向用户返回错误。

检查日志文件

日志文件可以提供信息以帮助确定错误的原因。Master实例和segment实例都有自己的日志文件,这些日志文件位于pg_log的目录下。Master的日志文件包含最多信息,应该首先检查它。

使用 gplogfilter工具检查Greenplum数据库日志文件,可以获取额外信息。要检查segment日志文件,可以在master主机上使用gpssh命令运行 gplogfilter。

(1)使用 gplogfilter 检查master日志文件的WARNING, ERROR, FATAL 或者 PANIC日志级别消息

$ gplogfilter -t

(2)使用 gpssh 检查每个segment实例上的日志级别为WARNING, ERROR, FATAL 或者 PANIC的消息。例如:

$ gpssh -f seg_hosts_file -e 'source/usr/local/greenplum-db/greenplum_path.sh ; gplogfilter -t/data1/primary/*/pg_log/gpdb*.log' > seglog.out

恢复失败的segment

如果master服务器无法连接到segment实例,则会在Greenplum数据库系统目录中将该segment标记为“down”状态。在管理员采取措施使segment实例重新上线之前,segment实例将保持脱机离线状态。segment实例可能由于多种原因而不可用:

(1)segment主机不可用; 例如,由于网络或硬件故障。

(2)segment实例未运行; 例如,没Postgres的数据库监听进程。

(3)segment实例的数据目录损坏或丢失; 例如,无法访问数据,文件系统已损坏或磁盘发生故障。

在启用mirror segment的情况下进行恢复

(1)确保master主机能够ping通失败的segment主机

$ ping failed_seg_host_address

(2)在master主机上运行下面命令,重新激活失败的segment

$ gprecoverseg

gprecoverseg的执行过程可能需要一些时间,在此过程中,数据库不允许写入操作。成功执行后,节点会作为备节点来使用。

(3)恢复进程会显示故障segment并标识需要同步的已更改文件。这个过程可能需要一些时间,等待该过程完成。在此过程中,数据库不允许写入操作。

(4)在 gprecoverseg完成后,系统进入重新同步模式并开始复制已更改的文件。当系统处于联机状态并接受数据库请求时,此进程在后台运行。

(5)重新同步过程完成后,系统状态为“已同步”( Synchronized)。运行gpstate 命令用于验证重新同步过程状态

$ gpstate -m

将所有的segment恢复到原来的角色设置

当primary segment发生故障时,mirror segment会被激活为primary segment。运行gprecoverseg命令之后,当前活动的segment是primary segment,失败的primary segment成为了mirror segment。segment实例不会返回到在系统初始化时配置的首选角色。这意味着某些segment主机上可能运行多个primary segment实例,而某些segment主机上运行较少的segment,即系统可能处于潜在的不平衡状态。要检查不平衡的segment,可以使用如下命令:

$ gpstate -e

所有segment必须在线并完全同步以重新平衡系统,数据库会话在重新平衡期间保持连接,但正在进行的查询将被取消并回滚。

(1)运行下面命令,查看mirror segment的角色和同步状态

$ gpstate -m

(2)如果有mirror segment处于非同步状态,等待他们同步完成

(3)运行gprecoverseg命令,使用-r参数将segment恢复到原来初始化时的角色设置

$ gprecoverseg -r

(4)运行gpstate -e命令,确认所有的segment是否恢复到初始化时的角色设置

$ gpstate -e

双重故障(double-fault)

在双重故障情况下,即primary segment和mirror segment都处于失败状态。如果不同segment的主机同时发生硬件故障,则会导致primary segment和mirror segment都处于失败状态。如果发生双重故障,Greenplum数据库将不可用。

Segment故障恢复原理与实践

1. Greenplum集群环境介绍

该生产环境集群由四台服务器构成,其中一台为primary master节点,一台为standby master节点,两外两台为segment节点,每个segment节点有四个segment(两个primary segment,两个mirror segment),segment采用group方式进行备份(sdw1的备份都在sdw2上,sdw2的备份都在sdw1上),其角色分配如下图所示:

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第4张图片

2. segment故障检查

gpstate -m日志信息

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第5张图片

gpstate -e 日志信息

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第6张图片

gpstate -e 日志信息

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第7张图片

gpstate -s 日志信息

(1)sdw1节点的日志信息

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第8张图片

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第9张图片

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第10张图片

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第11张图片

(2)sdw2节点的日志信息

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第12张图片

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第13张图片

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第14张图片

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第15张图片

3. 故障说明

sdw1节点primary segment正常,mirror segment被激活,其mirror segment为sdw2节点上的primary segment备份。sdw2节点primary segment失败,mirror segment失败。此时集群环境能够正常提供服务,全部负载到sdw1节点上。

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第16张图片

使用select * from gp_segment_configuration查看segment角色信息,如下图所示:

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第17张图片

4. segment故障恢复

在master主机上运行下面命令,重新激活失败的segment

$ gprecoverseg
 

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第18张图片

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第19张图片

运行gpstate 命令用于验证重新同步过程状态

$ gpstate -m
 

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第20张图片

当primary segment发生故障时,mirror segment会被激活为primary segment。运行gprecoverseg命令之后,失败的primary segment成为了mirror segment,而mirror segment被fts probe进程提升成为primary segment。segment实例不会返回到在系统初始化时配置的首选角色。这意味着某些segment主机上可能运行多个primary segment实例,而某些segment主机上运行较少的segment,即系统可能处于潜在的不平衡状态。如下图所示,sdw1上的mirror segment变为了primary segment,sdw2上的primary segment变为了mirror segment。即sdw2的primary segment运行在sdw1节点上,系统处于不平衡状态。

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第21张图片

运行gprecoverseg命令,使用-r参数将segment恢复到原来初始化时的角色设置

$ gprecoverseg -r

再次查询gp_segment_configuration会发现,所有的 segment都处于up状态,并且它们此时的角色和初始化集群时分配的角色一致。

【实战经验】Greenplum集群Master與Segment节点故障检测与恢复_第22张图片

小结

本文主要介绍了GP的高可用原理及实践。首先介绍了Master与Segment的容错策略,然后介绍了Master节点与Segment节点故障恢复的步骤,最后给出了一个完整的实践过程。

你可能感兴趣的:(Greenplum,数据库,大数据,分布式,python,redis)