PG的两种集群技术:Pgpool-II与Postgres-XL

  • Post author:
  • Post category:其他


最近研究了PG的两种集群方案,分别是Pgpool-II和Postgres-XL,在这里总结一下二者的机制、结构、优劣、测试结果等。


1、 Pgpool-II和Postgres-XL简介


据我目前的了解,Pgpool-II和Postgres-XL是PG集群开源实现中比较成功的两个项目,互联网上相关的介绍也不少,但尚不确定二者在企业生产环境中是否被广泛使用。其中Pgpool-II的前身的Pgpool-I,Postgres-XL的前身是Postgres-XC。


1.1、Pgpool-II


Pgpool-II相当于中间件,位于应用程序和PG服务端之间,对应用程序来说,Pgpool-II就相当于PG服务端;对PG服务端来说,Pgpool-II相当于PG客户端。由此可见,Pgpool-II与PG是解耦合的,基于这样的机制,Pgpool-II可以搭建在已经存在的任意版本的PG主从结构上,主从结构的实现与Pgpool-II无关,可以通过slony等工具或者PG自身的流复制机制实现。除了主从结构的集群,Pgpool-II也支持多主结构,称为复制模式,该模式下PG节点之间是对等的,没有主从关系,写操作同时在所有节点上执行,这种模式下写操作的代价很大,性能上不及主从模式。PG 9.3之后支持的流复制机制可以方便的搭建主从结构的集群(包括同步复制与异步复制),因此Pgpool-II中比较常用的模式是流复制主从模式,其结构如下图(也可以一主多从)。


Pgpool主从模式集群的结构

既然PG可以通过自身的流复制机制方便的搭建主从结构集群,为什么还要在它上面搭建Pgpool-II呢?因为简单的主从结构集群并不能提供连接池、负载均衡、自动故障切换等功能,Pgpool-II正好可以做到这些,当然负载均衡只针对读操作,写操作只发生在主节点上。为了避免单点故障,Pgpool-II自身也可以配置为主从结构,对外提供虚拟IP地址,当主节点故障后,从节点提升为新的主节点并接管虚拟IP。


1.2、Postgres-XL


Postgres-XL的机制和Pgpool-II大不相同,它不是独立于PG的,是在PG源代码的基础上增加新功能实现的。简单来说,Postgres-XL将PG的SQL解析层的工作和数据存取层的工作分离到不同的两种节点上,分别称为Coordinator节点和Datanode节点,而且每种节点可以配置多个,共同协调完成原本单个PG实例完成的工作。此外,为了保证分布模式下事务能够正确执行,增加了一个GTM节点。为了避免单点故障,可以为所有节点配置对应的slave节点。Postgres-XL结构图见下图,来自官网。


Postgres-XL集群的结构

Postgres-XL的Coordinator节点是整个集群的数据访问入口,可以配置多个,然后在它们之上通过Nginx等工具实现负载均衡。Coordinator节点维护着数据的存储信息,但不存储数据本身。接收到一条SQL语句后,Coordinator解析SQL,制定执行计划,然后分发任务到相关的Datanode上,Datanode返回执行结果到Coordinator,Coordinator整合各个Datanode返回的结果,最后返回给客户端。

Postgres-XL的Datanode节点负责实际存取数据,数据在多个Datanode上的分布有两种方式:复制模式和分片模式,复制模式下,一个表的数据在指定的节点上存在多个副本;分片模式下,一个表的数据按照指定的规则分布在多个数据节点上,这些节点共同保存一份完整的数据。这两种模式的选择是在创建表的时候执行CREATE TABLE语句指定的,也可以通过ALTER TABLE语句改变数据的分布方式。


2、 Pgpool-II和Postgres-XL对比



pgpool与pgxl对比表


3、 Pgpool-II和Postgres-XL的性能测试


我分别使用pgbench和benchmarksql测试了Pgpool-II集群和Postgres-XL集群的性能,为了对比,还测试单机PG的性能。

测试条件:Pgpool-II集群是搭建在两台虚机上的主从复制(异步)集群;Postgres-XL集群也是搭建在相同条件上的两台虚机的集群,其中包含两个Coordinator节点和两个Datanode节点。单机PG也是运行在相同条件的虚机上。操作系统是CentOS 6.6,单机PG和Pgpool-II集群种的PG版本号是9.5,Postgres-XL的版本号是Postgres-XL 9.5 R1.3,也只基于PG 9.5的。


3.1、pgbench测试


pgbench是PG自带的一款简单的PG性能测试工具,测试指标是TPS,表示每秒钟完成的事务数。测试过程如下:

1) 建库

psql -h 10.192.33.244 -p7777 -c "create database pgbench"

2) 生成数据

pgbench -i -s 1000 -h 10.192.33.244 -p 7777 pgbench 
#参数-s指定数据量,这里使用1000,最终生成的数据量大小约16G。

3) 测试

pgbench -h 10.192.33.244 -p7777  -c30 -T300 -n 
#测试时间5分钟,连续测试3次。 

pgbench测试结果:


pgbench测试结果

pgbench的测试结果显示,Pgpool-II集群的性能比单机PG的性能差一些,约为84%;Postgres-XL集群的性能比单机PG的性能好一些,约为137%。


3.2、benchmarksql测试


benchmarksql的是一款常用的TPC-C测试工具,TPC-C测试衡量的是数据库的OLTP性能。测试过程如下:

1) 建库

psql -h 10.192.33.244 -p7777 -c "create database tpcc"

2) 生成数据

./runDatabaseBuild.sh props.pg
#props.pg为配置文件,配置数据库链接信息以及测试数据量、测试时间等,
#这里配置的数据量是100 warehouse,最终生成的数据约10G,测试时间1小时。

3) 测试

./runBenchmark.sh props.pg

benchmarksql测试结果:


benchmarksql测试结果

benchmarksql测试结果显示,两种集群与单机PG的性能指标几乎一致,无法分辨高下。出现这种结果的可能原因之一是:测试数据量较小,无法发挥集群的性能优势,尤其像Postgres-XL这个集群在设计上针对大数据处理做了一些优化,应该更加适合大数据处理的场景。鉴于benchmarksql测试生成数据十分耗时,这里就不再进行较大数据量的测试了。

最后,综合来看,我更倾向于Postgres-XL,如果公司今后打算用的话,我会推介。