postgres-xl是个好东西?为什么呢?
postgres-xl基于postgresql数据库, postgres可以吊打很多数据库.
- 它可以搞oltp, 抗衡mysql, mysql没有分析函数功能
- 它可以搞oltp, 抗衡oracle, oracle生态弱, 没法实时
- 它对json支持好, 抗衡mongodb, mongodb用得人越来越少了。。。
- 它还恐怖地支持各种语言扩展, java, javascript, r, python, haskell。。。
- 并且开源免费,简单强大的没朋友。。。
postgres-xl是postgresql MPP集群版, 继续吊打大数据数据库...
- 它比greenpulm版本新: 它跟greenpulm本是一家人,都是MPP架构的postgresql集群
但是原生改造, 版本基本上与postgresql一致, greenpulm的版本升不动啊。。。 - 它比oracle RAC/Teradata便宜,免费使用
- 它比hadoop省资源,没有GC,基于C语言资源利用率高,并且生态圈丰富,可视化方便
- 它出道早,版本稳定性强。
既然这么优秀,那么我们简单介绍一下。。。
postgres-xl分为以下组件:
a. gtm 负责全局事务
b. coordinator 处理分发执行
c. datanode 负责底层处理
datanode跟coordinator都 连接到gtm,
客户端连接到coordinator运行sql,
coordinator使用gtm进行一些事务功能分发给datanode执行
大致如此,了解得不深入,后续会深入学习,再做补充
一切就绪,现在我们开始正题,一键搭建postgres-xl集群。
项目源码:https://github.com/clojurians-org/my-env
部署脚本: run.sh.d/postgres-xl-example/{createvm.sh, package.sh, deploy.sh, start.sh}
- 创建虚拟机-createvm.sh
- 打包依赖-package.sh(打包依赖后即可离线拷贝部署)
- 部署集群-deploy.sh
- 启动集群-start.sh
- 测试集群
过程很简单,依次运行createvm.sh, package.sh, deploy.sh, start.sh即可
下面详细解解释一下发生了什么。
第0步, 创建虚拟机
[larluo@larluo-nixos:~/my-env]$ cat run.sh.d/postgres-xl-example/createvm.sh
set -e
my=$(cd -P -- "$(dirname -- "${BASH_SOURCE-$0}")" > /dev/null && pwd -P) && cd $my/../..
echo -e "\n==== bash nix.sh create-vm nixos-postgres-xl-001" && bash nix.sh create-vm nixos-postgres-xl-001
echo -e "\n==== bash nix.sh create-vm nixos-postgres-xl-002" && bash nix.sh create-vm nixos-postgres-xl-002
echo -e "\n==== bash nix.sh create-vm nixos-postgres-xl-003" && bash nix.sh create-vm nixos-postgres-xl-003
第1步,打包依赖
[larluo@larluo-nixos:~/my-env]$ cat run.sh.d/postgres-xl-example/package.sh
set -e
my=$(cd -P -- "$(dirname -- "${BASH_SOURCE-$0}")" > /dev/null && pwd -P) && cd $my/../..
echo -e "\n==== bash nix.sh build nix.postgres-xl-10.0" && bash nix.sh build nix.postgres-xl-10.0
echo -e "\n==== bash nix.sh export tgz.nix-2.0.4" && bash nix.sh export tgz.nix-2.0.4
echo -e "\n==== bash nix.sh export nix.rsync-3.1.3" && bash nix.sh export nix.rsync-3.1.3
echo -e "\n==== bash nix.sh export nix.gettext-0.19.8.1" && bash nix.sh export nix.gettext-0.19.8.1
rsync是可选的(避免脚本多次运行scp多次),
这里的gettext依赖是为了启动脚本中使用envsubst命令替换环境变量
这里由于nix官方还没有支持postgres-xl,并且postgres-xl对系统底层库有依赖,我们不想使用root权限安装污染系统,所以自己编写nix构建脚本自动打包依赖
[larluo@larluo-nixos:~/my-env]$ cat nix.conf/postgres-xl-10.0/default.nix
{ fetchgit, stdenv, readline, zlib, perl, bison, flex, ... }:
stdenv.mkDerivation rec {
name = "postgres-xl-${version}" ;
version = "10.0" ;
rev = "0e7174157b7762959089ab0dd508237679a301c8" ;
buildInputs = [ readline zlib perl bison flex ];
src = fetchgit {
url= "git://git.postgresql.org/git/postgres-xl.git" ;
rev = rev ;
sha256 = "0nv8s4wyswfikb6pbmj9mq6qr8j7vc1d9nhkr6jmnymfkx4rwjxk" ;
} ;
}
第2步,部署依赖
[larluo@larluo-nixos:~/my-env]$ cat run.sh.d/postgres-xl-example/deploy.sh
set -e
my=$(cd -P -- "$(dirname -- "${BASH_SOURCE-$0}")" > /dev/null && pwd -P) && cd $my/../..
echo -e "\n==== bash nix.sh create-user 192.168.56.101" && bash nix.sh create-user 192.168.56.101
echo -e "\n==== bash nix.sh create-user 192.168.56.102" && bash nix.sh create-user 192.168.56.102
echo -e "\n==== bash nix.sh create-user 192.168.56.103" && bash nix.sh create-user 192.168.56.103
echo -e "\n==== bash nix.sh install 192.168.56.101 tgz.nix-2.0.4" && bash nix.sh install 192.168.56.101 tgz.nix-2.0.4
echo -e "\n==== bash nix.sh install 192.168.56.102 tgz.nix-2.0.4" && bash nix.sh install 192.168.56.102 tgz.nix-2.0.4
echo -e "\n==== bash nix.sh install 192.168.56.103 tgz.nix-2.0.4" && bash nix.sh install 192.168.56.103 tgz.nix-2.0.4
echo -e "\n==== bash nix.sh install 192.168.56.101 nix.rsync-3.1.3" && bash nix.sh install 192.168.56.101 nix.rsync-3.1.3
echo -e "\n==== bash nix.sh install 192.168.56.102 nix.rsync-3.1.3" && bash nix.sh install 192.168.56.102 nix.rsync-3.1.3
echo -e "\n==== bash nix.sh install 192.168.56.103 nix.rsync-3.1.3" && bash nix.sh install 192.168.56.103 nix.rsync-3.1.3
echo -e "\n==== bash nix.sh install 192.168.56.101 nix.gettext-0.19.8.1" && bash nix.sh install 192.168.56.101 nix.gettext-0.19.8.1
echo -e "\n==== bash nix.sh install 192.168.56.102 nix.gettext-0.19.8.1" && bash nix.sh install 192.168.56.102 nix.gettext-0.19.8.1
echo -e "\n==== bash nix.sh install 192.168.56.103 nix.gettext-0.19.8.1" && bash nix.sh install 192.168.56.103 nix.gettext-0.19.8.1
echo -e "\n==== bash nix.sh install 192.168.56.101 nix.postgres-xl-10.0" && bash nix.sh install 192.168.56.101 nix.postgres-xl-10.0
echo -e "\n==== bash nix.sh install 192.168.56.102 nix.postgres-xl-10.0" && bash nix.sh install 192.168.56.102 nix.postgres-xl-10.0
echo -e "\n==== bash nix.sh install 192.168.56.103 nix.postgres-xl-10.0" && bash nix.sh install 192.168.56.103 nix.postgres-xl-10.0
首先创建用户,接着安装nix, 然后安装rsync跟gettext工具,最后部署postgres-xl
第3步: 启动集群
[larluo@larluo-nixos:~/my-env]$ cat run.sh.d/postgres-xl-example/start.sh
my=$(cd -P -- "$(dirname -- "${BASH_SOURCE-$0}")" > /dev/null && pwd -P) && cd $my/../..
echo -e "\n==== bash nix.sh start 192.168.56.101:6666 postgres-xl-10.0:gtm"
bash nix.sh start 192.168.56.101:6666 postgres-xl-10.0:gtm
export GTM="192.168.56.101:6666"
export DATANODES="192.168.56.101:15432,192.168.56.102:15432,192.168.56.103:15432"
export COORDINATORS="192.168.56.101:5432,192.168.56.102:5432,192.168.56.103:5432"
echo -e "\n==== bash nix.sh start 192.168.56.101:15432 postgres-xl-10.0:datanode --gtm ${GTM}"
bash nix.sh start 192.168.56.101:15432 postgres-xl-10.0:datanode --gtm ${GTM}
echo -e "\n==== bash nix.sh start 192.168.56.102:15432 postgres-xl-10.0:datanode --gtm ${GTM}"
bash nix.sh start 192.168.56.102:15432 postgres-xl-10.0:datanode --gtm ${GTM}
echo -e "\n==== bash nix.sh start 192.168.56.103:15432 postgres-xl-10.0:datanode --gtm ${GTM}"
bash nix.sh start 192.168.56.103:15432 postgres-xl-10.0:datanode --gtm ${GTM}
echo -e "\n==== bash nix.sh start 192.168.56.101:5432 postgres-xl-10.0:coordinator --gtm ${GTM}"
bash nix.sh start 192.168.56.101:5432 postgres-xl-10.0:coordinator --gtm ${GTM}
echo -e "\n==== bash nix.sh start 192.168.56.102:5432 postgres-xl-10.0:coordinator --gtm ${GTM}"
bash nix.sh start 192.168.56.102:5432 postgres-xl-10.0:coordinator --gtm ${GTM}
echo -e "\n==== bash nix.sh start 192.168.56.103:5432 postgres-xl-10.0:coordinator --gtm ${GTM}"
bash nix.sh start 192.168.56.103:5432 postgres-xl-10.0:coordinator --gtm ${GTM}
echo -e "\n==== sleep 10" && sleep 10
echo -e "\n==== bash nix.sh start 192.168.56.101:15432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}"
bash nix.sh start 192.168.56.101:15432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}
echo -e "\n==== bash nix.sh start 192.168.56.102:15432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}"
bash nix.sh start 192.168.56.102:15432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}
echo -e "\n==== bash nix.sh start 192.168.56.103:15432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}"
bash nix.sh start 192.168.56.103:15432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}
echo -e "\n==== bash nix.sh start 192.168.56.101:5432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}"
bash nix.sh start 192.168.56.101:5432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}
echo -e "\n==== bash nix.sh start 192.168.56.102:5432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}"
bash nix.sh start 192.168.56.102:5432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}
echo -e "\n==== bash nix.sh start 192.168.56.103:5432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}"
bash nix.sh start 192.168.56.103:5432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}
这里首先启动gtm,接着指定gtm参数启动datanode跟coordinator.
最后,对于每个datanode及coordinator与其它datanode及coordinator进行连接
第4步: 测试集群
postgres=# select * from pgxc_node;
node_name | node_type | node_port | node_host | nodeis_primary | nodeis_preferred | node_id
---------------------------------+-----------+-----------+----------------+----------------+------------------+-------------
coordinator_192_168_56_102_5432 | C | 5432 | 192.168.56.102 | f | f | -1979140469
coordinator_192_168_56_103_5432 | C | 5432 | 192.168.56.103 | f | f | 580660846
datanode_192_168_56_101_15432 | D | 15432 | 192.168.56.101 | f | f | 1317903039
datanode_192_168_56_102_15432 | D | 15432 | 192.168.56.102 | f | f | -102979159
datanode_192_168_56_103_15432 | D | 15432 | 192.168.56.103 | f | f | -556920164
coordinator_192_168_56_101_5432 | C | 5432 | 192.168.56.101 | f | f | -307067894
(6 rows)
postgres=# create table test1(id int,name text);
CREATE TABLE
postgres=# insert into test1(id,name) select generate_series(1,8),'测试';
INSERT 0 8
postgres=# SELECT xc_node_id, count(*) FROM test1 group by xc_node_id ;
xc_node_id | count
------------+-------
-556920164 | 3
-102979159 | 3
1317903039 | 2
(3 rows)