最近研究了PG的两种集群方案,分别是Pgpool-II和Postgres-XL,在这里总结一下两者的机制、结构、优劣、测试结果等。node
一、 Pgpool-II和Postgres-XL简介
据我目前的了解,Pgpool-II和Postgres-XL是PG集群开源实现中比较成功的两个项目,互联网上相关的介绍也很多,但尚不肯定两者在企业生产环境中是否被普遍使用。其中Pgpool-II的前身的Pgpool-I,Postgres-XL的前身是Postgres-XC。
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中比较经常使用的模式是流复制主从模式,其结构以下图(也能够一主多从)。sql
既然PG能够经过自身的流复制机制方便的搭建主从结构集群,为何还要在它上面搭建Pgpool-II呢?由于简单的主从结构集群并不能提供链接池、负载均衡、自动故障切换等功能,Pgpool-II正好能够作到这些,固然负载均衡只针对读操做,写操做只发生在主节点上。为了不单点故障,Pgpool-II自身也能够配置为主从结构,对外提供虚拟IP地址,当主节点故障后,从节点提高为新的主节点并接管虚拟IP。
1.二、Postgres-XL
Postgres-XL的机制和Pgpool-II大不相同,它不是独立于PG的,是在PG源代码的基础上增长新功能实现的。简单来讲,Postgres-XL将PG的SQL解析层的工做和数据存取层的工做分离到不一样的两种节点上,分别称为Coordinator节点和Datanode节点,并且每种节点能够配置多个,共同协调完成本来单个PG实例完成的工做。此外,为了保证分布模式下事务可以正确执行,增长了一个GTM节点。为了不单点故障,能够为全部节点配置对应的slave节点。Postgres-XL结构图见下图,来自官网。数据库
Postgres-XL的Coordinator节点是整个集群的数据访问入口,能够配置多个,而后在它们之上经过Nginx等工具实现负载均衡。Coordinator节点维护着数据的存储信息,但不存储数据自己。接收到一条SQL语句后,Coordinator解析SQL,制定执行计划,而后分发任务到相关的Datanode上,Datanode返回执行结果到Coordinator,Coordinator整合各个Datanode返回的结果,最后返回给客户端。
Postgres-XL的Datanode节点负责实际存取数据,数据在多个Datanode上的分布有两种方式:复制模式和分片模式,复制模式下,一个表的数据在指定的节点上存在多个副本;分片模式下,一个表的数据按照指定的规则分布在多个数据节点上,这些节点共同保存一份完整的数据。这两种模式的选择是在建立表的时候执行CREATE TABLE语句指定的,也能够经过ALTER TABLE语句改变数据的分布方式。 负载均衡
二、 Pgpool-II和Postgres-XL对比异步
三、 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.一、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的测试结果显示,Pgpool-II集群的性能比单机PG的性能差一些,约为84%;Postgres-XL集群的性能比单机PG的性能好一些,约为137%。
3.二、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测试结果显示,两种集群与单机PG的性能指标几乎一致,没法分辨高下。出现这种结果的可能缘由之一是:测试数据量较小,没法发挥集群的性能优点,尤为像Postgres-XL这个集群在设计上针对大数据处理作了一些优化,应该更加适合大数据处理的场景。鉴于benchmarksql测试生成数据十分耗时,这里就再也不进行较大数据量的测试了。
最后,综合来看,我更倾向于Postgres-XL,若是公司从此打算用的话,我会推介。