文章目录

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 ~]# adduser pgxl
[root@anzhy ~]# su - pgxl
[pgxl@anzhy ~]$ exit
logout
[root@anzhy ~]# cp Downloads/postgres-xl-v9.2-src.tar.gz ~pgxl/
[root@anzhy ~]# su - pgxl
[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
port = 7777

接下来做协调器的配置,先做初始化,

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的集群搭建步骤做对比,主要差别有以下一些,

  1. 多几个依赖关系,需要用yum install jade docbook-style-dsssl解决;
  2. 配置数据节点的时候,也要配置pooler_port,虽然目前还不知道具体的用处;
  3. 注册节点的时候,需要加上create node group的步骤;
  4. 注册节点的时候,不仅要在协调节点上注册,也要在数据节点上注册;

以上是安装Postgres XL集群的要点,本文主要参考了以下一些文章123

文章目录

欢迎来到Valleylord的博客!

本博的文章尽量原创。