用Pgpool-II实现Postgresql高可用集群
其实整个安装和配置过程比较简单,官方网站有比较好的文档,在此只是根据前几天的实际部署整理一下。(实际执行的命令都用红色标出)
服务器: 10.18.27.181pgpool服务器--------此服务器上需要安装pgpool和pg 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-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 >>>>>>>>>>>>>>>>>>>>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.配置pgpoolII(10.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_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 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”数据库中安装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,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 Replication与pgpool-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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |