Greenplum作为一款基于PostgreSQL的OLAP分布式MPP架构,其内部的角色可以通过配置冗余来保证高可用性,无论是管理节点还是计算节点。管理节点可以为Master配置一个Standby来保证高可用,而计算节点则可以为每个Primary segment配置一个对应的Mirror segment来保证其高可用性。本文主要说明对于Segment的镜像分布,提供的几种分布策略。
一般情况下,对于每个计算节点,尤其是使用物理机的情况下,为了能够充分利用机器的资源,会在节点上部署多个segment,每个segment是一个单独的PostgreSQL实例,存储一部分用户数据。多个segment同时工作,从而提供高并发的OLAP分析能力。
对外提供服务的segment称为Primary segment,即主实例。为了保证高可用性,为每个主实例配置一个对应的Mirror,即镜像实例,主实例和镜像实例之间基于PostgreSQL本身的WAL流复制能力,保证数据的一致性。
集群的高可用能力,一般是在某一台物理节点出现故障时,数据仍然不丢失,且通过故障检测与故障切换机制可以保证业务在短时间内可以恢复。因此,我们需要将每个Primary segment与对应的Mirror segment分开部署在不同的物理节点上。在一个由多个节点组成的集群中,Mirror segment怎么分配,其实有多种形式,这也就是我们后面要介绍的镜像分布策略。
Greenplum官方提供的镜像分布策略有几种:
组镜像分布(group mirror)
组镜像分布是默认的镜像分布策略。这种分布策略是把每台主机上的Primary segment对应的Mirror segment都整体放在另外一台主机上。如果有一台主机发生故障,那么这台主机上所有的Primary segment都会切换到另外一台主机,导致另外一台主机上的segment数量翻倍。
优点: 除非同一个Segment的主实例和镜像实例都失效,最多可以有一半的主机失效并且集群可以继续运行。
缺点: 任何主机失效会导致一个主机负载翻倍,木桶效应明显。因此必须要尽快恢复故障节点并将主实例切换回来。
散列镜像分布(spread mirror)
散列镜像分布是将每个主机上的Primary segment分散到多台主机上。如果有一台主机发生故障,每个机器上至多只有一个镜像提升为Primary segment,因此这种方式可以防止单台主机故障后另外的主机压力骤增。
这种镜像分布方式要求集群主机数量多于每台主机上的Primary Segment的数量。
优点: 对于单主机失效的情况,对性能影响最小,因为每台主机的镜像都散布在最大数量的主机上。负载的增加是1/N,N代表每台主机上主实例的数量。
缺点: 如果两台以上主机同时失效,最有可能导致整个集群不可用。
自定义镜像分布
除了组镜像分布策略和散列镜像分布策略之外,用户还可以自定义镜像分布策略。
有些基于Greenplum的数据库自己定义了额外的镜像分布策略,比如 YMatrix默认的镜像分布策略叫 环状镜像分布策略(Ring Mirroring):即在至少有两台主机的情况下,将一个主机中的 Primary 序号序列看作一个一维纸带,从中间对折,然后在另外的主机上从对折的中间序号为起点,顺时针均匀排列 Mirror 到其他主机。 扩容增加新的 Primary 不会影响之前已分布完成的镜像闭环,而是开启一个新的镜像环。
还有一种叫块镜像分布策略,就是把数据库集群中的节点划分成块,每台主机上Segment的镜像被放在块中的其他主机上。使用块镜像的集群比较容易扩展,因为每一个块都是一个自包含的主镜像组。集群可以通过增加一个或多个块来扩展。只有故障的主机处于不同的块中,这种配置就能够容忍多主机失效。