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