其实整个安装和配置过程比较简单,官方网站有比较好的文档,在此只是根据前几天的实际部署整理一下。(实际执行的命令都用红色标出)@H_502_2@
服务器:@H_502_2@
10.18.27@H_502_2@.181@H_502_2@pgpool@H_502_2@@H_502_2@服务器@H_502_2@--------@H_502_2@@H_502_2@此服务器上需要安装@H_502_2@pgpool@H_502_2@@H_502_2@和@H_502_2@pg@H_502_2@@H_502_2@
10.18.27@H_502_2@.183@H_502_2@data node 1@H_502_2@--------@H_502_2@@H_502_2@此服务器上安装@H_502_2@pg@H_502_2@@H_502_2@
10.18.27@H_502_2@.184@H_502_2@data node 2@H_502_2@--------@H_502_2@@H_502_2@此服务器上安装@H_502_2@pg@H_502_2@@H_502_2@
10.18.27@H_502_2@.185@H_502_2@data node 3@H_502_2@--------@H_502_2@@H_502_2@此服务器上安装@H_502_2@pg@H_502_2@@H_502_2@
10.18.27@H_502_2@.186@H_502_2@data node 4@H_502_2@--------@H_502_2@@H_502_2@此服务器上安装@H_502_2@pg@H_502_2@@H_502_2@
10.18.27@H_502_2@.193@H_502_2@data node 1 Slave --------@H_502_2@@H_502_2@此服务器上安装@H_502_2@pg@H_502_2@@H_502_2@
10.18.27@H_502_2@.194@H_502_2@data node 2 Slave --------@H_502_2@@H_502_2@此服务器上安装@H_502_2@pg@H_502_2@@H_502_2@
10.18.27@H_502_2@.195@H_502_2@data node 3 Slave --------@H_502_2@@H_502_2@此服务器上安装@H_502_2@pg@H_502_2@@H_502_2@
10.18.27@H_502_2@.196@H_502_2@data node 4 Slave --------@H_502_2@@H_502_2@此服务器上安装@H_502_2@pg@H_502_2@@H_502_2@
>>>>>>>>>>>>>>>>>>>>1.@H_502_2@@H_502_2@安装@H_502_2@Pgpool-II@H_502_2@@H_502_2@(@H_502_2@10.18.27@H_502_2@.181@H_502_2@@H_502_2@)@H_502_2@<<<<<<<<<<<<<<<<<<<<<<@H_502_2@@H_502_2@
安装@H_502_2@pgpool-II@H_502_2@@H_502_2@非常简单。在你解压源码@H_502_2@tar@H_502_2@@H_502_2@包的目录中,执行以下命令。@H_502_2@
$ ./configure@H_502_2@@H_502_2@
$ make install@H_502_2@@H_502_2@
cp /usr/local/etc/pgpool.conf.sample /usr/local/etc/pgpool.conf@H_502_2@@H_502_2@
pgpool-II@H_502_2@@H_502_2@默认只接受到@H_502_2@9999@H_502_2@@H_502_2@端口的本地连接。如果你希望从其他主机接受连接,请设置@H_502_2@listen_addresses@H_502_2@@H_502_2@为@H_502_2@'*'.@H_502_2@@H_502_2@
listen_addresses = 'localhost'@H_502_2@@H_502_2@
pgpool-II@H_502_2@@H_502_2@有一个用于管理功能的接口,用于通过网络获取数据库节点信息、关闭@H_502_2@pgpool-II@H_502_2@@H_502_2@等。此功能我们并没有使用。配置也比较单@H_502_2@,@H_502_2@@H_502_2@连接端口@H_502_2@9898@H_502_2@@H_502_2@
cp /usr/local/etc/pcp.conf.sample /usr/local/etc/pcp.conf@H_502_2@@H_502_2@
>>>>>>>>>>>>>>>>>>>>2.@H_502_2@@H_502_2@安装@H_502_2@PG@H_502_2@@H_502_2@(所有服务器)@H_502_2@<<<<<<<<<<<<<<<<<<<<<<@H_502_2@@H_502_2@
PG@H_502_2@@H_502_2@安装方法也很简单,同样可能每个人的安装方法稍有不同。我的安装方法如下@H_502_2@,@H_502_2@@H_502_2@在此只把命令粘贴上来,不多做解释了@H_502_2@
唯一的不同就是我把所有的配置文件都单独放在@H_502_2@/usr/local/pgsql/etc@H_502_2@@H_502_2@下了,我认为这样更方便管理(个人习惯而已)@H_502_2@
cd /root/postgresql-9.0.4@H_502_2@@H_502_2@
./configure --with-wal-segsize=32 --with-wal-blocksize=16@H_502_2@@H_502_2@
gmake install@H_502_2@@H_502_2@
adduser postgres@H_502_2@@H_502_2@
mkdir -p /usr/local/pgsql/data@H_502_2@@H_502_2@
mkdir -p /usr/local/pgsql/etc@H_502_2@@H_502_2@
mkdir -p /usr/local/pgsql/archivedir@H_502_2@@H_502_2@
chown postgres /usr/local/pgsql/data@H_502_2@@H_502_2@
chown postgres /usr/local/pgsql/etc@H_502_2@@H_502_2@
chown postgres /usr/local/pgsql/archivedir@H_502_2@@H_502_2@
su - postgres@H_502_2@@H_502_2@
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data -E utf8@H_502_2@@H_502_2@
mv /usr/local/pgsql/data/*.conf /usr/local/pgsql/etc@H_502_2@@H_502_2@
exit (su - root)@H_502_2@@H_502_2@
cp /root/postgresql-9.0.4/contrib/start-scripts/linux /etc/init.d/postgresd@H_502_2@@H_502_2@
vi /etc/init.d/postgresd@H_502_2@@H_502_2@@H_502_2@@H_502_2@修改如下部分@H_502_2@,@H_502_2@@H_502_2@用@H_502_2@-c config_file@H_502_2@@H_502_2@指定@H_502_2@postgresql.conf@H_502_2@@H_502_2@的位置@H_502_2@:@H_502_2@@H_502_2@
===============================================================@H_502_2@@H_502_2@
@H_502_2@start)@H_502_2@@H_502_2@
@H_502_2@echo -n "Starting Postgresql: "@H_502_2@@H_502_2@
@H_502_2@test x"$OOM_ADJ" != x && echo "$OOM_ADJ" > /proc/self/oom_adj@H_502_2@@H_502_2@
@H_502_2@su - $PGUSER -c "$DAEMON -D '$PGDATA'-c config_file=/usr/local/pgsql/etc/postgresql.conf@H_502_2@&" >>$PGLOG 2>&1@H_502_2@@H_502_2@
@H_502_2@echo "ok"@H_502_2@@H_502_2@
@H_502_2@restart)@H_502_2@@H_502_2@
@H_502_2@echo -n "Restarting Postgresql: "@H_502_2@@H_502_2@
@H_502_2@su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast -w"@H_502_2@@H_502_2@
@H_502_2@echo "ok"@H_502_2@@H_502_2@
chmod 755 /etc/init.d/postgresd@H_502_2@@H_502_2@
vi /usr/local/pgsql/etc/postgresql.conf@H_502_2@@H_502_2@@H_502_2@@H_502_2@修改如下部分@H_502_2@:@H_502_2@@H_502_2@
#------------------------------------------------------------------------------@H_502_2@@H_502_2@
# FILE LOCATIONS@H_502_2@@H_502_2@
# The default values of these variables are driven from the -D command-line@H_502_2@@H_502_2@
# option or PGDATA environment variable,represented here as ConfigDir.@H_502_2@@H_502_2@
#data_directory = 'ConfigDir'@H_502_2@# use data in another directory@H_502_2@@H_502_2@
@H_502_2@@H_502_2@# (change requires restart)@H_502_2@@H_502_2@
hba_file = '/usr/local/pgsql/etc/pg_hba.conf@H_502_2@'@H_502_2@# host-based authentication file@H_502_2@@H_502_2@
@H_502_2@# (change requires restart)@H_502_2@@H_502_2@
ident_file = '/usr/local/pgsql/etc/pg_ident.conf@H_502_2@' # ident configuration file@H_502_2@@H_502_2@
# If external_pid_file is not explicitly set,no extra PID file is written.@H_502_2@@H_502_2@
#external_pid_file = '(none)'@H_502_2@# write an extra PID file@H_502_2@@H_502_2@
log_line_prefix = '%m %r %e %c'@H_502_2@@H_502_2@
log_lock_waits = on@H_502_2@@H_502_2@
log_statement = 'all'@H_502_2@@H_502_2@
listen_addresses = '*'@H_502_2@@H_502_2@
/etc/init.d/postgresd start@H_502_2@@H_502_2@
>>>>>>>>>>>>>>>>>>>>3.@H_502_2@@H_502_2@配置@H_502_2@pgpoolII@H_502_2@@H_502_2@(@H_502_2@10.18.27@H_502_2@.181@H_502_2@@H_502_2@)@H_502_2@<<<<<<<<<<<<<<<<<<<<<<@H_502_2@@H_502_2@
(@H_502_2@1@H_502_2@@H_502_2@)基本配置@H_502_2@
首先,配置数据节点信息@H_502_2@
backend_hostname0 = '10.18.27.183'@H_502_2@@H_502_2@
backend_port0 = 5432@H_502_2@@H_502_2@
backend_weight0 = 1@H_502_2@@H_502_2@
backend_hostname1 = '10.18.27.184'@H_502_2@@H_502_2@
backend_port1 = 5432@H_502_2@@H_502_2@
backend_weight1 = 1@H_502_2@@H_502_2@
backend_hostname2 = '10.18.27.185'@H_502_2@@H_502_2@
backend_port2 = 5432@H_502_2@@H_502_2@
backend_weight2 = 1@H_502_2@@H_502_2@
backend_hostname3 = '10.18.27.186'@H_502_2@@H_502_2@
backend_port3 = 5432@H_502_2@@H_502_2@
backend_weight3 = 1@H_502_2@@H_502_2@
(2)@H_502_2@@H_502_2@配置并行查询以数据分布@H_502_2@@H_502_2@
要启用并行查询功能,请设置@H_502_2@@H_502_2@pgpool.conf@H_502_2@@H_502_2@@H_502_2@@H_502_2@文件中的@H_502_2@parallel_mode@H_502_2@@H_502_2@@H_502_2@@H_502_2@为@H_502_2@true@H_502_2@@H_502_2@。仅仅设置@H_502_2@@H_502_2@paralle_mode@H_502_2@@H_502_2@@H_502_2@@H_502_2@为@H_502_2@true@H_502_2@@H_502_2@不会自动启动并行查询。@H_502_2@pgpool-II@H_502_2@@H_502_2@需要系统数据库和用于分发数据到数据库节点的规则。而且,系统数据库使用的@H_502_2@@H_502_2@dblink@H_502_2@@H_502_2@需要连接到@H_502_2@pgpool-II@H_502_2@@H_502_2@。@H_502_2@@H_502_2@
我们将设置@H_502_2@@H_502_2@@H_502_2@parallel_mode@H_502_2@@H_502_2@@H_502_2@@H_502_2@和@H_502_2@@H_502_2@@H_502_2@load_balance_mode@H_502_2@@H_502_2@@H_502_2@@H_502_2@为@H_502_2@true@H_502_2@@H_502_2@。@H_502_2@@H_502_2@
注意:你可以同时拥有分区表和复制表。但是一个表不能同时被分区和复制。因为分区表和复制表的结构不同。@H_502_2@@H_502_2@
这里我多说一句,开始我并不理解这是什么意思,虽着一步一步的配置,我才搞明白。其实就是说,在并行查询模式下,@H_502_2@DB@H_502_2@@H_502_2@里的表要么是采用分区形式存储在各个节点,要么是复制的形式存储在各个节点。也就是说,如果表@H_502_2@table1@H_502_2@@H_502_2@数据量很大,那么我们定义分发规则,把表@H_502_2@table1@H_502_2@@H_502_2@的数据按照规则分成@H_502_2@4@H_502_2@@H_502_2@份,存储在@H_502_2@4@H_502_2@@H_502_2@个节点上;如果表@H_502_2@table2@H_502_2@@H_502_2@只有很少的数据,我们不想也不需要把数据分割,那么就配置成复制形式,这样的话表@H_502_2@table2@H_502_2@@H_502_2@是以完整的形式存储在@H_502_2@4@H_502_2@@H_502_2@个节点上,每个节点都是完整的数据哦!@H_502_2@@H_502_2@@H_502_2@但一个表如果分区了,就不能再复制了。@H_502_2@@H_502_2@
被配置成分区的表,每次@H_502_2@select * from table1@H_502_2@@H_502_2@查询时,是把这个@H_502_2@select@H_502_2@@H_502_2@语句分别在各个节点上执行,然后把数据结合起来返回给客户端;被配置成复制模式的表,在执行@H_502_2@select * from table2@H_502_2@@H_502_2@时,无论@H_502_2@replicate_select=on@H_502_2@@H_502_2@还是@H_502_2@replicate_select=off@H_502_2@@H_502_2@,他都会只返回一份正确的数据,并不是把所有数据节点上的数据合并返回给客户端,这就是两者的区别。不知道我说的明白否。大家以后配置成功以后,各种方式都试验一下就知道了,看看日志里的内容就全都明白了。(前面安装@H_502_2@pg@H_502_2@@H_502_2@的步骤里,我已经把日志配置成可以记录常规内容了)。@H_502_2@@H_502_2@
那么如果我就是要创建一个既不是分区配置,又不是复制配置的普通的表,会是什么样的结果呢?@H_502_2@@H_502_2@@H_502_2@根据我配置的环境,我测试了一下。这样的表仍然可创建成功,可以正常插入数据。@H_502_2@@H_502_2@
作成后在每个数据节点都有这个表,每个数据节点也都有一份完整的数据。但当其它正确配置的表和这个表连接时(比如在多表查询的时候),就会出现各种各样的情况了。根据@H_502_2@popool.conf@H_502_2@@H_502_2@里面其它一些参数配置的不同,会有不同的结果,有时还会报错。@H_502_2@@H_502_2@
所以一句话,此模式下,@H_502_2@一个表只能被复制或被分发。@H_502_2@@H_502_2@
不多说的,具体配置如下:@H_502_2@@H_502_2@
parallel_mode = true@H_502_2@@H_502_2@@H_502_2@
replication_mode = false@H_502_2@
load_balance_mode = true@H_502_2@
##@H_502_2@@H_502_2@配置系统数据库@H_502_2@@H_502_2@@H_502_2@
# - System DB info -@H_502_2@
@H_502_2@
system_db_hostname@H_502_2@= '10.18.27.181'@H_502_2@
@H_502_2@# (change requires restart)@H_502_2@
system_db_port = 5432@H_502_2@
system_db_dbname = 'pgpool'@H_502_2@
system_db_schema = 'pgpool_catalog'@H_502_2@
system_db_user = 'pgpool'@H_502_2@
system_db_password = ''@H_502_2@
======================================================================@H_502_2@@H_502_2@
@H_502_2@
现在,我们必须建立一个叫做@H_502_2@“pgpool”@H_502_2@@H_502_2@的用户,并建立一个属主为@H_502_2@“pgpool”@H_502_2@@H_502_2@的名为@H_502_2@“pgpool”@H_502_2@@H_502_2@的数据库。@H_502_2@@H_502_2@
$ createuser -p 5432 pgpool@H_502_2@
$ createdb -p 5432 -O pgpool pgpool@H_502_2@
我们必须在@H_502_2@“pgpool”@H_502_2@@H_502_2@数据库中安装@H_502_2@dblink@H_502_2@@H_502_2@。@H_502_2@dblink@H_502_2@@H_502_2@是包含在@H_502_2@Postgresql@H_502_2@@H_502_2@源码包@H_502_2@@H_502_2@@H_502_2@contrib@H_502_2@@H_502_2@@H_502_2@@H_502_2@目录中包含的一个工具。@H_502_2@@H_502_2@
cd postgresql-9.0.4/contrib/dblink@H_502_2@@H_502_2@
make install@H_502_2@@H_502_2@
su – postgres@H_502_2@@H_502_2@
psql -f /usr/local/pgsql/share/contrib/dblink.sql pgpool@H_502_2@@H_502_2@
定义@H_502_2@dist_def@H_502_2@@H_502_2@表@H_502_2@(@H_502_2@@H_502_2@也就是定义表分区规则@H_502_2@)@H_502_2@@H_502_2@
在数据库@H_502_2@“pgpool”@H_502_2@@H_502_2@中定义一个@H_502_2@“dist_def”@H_502_2@@H_502_2@表,用于保存分区规则。在@H_502_2@pgpool-II@H_502_2@@H_502_2@安装后,你会得到一个@H_502_2@@H_502_2@@H_502_2@system_db.sql@H_502_2@,它是一个可用于生成系统数据库的@H_502_2@@H_502_2@@H_502_2@@H_502_2@psql@H_502_2@@H_502_2@@H_502_2@@H_502_2@脚本。@H_502_2@dist_def@H_502_2@@H_502_2@表被建立到@H_502_2@pgpool_catalog@H_502_2@@H_502_2@这个@H_502_2@schema@H_502_2@@H_502_2@中。@H_502_2@@H_502_2@
psql -f /usr/local/share/system_db.sql -p 5432 -U pgpool pgpool@H_502_2@@H_502_2@
“dist_def@H_502_2@@H_502_2@的定义如下,且表名不能被改变。@H_502_2@@H_502_2@
CREATE TABLE pgpool_catalog.dist_def (@H_502_2@@H_502_2@
@H_502_2@dbname text,-- database name@H_502_2@@H_502_2@
@H_502_2@schema_name text,-- schema name@H_502_2@@H_502_2@
@H_502_2@table_name text,-- table name@H_502_2@@H_502_2@
@H_502_2@col_name text NOT NULL CHECK (col_name = ANY (col_list)),-- distribution key-column@H_502_2@@H_502_2@
@H_502_2@col_list text[] NOT NULL,-- list of column names@H_502_2@@H_502_2@
@H_502_2@type_list text[] NOT NULL,-- list of column types@H_502_2@@H_502_2@
@H_502_2@dist_def_func text NOT NULL,-- distribution function name@H_502_2@@H_502_2@
@H_502_2@PRIMARY KEY (dbname,schema_name,table_name)@H_502_2@@H_502_2@
现在我有一个表,需要进行数据分发@H_502_2@
create table paolo(id1 integer,id2 integer);@H_502_2@@H_502_2@
那么我们先要在@H_502_2@pgpool_catalog.dist_def@H_502_2@@H_502_2@表里插入如下的记录。@H_502_2@pgpool@H_502_2@@H_502_2@数据库执行如下@H_502_2@sql@H_502_2@@H_502_2@:@H_502_2@
insert into pgpool_catalog.dist_def values('testdb','public','paolo','id1',ARRAY['id1','id2'],ARRAY['integer','integer'],'pgpool_catalog.dist_def_paolo');@H_502_2@@H_502_2@
紧接着创建上面@H_502_2@sql@H_502_2@@H_502_2@里指定的名称为@H_502_2@pgpool_catalog.dist_def_paolo@H_502_2@@H_502_2@的@H_502_2@FUNCTION@H_502_2@@H_502_2@:@H_502_2@@H_502_2@
CREATE OR REPLACE FUNCTION pgpool_catalog.dist_def_paolo(anyelement)@H_502_2@@H_502_2@
RETURNS integer AS $$@H_502_2@@H_502_2@
@H_502_2@SELECT CASE WHEN $1 > 0 AND $1 <= 10 THEN 0@H_502_2@@H_502_2@
@H_502_2@WHEN $1 > 10 AND $1 <= 20 THEN 1@H_502_2@@H_502_2@
@H_502_2@WHEN $1 > 20 AND $1 <= 30 THEN 2@H_502_2@@H_502_2@
@H_502_2@ELSE 3@H_502_2@@H_502_2@
@H_502_2@END;@H_502_2@@H_502_2@
$$ LANGUAGE sql;@H_502_2@@H_502_2@
这样就可以了。@H_502_2@
此时我如果插入几条数据,就会按照@H_502_2@FUNCTION@H_502_2@@H_502_2@里定义的规则把数据分发到@H_502_2@0-3@H_502_2@@H_502_2@这四个数据节点里。我们可以到每个数据节点连接@H_502_2@DB@H_502_2@@H_502_2@,并进行查询以检验数据分发是否生效。@H_502_2@@H_502_2@
接下来,我们在前面重点说过,@H_502_2@一个表只能被复制或被分发。那么我们来配置需要复制的表。@H_502_2@@H_502_2@
pgpool_catalog.replicate_def@H_502_2@表是同@H_502_2@pgpool_catalog.dist_def@H_502_2@@H_502_2@一起创建的。我们只需要在这个表里插入要被复制的表的信息就可以了,这个比较简单。@H_502_2@@H_502_2@
CREATE TABLE pgpool_catalog.replicate_def (@H_502_2@
@H_502_2@dbname text,-- database name@H_502_2@
@H_502_2@schema_name text,-- schema name@H_502_2@
@H_502_2@table_name text,-- table name@H_502_2@
@H_502_2@col_list text[] NOT NULL,-- list of column names@H_502_2@
@H_502_2@type_list text[] NOT NULL,-- list of column types@H_502_2@
@H_502_2@PRIMARY KEY (dbname,table_name)@H_502_2@
);@H_502_2@
@H_502_2@
create table cdtbl0000(codevalue integer,@H_502_2@@H_502_2@@H_502_2@codename varchar(20));@H_502_2@
@H_502_2@
那么在@H_502_2@pgpool_catalog.replicate_def@H_502_2@添加如下记录:@H_502_2@@H_502_2@
into pgpool_catalog.replicate_def values('testdb','cdtbl0000',ARRAY['codevalue','codename'],'varchar(20)']);@H_502_2@
以上关于@H_502_2@用@H_502_2@Pgpool-II@H_502_2@@H_502_2@实现@H_502_2@Postgresql@H_502_2@@H_502_2@数据发布式存储的配置。这样就算是完成了,要是我们还想知道什么具体他的运行情况,就得自己搭建好环境后,把自己的疑问都在这套系统里试验一遍,就基本都明白了。@H_502_2@@H_502_2@
>>>>>>>>>>>>>>>>> 4.@H_502_2@@H_502_2@配置各数据节点的@H_502_2@Streaming Replication<<<<<<<<<<<<<<<<<@H_502_2@@H_502_2@
这个配置其实就是pg 9@H_502_2@以上版本的普通配置,网上有一些文章是介绍这个的。@H_502_2@@H_502_2@
各数据节点的@H_502_2@Streaming Replication@H_502_2@@H_502_2@与@H_502_2@pgpool-II@H_502_2@@H_502_2@的数据分区没有什么实质关系,我这样配置只是应客户的要求,用来实现单个节点故障的情况下,可以切换到这个数据节点对应的@H_502_2@slave@H_502_2@@H_502_2@上,以保证集群系统正常运行。@H_502_2@
我以前写过关于@H_502_2@Streaming Replication@H_502_2@@H_502_2@配置的文章,照做就可以配置成功。@H_502_2@
http://wenku.baidu.com/view/f422ee3443323968011c92df.html@H_502_2@
http://blog.chinaunix.net/uid-20368611-id-3048109.html@H_502_2@
用户手册@H_502_2@
@H_502_2@@H_502_2@
http://pgpool.projects.pgfoundry.org/pgpool-II/doc/pgpool-zh_cn.html @H_502_2@@H_502_2@