可以通过这些方式实现Greenplum数据库系统的高可用性:提供容错硬件平台;启用Greenplum数据库的高可用性功能;执行定期监控和运维作业以确保所有系统组件保持健康。
硬件组件终归会因正常耗损或意外情况而发生故障。断电可能导致组件暂时不可用。通过为可能发生故障的组件提供冗余的备用组件,可以使系统具有高可用性,从而在发生故障时使服务不间断。在有些情况下,冗余的成本高于用户对服务中断的承受能力。在这种情况下,高可用的目标是确保能够恢复完整的服务,且能在预期的时间内恢复完成。
Greenplum数据库部署最佳实践是,采用硬件级别的RAID为单个磁盘失败的情况提供高性能的磁盘冗余,而不必考虑数据库级别的容错。该方式可以在磁盘级别提供了低级别的冗余保护。
Greenplum数据库使用校验和,来验证从磁盘加载到内存的数据在文件系统上没有被破坏。
Greenplum数据库有两种存储用户数据的方式:堆表和AO表。两种存储模型都使用校验和来验证从文件系统读取的数据,默认配置下,它们以类似的方式处理校验和验证错误。
Greenplum数据库master和segment实例在它们所管理的内存中更新页面上的数据。当内存页面被更新并刷新到磁盘时,将计算校验和并与页面一起保存。以后从磁盘检索页面时先验证校验和,并且仅在验证成功的情况下才允许页面进入管理内存。校验和验证失败表示文件系统已损坏,这会导致Greenplum数据库生成一个错误,并中止事务。
默认的校验和设置提供了最佳的保护级别,可以防止未检测到的磁盘损坏传播进数据库和镜像的segment。
堆表的校验和支持在Greenplum数据库采用gpinitsystem初始化时默认启用。可以通过设置 gpinitsystem配置文件中的HEAP_CHECKSUM参数为off来禁用堆表的校验和功能,但是强烈不推荐这么做,详见gpinitsystem。
一旦集群初始化完成,就不能改变堆表的校验和功能在该集群上的状态,除非重新初始化系统并重载数据库。
可以通过查看只读的服务器配置参数 data_checksums ,来查看是否在集群中启用了堆表的校验和:
$ gpconfig -s data_checksums
当启动Greenplum数据库集群时,gpstart工具会检查堆表的校验和在master和所有segment上是否一致地启用还是禁用。如果存在不一致,集群会启动失败。请参考gpstart。
在有些情况下,为了数据能被恢复,有必要忽略堆表校验和的验证错误,设置ignore_checksum_failure系统配置参数为on,会使Greenplum数据库在堆表和验证失败时只生成一个警告信息,数据页仍然可以被夹在到管理内存中。 如果该页被更新并保存到磁盘,损坏的数据也被复制到镜像segment节点。因为这会导致数据丢失,所以只有在启用数据恢复时才允许设置ignore_checksum_failure参数为on。
对于AO表,校验和支持是在使用CREATE TABLE命令创建AO表时设置的几个存储选项之一。 默认的存储选项在 gp_default_storage_options服务器配置参数中定义。checksum 存储选项默认被启用并且强烈不建议禁用它。
如果想要禁用AO表上的校验和,您可以
注意:CREATE TABLE允许为每一个单独的分区表,设置包括checksums在内的存储选项。
有关语法和示例,请查看创建表命令参考和 gp_default_storage_options 配置参数参考。
Greenplum数据库将数据存储在多个segment实例中,每个实例都是一个Greenplum数据库PostgreSQL实例。每个表的数据根据创建表时在DDL中为表定义的分布策略,分布在各segment之中。启用segment镜像后,每个segment实例都有一对primary和mirror。使用基于预写日志记录(WAL)的流复制,使镜像segment与主segment保持最新。请参见segment镜像概述。
镜像实例通常采用gpinitsystem或gpexpand工具进行初始化。作为最佳实践,为防止单机故障,镜像实例通常运行在与主实例不同的主机上。将镜像分配到不同的主机上也有不同的策略。当选择主实例和镜像实例的放置位置时,重要的是考虑故障场景,以确保当单机发生故障的情况下能最小化地处理倾斜。
在一个高可用集群中,有两个master实例:主master和备master。与segment一样,主master和备master应部署在不同的主机上,以便群集可以单机故障容错。客户端连接到主master,且查询只在主master上执行。使用基于预写日志记录(WAL)的流复制,备用master与主master保持最新状态。请参阅Master镜像概述。
如果主master出现故障,管理员可以通过运行gpactivatestandby工具,让备master作为新的主master来接管。可以通过在主master和备master上配置一个虚拟IP地址,来保证当发生切换后,客户端不需要在不同的网址之间切换。如果主master发生故障,虚拟IP可以漂移到新的活动master上继续提供服务。
通过维护两个存储相同数据的Greenplum数据库集群,可以提供更高级别的冗余。
保持双集群数据同步有两种方法,分别叫做"双ETL"和"备份/恢复"。
双ETL提供了一个完整的备用群集,其数据与主群集相同。ETL(提取,转换和加载)是指清理、转换、验证并将数据加载到数据仓库中的过程。使用双ETL,此过程并行执行两次,每个集群一次,每次都需要被验证。它还允许在两个群集上查询数据,从而使查询吞吐量增加一倍。应用程序可以利用两个集群,也可以确保两个集群上的ETL成功并通过验证。
使用备份/还原方法维护双集群,请创建主集群的备份并将其恢复到次集群上。与双ETL策略相比,此方法在次集群上同步数据花费的时间更长,但是需要开发的应用程序逻辑更少。在数据修改和ETL每天或更低频率的执行情况下,使用备份填充第二个集群是理想的选择。
建议定期备份数据库,除非可以轻松地从源数据重新生成数据库。应进行备份以防止操作、软件和硬件错误。
使用 gpbackup 工具来备份Greenplum数据库。 gpbackup在所有segment上执行并行备份, 所以备份能力随着硬件增加线性扩展。
在设计备份策略时,最主要的关注点是存储备份数据的位置。每个segment管理的数据可以备份到其本地的存储中,但不能永久存储在该位置——备份会减少segment的磁盘空间,更重要的是,硬件故障可能同时破坏该segment的实时数据和备份。执行备份后,应将备份文件从主群集移至独立的、安全的存储。或者,可以直接备份到单独的存储中。
采用Greenplum数据库存储插件工具gpbackup和gprestore,您可以将备份发送到/读取自远程位置或存储设备。该存储插件支持连接到包括Amazon Simple Storage Service(Amazon S3)和Dell EMC Data Domain在内的存储设备。
使用备份/恢复的存储插件API,您可以创建一个自定义的插件, gpbackup 和 gprestore工具可以使用该插件,将自定义的备份存储系统与Greenplum数据库集成。
有关使用gpbackup 和 gprestore的信息,请参阅使用gpbackup和gprestore进行并行备份。