用Pgpool-II实现Postgresql高可用集群

前端之家收集整理的这篇文章主要介绍了用Pgpool-II实现Postgresql高可用集群前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

其实整个安装和配置过程比较简单,官方网站有比较好的文档,在此只是根据前几天的实际部署整理一下。(实际执行的命令都用红色标出)

服务器:

10.18.27.181pgpool服务器--------此服务器上需要安装pgpoolpg

10.18.27.183data node 1--------此服务器上安装pg

10.18.27.184data node 2--------此服务器上安装pg

10.18.27.185data node 3--------此服务器上安装pg

10.18.27.186data node 4--------此服务器上安装pg

10.18.27.193data node 1 Slave --------此服务器上安装pg

10.18.27.194data node 2 Slave --------此服务器上安装pg

10.18.27.195data node 3 Slave --------此服务器上安装pg

10.18.27.196data node 4 Slave --------此服务器上安装pg

>>>>>>>>>>>>>>>>>>>>1.安装Pgpool-II10.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

>>>>>>>>>>>>>>>>>>>>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"

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

# If external_pid_file is not explicitly set,no extra PID file is written.

#external_pid_file = '(none)'# write an extra PID file

log_line_prefix = '%m %r %e %c'

log_lock_waits = on

log_statement = 'all'

listen_addresses = '*'

/etc/init.d/postgresd start

>>>>>>>>>>>>>>>>>>>>3.配置pgpoolII10.18.27.181<<<<<<<<<<<<<<<<<<<<<<

1)基本配置

首先,配置数据节点信息

vi /usr/local/etc/pgpool.conf

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_modetrue。仅仅设置paralle_modetrue不会自动启动并行查询pgpool-II需要系统数据库和用于分发数据到数据库节点的规则。而且,系统数据库使用的dblink需要连接到pgpool-II

我们将设置parallel_modeload_balance_modetrue

注意:你可以同时拥有分区表和复制表。但是一个表不能同时被分区和复制。因为分区表和复制表的结构不同。

这里我多说一句,开始我并不理解这是什么意思,虽着一步一步的配置,我才搞明白。其实就是说,在并行查询模式下,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

system_db_dbname = 'pgpool'

system_db_schema = 'pgpool_catalog'

system_db_user = 'pgpool'

system_db_password = ''

======================================================================

现在,我们必须建立一个叫做“pgpool”用户,并建立一个属主为“pgpool”的名为“pgpool”数据库

$ createuser -p 5432 pgpool

$ createdb -p 5432 -O pgpool pgpool

我们必须在“pgpool”数据库中安装dblinkdblink是包含在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_paoloFUNCTION

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,table_name)

);

假设创建表

create table cdtbl0000(codevalue integer,codename varchar(20));

那么在pgpool_catalog.replicate_def添加如下记录:

into pgpool_catalog.replicate_def values('testdb','cdtbl0000',ARRAY['codevalue','codename'],'varchar(20)']);

以上关于Pgpool-II实现Postgresql数据发布式存储的配置。这样就算是完成了,要是我们还想知道什么具体他的运行情况,就得自己搭建好环境后,把自己的疑问都在这套系统里试验一遍,就基本都明白了。

>>>>>>>>>>>>>>>>> 4.配置各数据节点的Streaming Replication<<<<<<<<<<<<<<<<<

这个配置其实就是pg 9以上版本的普通配置,网上有一些文章是介绍这个的。

各数据节点的Streaming Replicationpgpool-II的数据分区没有什么实质关系,我这样配置只是应客户的要求,用来实现单个节点故障的情况下,可以切换到这个数据节点对应的slave上,以保证集群系统正常运行。

我以前写过关于Streaming Replication配置的文章,照做就可以配置成功。

http://wenku.baidu.com/view/f422ee3443323968011c92df.html

http://blog.chinaunix.net/uid-20368611-id-3048109.html

用户手册

http://pgpool.projects.pgfoundry.org/pgpool-II/doc/pgpool-zh_cn.html

猜你在找的Postgre SQL相关文章