机器准备:
3台虚拟机信息: gtm:a. 版本信息:Linux localhost.localdomain 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux b. IP:192.168.100.199
node1:a. 版本信息:Linux localhost.localdomain 2.6.18-194.el5 #1 SMP Fri Apr 2 14:58:14 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux b. IP:192.168.100.201
node2:a. 版本信息:Linux localhost.localdomain 2.6.18-194.el5 #1 SMP Fri Apr 2 14:58:35 EDT 2010 i686 i686 i386 GNU/Linux b. IP:192.168.100.202
安装(三台虚机同时按下面步骤安装):
tar xvf postgres-xl-v9.2-src.tar.gz
3、编译安装
./configure --prefix=/opt/pgxl
make
make install
注:编译过程中出现的问题(centos5会出现此问题,6则不会):
'/usr/bin/perl' /bin/collateindex.pl -f -g -i 'bookindex' -o bookindex.sgml HTML.index
Can't open perl script "/bin/collateindex.pl": No such file or directory
make[4]: *** [bookindex.sgml] Error 2
make[4]: Leaving directory `/root/postgres-xl/doc-xc/src/sgml'
make[3]: *** [sql_help.h] Error 2
make[3]: Leaving directory `/root/postgres-xl/src/bin/psql'
make[2]: *** [all-psql-recurse] Error 2
make[2]: Leaving directory `/root/postgres-xl/src/bin'
make[1]: *** [all-bin-recurse] Error 2
make[1]: Leaving directory `/root/postgres-xl/src'
make: *** [all-src-recurse] Error 2
解决方法:
#yum install docbook-style-dsssl
#find / -name collateindex.pl
/usr/bin/collateindex.pl
#cp /usr/bin/collateindex.pl /bin/
节点部署:
新建用户(三台虚机依次操作,注意:一定要用相同的用户,否则会发生用户找不到的问题):
[root@localhost opt]# useradd pgxl
[root@localhost opt]# chown -R pgxl pgxl/
[root@localhost opt]# su pgxl
[pgxl@localhost pgxl]$ ls
bin data_gtm include lib share
[pgxl@localhost pgxl]$ cd bin/
[pgxl@localhost bin]$ ls
clusterdb createuser dropuser gtm_ctl initgtm pg_config pg_dump pg_resetxlog postmaster vacuumdb
createdb dropdb ecpg gtm_proxy makesgml pg_controldata pg_dumpall pg_restore psql
createlang droplang gtm initdb pg_basebackup pg_ctl pg_receivexlog postgres reindexdb
[pgxl@localhost bin]$
初始化:
gtm初始化:
[pgxl@localhost bin]$ ./initgtm -D /opt/pgxl/data_gtm/ -Z gtm
The files belonging to this GTM system will be owned by user "pgxl".
This user must also own the server process.
creating directory /opt/pgxl/data_gtm ... ok
creating configuration files ... ok
Success. You can now start the GTM server using:
./gtm -D /opt/pgxl/data_gtm
or
./gtm_ctl -Z gtm -D /opt/pgxl/data_gtm -l logfile start
[pgxl@localhost bin]$
node1初始化(initdb初始化过程和pg初始化过程一致,这里就不多赘述了):
[pgxl@localhost bin]$ ./initdb -D /opt/pgxl/data/coordinator1/ --nodename coordinator1
[pgxl@localhost bin]$ ./initdb -D /opt/pgxl/data/datanode1/ --nodename datanode1
[pgxl@localhost bin]$ ./initgtm -D /opt/pgxl/data/gtm_proxy1/ -Z gtm_proxy
The files belonging to this GTM system will be owned by user "pgxl".
This user must also own the server process.
creating directory /opt/pgxl/data/gtm_proxy1 ... ok
creating configuration files ... ok
Success. You can now start the GTM proxy server using:
./gtm_proxy -D /opt/pgxl/data/gtm_proxy1
or
./gtm_ctl -Z gtm_proxy -D /opt/pgxl/data/gtm_proxy1 -l logfile start
node2初始化:
[pgxl@localhost bin]$ ./initdb -D /opt/pgxl/data/coordinator2/ --nodename coordinator2
[pgxl@localhost bin]$ ./initdb -D /opt/pgxl/data/datanode2/ --nodename datanode2
[pgxl@localhost bin]$ ./initgtm -D /opt/pgxl/data/gtm_proxy2/ -Z gtm_proxy
The files belonging to this GTM system will be owned by user "pgxl".
This user must also own the server process.
creating directory /opt/pgxl/data/gtm_proxy2 ... ok
creating configuration files ... ok
Success. You can now start the GTM proxy server using:
./gtm_proxy -D /opt/pgxl/data/gtm_proxy2
or
./gtm_ctl -Z gtm_proxy -D /opt/pgxl/data/gtm_proxy2 -l logfile start
配置信息:
gtm节点配置(修改项):
[pgxl@localhost data_gtm]$ vi gtm.conf
nodename = 'gtm'
listen_addresses = '*'
keepalives_idle = 60
keepalives_interval = 10
keepalives_count = 10
node1节点配置(修改项):
[pgxl@localhost gtm_proxy1]$ vi gtm_proxy.conf
nodename = 'gtm_proxy1'
listen_addresses = '*'
port = 6661
gtm_host = '192.168.100.199'
gtm_port = 6666
keepalives_idle = 60
keepalives_interval = 10
keepalives_count = 10
[pgxl@localhost coordinator1]$ vi postgresql.conf
listen_addresses = '*'
#gtm_host = 'localhost'
gtm_port = 6661
pgxc_node_name = 'coordinator1' pooler_port = 6667
[pgxl@localhost coordinator1]$ vi pg_hba.conf
host all all 192.168.100.0/24 trust
[pgxl@localhost datanode1]$ vi postgresql.conf
listen_addresses = '*'
port = 15432
#gtm_host = 'localhost'
gtm_port = 6661
pgxc_node_name = 'datanode1'
pooler_port = 6668
[pgxl@localhost datanode1]$ vi pg_hba.conf
host all all 192.168.100.0/24 trust
node2节点配置(修改项):
[pgxl@localhost gtm_proxy2]$ vi gtm_proxy.conf
nodename = 'gtm_proxy2'
listen_addresses = '*'
port = 6662
gtm_host = '192.168.100.199'
gtm_port = 6666
keepalives_idle = 60
keepalives_interval = 10
keepalives_count = 10
[pgxl@localhost coordinator2]$ vi postgresql.conf
listen_addresses = '*'
#gtm_host = 'localhost'
gtm_port = 6662
pgxc_node_name = 'coordinator2'
pooler_port = 6667
[pgxl@localhost coordinator2]$ vi pg_hba.conf
host all all 192.168.100.0/24 trust
[pgxl@localhost datanode2]$ vi postgresql.conf
listen_addresses = '*'
port = 15432
#gtm_host = 'localhost'
gtm_port = 6662
pgxc_node_name = 'datanode2'
pooler_port = 6668
[pgxl@localhost datanode2]$ vi pg_hba.conf
host all all 192.168.100.0/24 trust
服务启动:
gtm节点:
[pgxl@localhost bin]$ export PGHOME=/opt/pgxl/
[pgxl@localhost bin]$ export PATH=$PGHOME/bin:$PATH
[pgxl@localhost bin]$ ./gtm_ctl start -Z gtm -D /opt/pgxl/data_gtm/
server starting
[pgxl@localhost bin]$ tail ../data_gtm/gtm.log
1:139738148718336:2015-06-09 14:23:08.247 CST -LOG: Starting GTM server at (*:6666) -- control file /opt/pgxl/data_gtm/gtm.control
LOCATION: main, main.c:601
1:139738148718336:2015-06-09 14:23:08.247 CST -LOG: Restoring last GXID to 10000
LOCATION: GTM_RestoreTxnInfo, gtm_txn.c:2673
1:139738148718336:2015-06-09 14:23:08.247 CST -LOG: Started to run as GTM-Active.
LOCATION: main, main.c:682
node1节点:
[pgxl@localhost bin]$ export PGHOME=/opt/pgxl/
[pgxl@localhost bin]$ export PATH=$PGHOME/bin:$PATH
[pgxl@localhost bin]$ ./gtm_ctl start -Z gtm_proxy -D ../data/gtm_proxy1/
server starting
[pgxl@localhost bin]$ tail ../data/gtm_proxy1/gtm_proxy.log
1:47078985160944:2015-06-08 23:27:22.567 PDT -LOG: Starting GTM proxy at (*:6661)
LOCATION: main, proxy_main.c:805
[pgxl@localhost bin]$ ./pg_ctl start -Z datanode -D ../data/datanode1/
[pgxl@localhost bin]$ LOG: database system was shut down at 2015-06-08 22:35:18 PDT
LOG: autovacuum launcher started
LOG: database system is ready to accept connections
[pgxl@localhost bin]$ ./pg_ctl start -Z coordinator -D ../data/coordinator1/
[pgxl@localhost bin]$ LOG: database system was shut down at 2015-06-08 22:34:46 PDT
LOG: autovacuum launcher started
LOG: database system is ready to accept connections
node2节点:
[pgxl@localhost bin]$ export PGHOME=/opt/pgxl/
[pgxl@localhost bin]$ export PATH=$PGHOME/bin:$PATH
[pgxl@localhost bin]$ ./gtm_ctl start -Z gtm_proxy -D ../data/gtm_proxy2/
server starting
[pgxl@localhost bin]$ tail ../data/gtm_proxy2/gtm_proxy.log
1:47078985160944:2015-06-08 23:27:22.567 PDT -LOG: Starting GTM proxy at (*:6662)
LOCATION: main, proxy_main.c:805
[pgxl@localhost bin]$ ./pg_ctl start -Z datanode -D ../data/datanode2/
[pgxl@localhost bin]$ LOG: database system was shut down at 2015-06-08 22:35:18 PDT
LOG: autovacuum launcher started
LOG: database system is ready to accept connections
[pgxl@localhost bin]$ ./pg_ctl start -Z coordinator -D ../data/coordinator2/
[pgxl@localhost bin]$ LOG: database system was shut down at 2015-06-08 22:34:46 PDT
LOG: autovacuum launcher started
LOG: database system is ready to accept connections
注册:
node1:
协调节点:
[pgxl@localhost bin]$ ./psql -p 5432 -d postgres
psql (PGXL 9.2.0, based on PG 9.2.4 (Postgres-XL 9.2.0))
Type "help" for help.
postgres=# CREATE NODE coordinator2 WITH (TYPE='coordinator',HOST='192.168.100.202',PORT=5432);
CREATE NODE
postgres=# CREATE NODE datanode1 WITH (TYPE='datanode',HOST='192.168.100.201',PORT=15432);
CREATE NODE
postgres=# CREATE NODE datanode2 WITH (TYPE='datanode',HOST='192.168.100.202',PORT=15432);
CREATE NODE
postgres=# select * from pgxc_node;
node_name | node_type | node_port | node_host | nodeis_primary | nodeis_preferred | node_id
--------------+-----------+-----------+-----------------+----------------+------------------+-------------
coordinator1 | C | 5432 | localhost | f | f | 1938253334
coordinator2 | C | 5432 | 192.168.100.202 | f | f | -2089598990
datanode1 | D | 15432 | 192.168.100.201 | f | f | 888802358
datanode2 | D | 15432 | 192.168.100.202 | f | f | -905831925
select pgxc_pool_reload();
pgxc_pool_reload
------------------
t
(1 row)
[pgxl@localhost bin]$
数据节点:
[pgxl@localhost bin]$ ./psql -p 15432 -d postgres
psql (PGXL 9.2.0, based on PG 9.2.4 (Postgres-XL 9.2.0))
Type "help" for help.
postgres=# CREATE NODE coordinator1 WITH (TYPE='coordinator',HOST='192.168.100.201',PORT=5432);
CREATE NODE
postgres=# CREATE NODE coordinator2 WITH (TYPE='coordinator',HOST='192.168.100.202',PORT=5432);
CREATE NODE
postgres=# ALTER NODE datanode1 WITH (TYPE='datanode',HOST='localhost',PORT=15432);
ALTER NODE
postgres=# CREATE NODE datanode2 WITH (TYPE='datanode',HOST='192.168.100.202',PORT=15432);
CREATE NODE
postgres=# select * from pgxc_node;
node_name | node_type | node_port | node_host | nodeis_primary | nodeis_preferred | node_id
--------------+-----------+-----------+-----------------+----------------+------------------+-------------
coordinator1 | C | 5432 | 192.168.100.201 | f | f | 1938253334
coordinator2 | C | 5432 | 192.168.100.202 | f | f | -2089598990
datanode1 | D | 15432 | localhost | f | f | 888802358
datanode2 | D | 15432 | 192.168.100.202 | f | f | -905831925
(4 rows)
select pgxc_pool_reload();
pgxc_pool_reload
------------------
t
(1 row)
[pgxl@localhost bin]$
node2:
协调节点:
[pgxl@localhost bin]$ ./psql -p 5432 -d postgres
psql (PGXL 9.2.0, based on PG 9.2.4 (Postgres-XL 9.2.0))
Type "help" for help.
postgres=# CREATE NODE coordinator1 WITH (TYPE='coordinator',HOST='192.168.100.201',PORT=5432);
CREATE NODE
postgres=# CREATE NODE datanode1 WITH (TYPE='datanode',HOST='192.168.100.201',PORT=15432);
CREATE NODE
postgres=# CREATE NODE datanode2 WITH (TYPE='datanode',HOST='192.168.100.202',PORT=15432);
CREATE NODE
postgres=# select * from pgxc_node;
node_name | node_type | node_port | node_host | nodeis_primary | nodeis_preferred | node_id
--------------+-----------+-----------+-----------------+----------------+------------------+-------------
coordinator2 | C | 5432 | localhost | f | f | -2089598990
coordinator1 | C | 5432 | 192.168.100.201 | f | f | 1938253334
datanode1 | D | 15432 | 192.168.100.201 | f | f | 888802358
datanode2 | D | 15432 | 192.168.100.202 | f | f | -905831925
select pgxc_pool_reload();
pgxc_pool_reload
------------------
t
(1 row)
[pgxl@localhost bin]$
数据节点:
[pgxl@localhost bin]$ ./psql -p 15432 -d postgres
psql (PGXL 9.2.0, based on PG 9.2.4 (Postgres-XL 9.2.0))
Type "help" for help.
postgres=# CREATE NODE coordinator1 WITH (TYPE='coordinator',HOST='192.168.100.201',PORT=5432);
CREATE NODE
postgres=# CREATE NODE coordinator2 WITH (TYPE='coordinator',HOST='192.168.100.202',PORT=5432);
CREATE NODE
postgres=# ALTER NODE datanode2 WITH (TYPE='datanode',HOST='localhost',PORT=15432);
ALTER NODE
postgres=# CREATE NODE datanode1 WITH (TYPE='datanode',HOST='192.168.100.202',PORT=15432);
CREATE NODE
postgres=# select * from pgxc_node;
node_name | node_type | node_port | node_host | nodeis_primary | nodeis_preferred | node_id
--------------+-----------+-----------+-----------------+----------------+------------------+-------------
coordinator1 | C | 5432 | 192.168.100.201 | f | f | 1938253334
coordinator2 | C | 5432 | 192.168.100.202 | f | f | -2089598990
datanode2 | D | 15432 | localhost | f | f | -905831925
datanode1 | D | 15432 | 192.168.100.201 | f | f | 888802358
(4 rows)
select pgxc_pool_reload();
pgxc_pool_reload
------------------
t
(1 row)
[pgxl@localhost bin]$
搭建后效果:
node1:
postgres=# create table test(t1 int, t2 text);
LOG: Will fall back to local snapshot for XID = 16757, source = 0, gxmin = 0, autovac launch = 0, autovac = 0, normProcMode = 0, postEnv = 1
CREATE TABLE
postgres=# insert into test values (1,'a');
INSERT 0 1
postgres=# insert into test values (2,'b');
INSERT 0 1
postgres=# execute direct on (datanode1) $$ select * from test $$;
t1 | t2
----+----
1 | a
2 | b
(2 rows)
postgres=# select * from test ;
t1 | t2
----+----
1 | a
2 | b
(2 rows)
postgres=#
node2:
postgres=# select * from test ;
LOG: Will fall back to local snapshot for XID = 16789, source = 0, gxmin = 0, autovac launch = 0, autovac = 0, normProcMode = 0, postEnv = 1
t1 | t2
----+----
1 | a
2 | b
(2 rows)
postgres=# execute direct on (datanode2) $$ select * from test $$;
t1 | t2
----+----
(0 rows)
postgres=# insert into test values (3,'c');
INSERT 0 1
postgres=# execute direct on (datanode2) $$ select * from test $$;
t1 | t2
----+----
3 | c
(1 row)
postgres=# select * from test ;
t1 | t2
----+----
1 | a
2 | b
3 | c
(3 rows)
postgres=#
node1:
postgres=# select * from test ;
t1 | t2
----+----
1 | a
2 | b
3 | c
(3 rows)
postgres=# execute direct on (datanode1) $$ select * from test $$;
t1 | t2
----+----
1 | a
2 | b
(2 rows)
postgres=# execute direct on (datanode2) $$ select * from test $$;
t1 | t2
----+----
3 | c
(1 row)
postgres=#
发现bug(最新代码没有,官网发布的tar包有bug,通过git下载暂时没有问题):
postgres=# alter node datanode2 with(TYPE='datanode', HOST='localhost', PORT=15432);
The connection to the server was lost. Attempting reset: LOG: server process (PID 14999) was terminated by signal 11: Segmentation fault
DETAIL: Failed process was running: alter node datanode2 with(TYPE='datanode', HOST='localhost', PORT=15432);
LOG: terminating any other active server processes
WARNING: terminating connection because of crash of another server process
DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
HINT: In a moment you should be able to reconnect to the database and repeat your command.
FATAL: the database system is in recovery mode
Failed.
!> LOG: all server processes terminated; reinitializing
LOG: database system was interrupted; last known up at 2015-06-10 20:09:24 PDT
LOG: database system was not properly shut down; automatic recovery in progress
LOG: record with zero length at 0/18A6C40
LOG: redo is not required
LOG: autovacuum launcher started
LOG: database system is ready to accept connections
!>
!>
!>
!>