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

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

服务器:

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://wenku.baidu.com/view/f422ee3443323968011c92df.html

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

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

用户手册

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

时间: 2024-11-07 22:00:45

用Pgpool-II实现Postgresql高可用集群的相关文章

postgresql高可用集群安装

一.hosts and topology structure of pg cluster 1.host infos cluster01_node01 192.168.0.108cluster01_node02 192.168.0.109cluster02_node03 192.168.0.110 2.topology structure sync async primary(cls01_node01) -------> standby01(cls01_node02) ------->stand

Linux高可用集群方案之heartbeat基础原理及逻辑架构

 这篇文章我们主要学习heartbeat高可用集群的基础原理及逻辑架构,以及heartbeat的简单配置  ll  本文导航    · heartbeat之基本原理   · heartbeat之集群组件   · heartbeat之心跳连接   · heartbeat之脑裂(资源争用.资源隔离) · heartbeat之配置文件   · heartbeat至高可用集群配置  ll  要求  掌握heartbeat高可用集群的相关组件及简单配置   heartbeat之基本原理  heartbea

CentOS 7 corosync高可用集群的实现

CentOS 7 corosync高可用集群的实现 =============================================================================== 概述: =============================================================================== 在CentOS 7上实现高可用集群案例  1.corosync安装配置 ★CentOS 7: corosync v2 (

高可用集群和负载均衡集群理解

高可用集群 HA(hight avaliable)即高可用,又被叫双机热备 防止服务器中断,影响对外提供服务 协议:Heartbeat使用心跳进行通信和选举 含义:一般是指当集群中的任意一个节点失效的情况下,节点上的所有任务自动转移到其他正常的节点上,并且此过程不影响整个集群的运行,不影响业务的提供. 负载均衡集群 LB(load balance)负载均衡集群 防止服务器发生瓶颈 协议:Keepalived使用VRRP协议进行通信和选举 用于用户请求量过大,服务器发生瓶颈,通过负载均衡,让用户可

linux 下heartbeat简单高可用集群搭建

Heartbeat 项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统.通过Heartbeat我们可以实现双机热备,以实现服务的持续性. linux下基于heartbeat的简单web服务的高可用集群搭建 首先规划好两台主机作为heartbeat的双机热备,命名为node1.lvni.cc(主) ;node2.lvni.cc, node1的eth0IP :192.168.157.148  Vip eth0:0:192.168.157.149 node2的eth0IP :19

CoroSync + Drbd + MySQL 实现MySQL的高可用集群

Corosync + DRBD + MySQL 构建高可用MySQL集群 节点规划: node1.huhu.com172.16.100.103 node2.huhu.com172.16.100.104 资源名称规划 资源名称:可以是除了空白字符外的任意ACSII码字符 DRBD设备:在双节点上,此DRBD设备文件,一般为/dev/drbdN,主设备号147 磁盘:在双方节点上,各自提供存储设备 网络配置:双方数据同步所使用的网络属性 DRBD从Linux内核2.6.33起已经整合进内核 1.配置

利用heartbeat的ldirectord实现ipvs的高可用集群构建

集群架构拓扑图: 网络规划: 两台LVS server:(两台LVS也可以为用户提供错误页面) node1:172.16.31.10 node2:172.16.31.11 VIP:172.16.31.180 ipvs规则内包含2台Real Server:(后面的RS指的就是后端的web服务器) rs1:172.16.31.13 rs2:172.16.31.14 我们还需要错误页面提供者:我们选择LVS作为sorry server,所有的real server不可用时就指向这个sorry serv

linux高可用集群(HA)原理详解

高可用集群 一.什么是高可用集群 高可用集群就是当某一个节点或服务器发生故障时,另一个节点能够自动且立即向外提供服务,即将有故障节点上的资源转移到另一个节点上去,这样另一个节点有了资源既可以向外提供服务.高可用集群是用于单个节点发生故障时,能够自动将资源.服务进行切换,这样可以保证服务一直在线.在这个过程中,对于客户端来说是透明的. 二.高可用集群的衡量标准 高可用集群一般是通过系统的可靠性(reliability)和系统的可维护性(maintainability)来衡量的.通常用平均无故障时间

MM(主主数据库)+keepalived主备高可用集群

博客分享的第一篇技术文章: 项目主要搭建:主主数据库高可用集群搭建. 数据库互为主备,应用技术:MM+keepalived 使用的是虚拟机搭建的实验向大家展示: 数据库1:192.168.4.7 数据库2:192.168.4.77 VIP:192.168.4.68 web1:192.168.4.69 web2:192.168.4.70 一.安装mysql,部署主主同步结构. 直接yum安装 配置主主同步: 由于主数据库192.168.4.7里面存放着数据,所以需要先导出数据,方法很多,我们采取m