文章目录
Postgres XL(PGXL)和Postgres XC(pgxl)的架构很类似,安装步骤也很类似。
本文使用源码在单机上搭建PostgreSQL的最简单集群,1个GTM,协调节点和数据节点各2个。
先去下载PGXL的源码包,在官网上有最新版,本文使用的版本是postgres-xl-v9.2-src.tar.gz。建立独立的用户pgxl用于管理集群,并用新的账号解压源码包。
1 2 3 4 5 6 7 8 9 10 11
| [root@anzhy ~] [root@anzhy ~] [pgxl@anzhy ~]$ exit logout [root@anzhy ~] [root@anzhy ~] [pgxl@anzhy ~]$ ls postgres-xl-v9.2-src.tar.gz [pgxl@anzhy ~]$ tar xzf postgres-xl-v9.2-src.tar.gz [pgxl@anzhy ~]$ ls postgres-xl-v9.2-src.tar.gz postgres-xl
|
解压后的源码需要编译,编译的过程和Postgres XC类似,具体可以参考之前的文章。不同的是,Postgres XL有其他的依赖需要安装,如jade等,
1
| [root@anzhy ~]$ yum install jade docbook-style-dsssl
|
不然会编译报错,如果之前没有安装这些依赖,在安装之后需要重新做./configure
。以下只简单列一下编译的步骤,
1 2 3 4 5 6 7 8 9 10 11 12
| [pgxl@anzhy ~]$ mkdir pg-xl [pgxl@anzhy ~]$ mkdir data [pgxl@anzhy ~]$ pwd /home/pgxl [pgxl@anzhy ~]$ cd postgres-xl/ ...... [pgxl@anzhy ~]$ ./configure --prefix=$HOME/pg-xl ...... [pgxl@anzhy ~]$ make ...... [pgxl@anzhy ~]$ make install ......
|
一切正常的话,上述每个步骤都会提示成功,Postgres XL最终会安装在$HOME/pg-xl
目录下。下面在.bashrc中配置必要的环境变量,
1 2 3 4 5 6 7
| export PGHOME=/home/pgxl/pg-xl export PGPORT=25431 export PGDATA=$PGHOME/../data/db_1/data export LANG=en_US.utf8 export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH export PATH=$PGHOME/bin:$PATH:. export MANPATH=$PGHOME/share/man:$MANPATH
|
接下来就可以初始化数据库了,由于是要模拟双机,所以需要创建db_1和db_2两个数据节点。同样使用initdb命令,如下,
1 2
| [pgxl@anzhy ~]$ initdb -D $HOME/data/db_1/data --nodename db_1 [pgxl@anzhy ~]$ initdb -D $HOME/data/db_2/data --nodename db_2
|
修改两个数据节点的postgresql.conf中的参数,主要是GTM的选项,如下,
1 2 3 4 5
| listen_addresses = '*' port = 25431 # change to 25432 for db_2 gtm_host = '192.168.1.7' gtm_port = 7777 pooler_port = 35431 # change to 35432 for db_2
|
其中,port参数两个节点不能相同(分别为25431和25432),否则会出错,gtm的地址要写本机的ip地址,其实对于单机的情况写localhost也是可以的。然后修改pg_hba.conf的参数配置数据节点的连接和认证,在IPv4那一段加入以下配置,
1 2
| host all all 192.168.1.7/32 trust host all all 0.0.0.0/0 md5
|
配置完2个数据节点之后,然后去做GTM的初始化,
1
| [pgxl@anzhy ~]$ initgtm -Z gtm -D $HOME/data/gtm/data
|
然后配置GTM的参数,gtm.conf中需要做如下修改,
接下来做协调器的配置,先做初始化,
1 2
| [pgxl@anzhy data]$ initdb -D $HOME/data/coor_1/data --nodename coor_1 [pgxl@anzhy data]$ initdb -D $HOME/data/coor_2/data --nodename coor_2
|
从这个命令可以看出,其实协调器和数据节点是很相似的,他们的初始化命令是一样的。同样,也要配置协调器的参数,先是postgresql.conf中的参数,
1 2 3 4 5
| listen_addresses = '*' port = 2921 # change to 2922 for coor_2 gtm_host = '192.168.1.7' gtm_port = 7777 pooler_port = 7778 # change to 7779 for coor_2
|
pg_hba.conf的设置和数据节点一样,加入以下配置,
1 2
| host all all 192.168.1.7/32 trust host all all 0.0.0.0/0 md5
|
接下来就可以启动集群了,启动的顺序是,GTM->数据节点->协调器,先启动GTM,并查看状态。
1 2
| [pgxl@anzhy ~]$ gtm_ctl start -Z gtm -D $HOME/data/gtm/data/ [pgxl@anzhy ~]$ gtm_ctl status -Z gtm -D $HOME/data/gtm/data
|
也可以简单的直接运行GTM,如下,
1
| [pgxl@anzhy ~]$ gtm -D $HOME/data/gtm/data/
|
同样,数据节点的启动,也有两种方式,如下,
1 2
| [pgxl@anzhy ~]$ pg_ctl start -D $HOME/data/db_1/data -Z datanode [pgxl@anzhy ~]$ pg_ctl start -D $HOME/data/db_2/data -Z datanode
|
1 2
| [pgxl@anzhy ~]$ postgres -X -D $HOME/data/db_1/data [pgxl@anzhy ~]$ postgres -X -D $HOME/data/db_2/data
|
协调器的启动和数据节点是类似的,如下,
1 2
| [pgxl@anzhy ~]$ pg_ctl start -D $HOME/data/coor_1/data -Z coordinator [pgxl@anzhy ~]$ pg_ctl start -D $HOME/data/coor_2/data -Z coordinator
|
1 2
| [pgxl@anzhy ~]$ postgres -X -D $HOME/data/coor_1/data [pgxl@anzhy ~]$ postgres -X -D $HOME/data/coor_2/data
|
将上述启动步骤的前一种方法放在一个脚本中,这样就可以使用脚本启动,脚本如下,
1 2 3 4 5 6 7 8 9 10 11 12 13
| #!/bin/bash gtm_ctl -Z gtm -D $HOME/data/gtm/data/ start sleep 3s gtm_ctl -Z gtm -D $HOME/data/gtm/data status pg_ctl start -D $HOME/data/db_1/data -Z datanode pg_ctl start -D $HOME/data/db_2/data -Z datanode sleep 2s pg_ctl start -D $HOME/data/coor_1/data -Z coordinator pg_ctl start -D $HOME/data/coor_2/data -Z coordinator
|
关闭集群的顺序是相反的,协调器->数据节点->GTM,同样,将关闭的操作合也并成一个脚本,如下,
1 2 3 4 5 6 7 8 9
| #!/bin/bash pg_ctl stop -D $HOME/data/coor_2/data -Z coordinator pg_ctl stop -D $HOME/data/coor_1/data -Z coordinator pg_ctl stop -D $HOME/data/db_2/data -Z datanode pg_ctl stop -D $HOME/data/db_1/data -Z datanode gtm_ctl stop -Z gtm -D $HOME/data/gtm/data/
|
最后一步是注册各个节点,登陆协调者节点1和2,数据节点1和2,运行如下脚本,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| drop node coor_1; drop node coor_2; drop node db_1; drop node db_2; drop node group gp1; drop node group gp2; create node coor_1 with(TYPE='coordinator',HOST='192.168.1.7',PORT=2921); create node coor_2 with(TYPE='coordinator',HOST='192.168.1.7',PORT=2922); create node db_1 with(TYPE='datanode',HOST='192.168.1.7',PORT=25431,primary=false); create node db_2 with(TYPE='datanode',HOST='192.168.1.7',PORT=25432,primary=false); alter node coor_1 with(TYPE='coordinator',HOST='192.168.1.7',PORT=2921); alter node coor_2 with(TYPE='coordinator',HOST='192.168.1.7',PORT=2922); alter node db_1 with(TYPE='datanode',HOST='192.168.1.7',PORT=25431,primary=true); alter node db_2 with(TYPE='datanode',HOST='192.168.1.7',PORT=25432,primary=false); create node group gp1 with(db_1); create node group gp2 with(db_2); select pgxc_pool_reload(); select * from pgxc_node;
|
如果是第一次运行,drop相关的步骤也可以不运行,运行完之后,就可以看到多个节点正常的运行起来了。另外,可以将上述脚本保存成文件pgxl_register.sql
,并在之前的启动脚本之后加上注册步骤,每次启动的时候即可自动完成,如下
1 2 3 4 5 6
| sleep 2s psql -d postgres -p 2921 -f pgxl_register.sql psql -d postgres -p 2922 -f pgxl_register.sql psql -d postgres -p 25431 -f pgxl_register.sql psql -d postgres -p 25432 -f pgxl_register.sql
|
如果没有在数据节点上注册,会发生如下错误,
1 2 3 4 5 6 7 8 9 10 11 12
| postgres=# create database test; LOG: Will fall back to local snapshot for XID = 22474, source = 0, gxmin = 0, autovac launch = 0, autovac = 0, normProcMode = 0, postEnv = 1 ERROR: node "coor_1_31452" does not exist STATEMENT: SET global_session TO coor_1_31452; LOG: Will fall back to local snapshot for XID = 22475, source = 0, gxmin = 0, autovac launch = 0, autovac = 0, normProcMode = 0, postEnv = 1 ERROR: node "coor_1_31452" does not exist STATEMENT: SET global_session TO coor_1_31452; ERROR: node "coor_1_31452" does not exist STATEMENT: SET global_session TO coor_1_31452; ERROR: node "coor_1_31452" does not exist STATEMENT: SET global_session TO coor_1_31452; CREATE DATABASE
|
如果没有新建node group,则会发生如下的错误,
1 2 3 4 5 6 7 8 9 10
| postgres=# create database test; LOG: Will fall back to local snapshot for XID = 22677, source = 0, gxmin = 0, autovac launch = 0, autovac = 0, normProcMode = 0, postEnv = 1 LOG: Will fall back to local snapshot for XID = 22678, source = 0, gxmin = 0, autovac launch = 0, autovac = 0, normProcMode = 0, postEnv = 1 CREATE DATABASE postgres=# \c test; You are now connected to database "test" as user "pgxl". test=# create table test_table(id int); LOG: Will fall back to local snapshot for XID = 22681, source = 0, gxmin = 0, autovac launch = 0, autovac = 0, normProcMode = 0, postEnv = 1 LOG: Will fall back to local snapshot for XID = 22682, source = 0, gxmin = 0, autovac launch = 0, autovac = 0, normProcMode = 0, postEnv = 1 CREATE TABLE
|
下面做一些简单的建表测试,先登陆协调节点1,新增数据库,建表,并插入4笔数据,如下,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| [pgxl@anzhy ~]$ psql -d postgres -p 2922 psql (PGXL 9.2.0, based on PG 9.2.4 (Postgres-XL 9.2.0)) Type "help" for help. postgres=# create database test; CREATE DATABASE postgres=# \c test; You are now connected to database "test" as user "pgxl". test=# create table test_table(id int); CREATE TABLE test=# insert into test_table values(1); INSERT 0 1 test=# insert into test_table values(2); INSERT 0 1 test=# insert into test_table values(3); INSERT 0 1 test=# insert into test_table values(4); INSERT 0 1 test=# select * from test_table; id ---- 1 2 3 4 (4 rows)
|
然后登陆协调节点2,查询刚才新增的表中的数据,发现已经可以查到了,
分别登陆数据节点1和2,发现数据分散在这2个节点上,每个节点上2条数据,
至此,Postgres XL的集群搭建已经成功,可以与Postgres XC的集群搭建步骤做对比,主要差别有以下一些,
- 多几个依赖关系,需要用
yum install jade docbook-style-dsssl
解决;
- 配置数据节点的时候,也要配置
pooler_port
,虽然目前还不知道具体的用处;
- 注册节点的时候,需要加上
create node group
的步骤;
- 注册节点的时候,不仅要在协调节点上注册,也要在数据节点上注册;
以上是安装Postgres XL集群的要点,本文主要参考了以下一些文章,,。