Chinaunix首页 | 论坛 | 博客
  • 博客访问: 280968
  • 博文数量: 29
  • 博客积分: 2200
  • 博客等级: 大尉
  • 技术积分: 305
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-29 00:05
文章分类

全部博文(29)

文章存档

2018年(1)

2014年(2)

2012年(4)

2011年(5)

2009年(5)

2008年(1)

2007年(3)

2006年(8)

我的朋友

分类: Mysql/postgreSQL

2012-03-29 15:51:59

Pgpool-II实现Postgresql数据发布式存储以及通过Streaming Replication实现数据节点的主从备份

 

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

 

服务器:

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

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

>>>>>>>>>>>>>>>>>>>>1.安装Pgpool-II10.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.配置pgpoolII10.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”数据库中安装 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, 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.配置pgpoolII10.18.27.181<<<<<<<<<<<<<<<<<<<<<<

 

 

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

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

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

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

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

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

 

 

 

Paolo

 

 

阅读(4767) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~