Greenplum数据库高可用性概述
Greenplum数据库高可用性概述
通过提供一个容错硬件平台、启用Greenplum数据库高可用特性以及执行定期的监控和维护过程来确保所有系统组件的健康,Greenplum数据库集群可以被配置成高可用的。
硬件组件最终将会失效,不管是因为正常的磨损还是意外的情况。断电可能导致部件临时不可用。对可能失效的部件提供冗余后备可以让系统变成高可用的,这样当失效真正发生时服务可以继续而不中断。在一些情况下,冗余的代价比用户所能容忍的服务中断更高。当发生这种情况时,目标应该是确保整个服务能被恢复并且能在一个期望的时间表内被恢复。
硬件级RAID
一种典范的Greenplum数据库部署会使用硬件级RAID为但磁盘失效提供高性能冗余,而不需要进入到数据库级别的容错。这在磁盘级别提供了一种较低层次的冗余。
Segment镜像
Greenplum数据库在多个Segment中存储数据,其中每个Segment都是一个Greenplum数据库的Postgres实例。每个表的数据被基于分布策略散布在Segment之间,表的分部策略在表创建时由DDL定义。当Segment镜像被启用时,对每个Segment都有一对主Segment和镜像Segment。主Segment和镜像Segment执行相同的IO操作并且存储同一数据的拷贝。
每个Segment的镜像实例通常由gpinitsystem工具或者gpexpand工具初始化。运行在不同于主实例的主机上的镜像可以防止单机失效。有不同的策略来将镜像指派给主机。在选择主Segment和镜像Segment布局时,重点要考虑在单机失效情况下使处理倾斜最小化。
Master镜像
在高可用的集群中有两个Master,一个主Master和一个后备Master。和Segment一样,Master和后备Master应该被部署在不同的主机上,这样集群能容忍单机失效。客户端会连接到主Master,并且只有主Master才能执行查询。后备Master通过从主Master复制预写式日志(WAL)来保持与主Master的同步。
如果主Master失效,管理员运行gpactivatestandby工具让后备Master接替成为新的主Master。可以为Master和后备Master配置虚拟IP地址,这样在当前Master改变时客户端程序无需切换到一个不同的网络地址。如果Master主机失效,虚拟IP地址可以被交换到实际活动的Master上。
双集群
通过维护两个Greenplum数据库集群(都存储相同的数据),可以提供额外层次的冗余。
在双集群上保持数据同步的两种方法是"双ETL"和"备份/恢复"。
双ETL提供了一个完整的后备集群,它具有和主集群完全像相同的数据。ETL(抽取、转换和装载)表示把到来的数据进行清洗、转换、验证并且装载到数据仓库中的处理。通过双ETL,这一处理会被并行执行两次,在每个集群上执行一次,并且每次都做验证。它还允许在两个集群上查询数据,这可以使查询吞吐量翻倍。应用可以从两个集群获益并且还能确保ETL在两个集群上成功并且被验证。
要用备份/恢复方法维护一个双集群,需要创建主集群的备份并且在第二个集群上恢复它们。这种方法需要双ETL策略更长的时间在第二个集群上同步数据,但是需要开发的应用逻辑更少。当数据修改和ETL以每日或者更低频率被执行时,用备份来填充第二个集群更加理想。
备份和恢复
推荐定期制作数据库的备份,除非该数据库可以容易地从源数据重新生成。应该取得备份来防止操作性、软件和硬件错误。
使用gpcrondump工具备份Greenplum数据库。gpcrondomp在Segment间并行地执行备份,这样当集群中增加了新硬件时备份性能也会被放大。
在设计备份策略时,要重点关注的是在哪里存储备份数据。每个Segment管理的数据可以被备份在该Segment的本地存储中,但不应被长久存储 - 备份会减少该Segment可用的磁盘空间,而且更重要的是一次硬件失效可能会同时摧毁该Segment的实时数据和备份。在执行一次备份后,备份文件应该被从主集群移到独立的、安全的存储。或者,备份可以直接创建在独立的存储上。
备份数据库还有一些额外选项可用,包括:
- Data Domain
- 通过本地API集成,备份可以被流式传送到一台Dell EMC Data Domain装置。
- NetBackup
- 通过本地API集成,备份可以被流式传送到一个Veritas NetBackup集群。
- NFS
- 如果在集群中每台Greenplum数据库主机上都创建有一个NFS挂载,备份可以被直接写到该NFS挂载。推荐使用一种横向扩展的NFS方案来确保备份不会受到NFS设备IO吞吐量瓶颈的影响。Dell EMC Isilon是一个可以随着Greenplum集群横向扩展的例子。
增量备份
Greenplum数据库对于追加优化和列存表允许分区级别的增量备份。在执行一次增量备份时,只有上一次备份以来有改变的追加优化和列存表的分区才会被备份(堆表总是会被备份)。恢复一个增量备份要求恢复上一个完全备份及其后的增量备份。
当数据库包含大型已分区表且大部分分区在两次备份期间保持不变时,增量备份是很有益处的。一个增量备份值保存改变过的分区和堆表。通过跳过未改变的分区,备份的尺寸和时间可以被显著地降低。
如果一个大型的事实表没有被分区,并且增加或者更改了单个行,整个表都会被备份,并且备份尺寸或者时间都没有省下来。因此,只推荐把增量备份用于大型的分区表以及相对较小的维表。
如果维护双集群并且使用增量备份,可以用增量备份来填充第二个集群。这可以使用--noplan选项来实现,它允许来自主站点的备份被更快地应用。