机器准备:
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
安装(三台虚机同时按下面步骤安装):
1、下载源码:官方下载,网盘下载。
2、解压源码
tar xvf postgres-xl-v9.2-src.tar.gz3、编译安装
./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 startnode2初始化:
[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 = 10node1节点配置(修改项):
[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 trustnode2节点配置(修改项):
[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:682node1节点:
[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 connectionsnode2节点:
[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 !> !> !> !>