pgpool-II 的使用
1.pgpool-II的概念
pgpool-II 是一个位于 PostgreSQL 服务器和 PostgreSQL 数据库客户端之间的中间件,它提供以下功能:
- 连接池
pgpool-II 保持已经连接到 PostgreSQL 服务器的连接, 并在使用相同参数(例如:用户名,数据库,协议版本) 连接进来时重用它们。 它减少了连接开销,并增加了系统的总体吞吐量。
- 复制
pgpool-II 可以管理多个 PostgreSQL 服务器。 激活复制功能并使在2台或者更多 PostgreSQL 节点中建立一个实时备份成为可能, 这样,如果其中一台节点失效,服务可以不被中断继续运行。
- 负载均衡
如果数据库进行了复制(可能运行在复制模式或者主备模式下), 则在任何一台服务器中执行一个 SELECT 查询将返回相同的结果。 pgpool-II 利用了复制的功能以降低每台 PostgreSQL 服务器的负载。 它通过分发 SELECT 查询到所有可用的服务器中,增强了系统的整体吞吐量。 在理想的情况下,读性能应该和 PostgreSQL 服务器的数量成正比。 负载均很功能在有大量用户同时执行很多只读查询的场景中工作的效果最好。
- 限制超过限度的连接
PostgreSQL 会限制当前的最大连接数,当到达这个数量时,新的连接将被拒绝。 增加这个最大连接数会增加资源消耗并且对系统的全局性能有一定的负面影响。 pgpoo-II 也支持限制最大连接数,但它的做法是将连接放入队列,而不是立即返回一个错误。
- 并行查询
使用并行查询时,数据可以被分割到多台服务器上, 所以一个查询可以在多台服务器上同时执行,以减少总体执行时间。 并行查询在查询大规模数据的时候非常有效。
pgpool-II 使用 PostgreSQL 的前后台程序之间的协议,并且在前后台之间传递消息。 因此,一个(前端的)数据库应用程序认为 pgpool-II 就是实际的 PostgreSQL 数据库, 而后端的服务进程则认为 pgpool-II 是它的一个客户端。 因为 pgpool-II 对于服务器和客户端来说是透明的, 现有的数据库应用程序基本上可以不需要修改就可以使用 pgpool-II 了。
摘抄于:http://www.pgpool.net/docs/pgpool-II-3.2.1/pgpool-zh_cn.html
2. pgpool-II的安装
pgpool-II 可以在 pgpool 开发页面下载到。 而且也提供包括 CentOS,RedHat Enterprise Linux,Fedora 和 Debian 在内的大量平台的二进制包。 请检查相关的软件库。可以在以下位置下载 pgpool-II 的源码:
下载地址:http://www.pgpool.net/mediawiki/index.php/Downloads
从源码安装 pgpool-II 需要 2.9 甚至或更高版本的 gcc,以及 GNU make。 而且,pgpool-II 需要链接到 libpq 库,所以在构建 pgpool-II 的机器上必须安装 libpq 库和它的开发头文件。 另外,还需要 OpenSSL 库和它的头文件以便在 pgpool-II 中提供 OpenSSL 支持。在解压源码包后,执行以下配置脚本
2.1 源码安装
#由于pool是基于postgres数据的中间件;所以需要安装postgres数据库服务
#安装postgres数据库服务器
查考《PostgreSQL on Linux 部署手册》
安装pgpool-II
#解压软件包
tar -zxvf pgpool-II-××.tar.gz
#编译安装
./configure --prefix=/opt/pgpool --with-pgsql=/opt/pgsql96
gmake
gmake install
2.2 安装pgpool_regclass
如果你在使用 PostgreSQL 8.0 或之后的版本,强烈推荐在需要访问的 PostgreSQL 中安装 pgpool_regclass 函数,因为它被 pgpool-II 内部使用。 如果不这样做,在不同的 schema 中处理相同的表名会出现问题(临时表不会出问题)。
cd pgpool-II-×.×.0/src/sql
make
make install
因为这个模板数据库将被克隆成新建的数据库。 postgres=# CREATE EXTENSION pgpool_regclass;
CREATE EXTENSION
postgres=# CREATE EXTENSION pgpool_recovery;
CREATE EXTENSION
postgres=# \dx
List of installed extensions
Name | Version | Schema | Description
-----------------+---------+------------+----------------------------------------------------
pgpool_recovery | 1.1 | public | recovery functions for pgpool-II for V3.4 or later
pgpool_regclass | 1.0 | public | replacement for regclass
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(3 rows)
2.3建立insert_lock表【可选】
如果你在复制模式中使用了 insert_lock ,强烈推荐建立 pgpool_catalog.insert_lock 表,用于互斥。 到现在为止,insert_lock 还能够工作。但是,在这种情况下,pgpool-II 需要锁定插入的目标表。 这种行为和 pgpool-II 2.2 和 2.3 系列类似。由于表锁与 VACUUM 冲突,所以 INSERT 操作可能因而等待很长时间。
cd pgpool-II-x.x.x/sql
psql -f insert_lock.sql template1
应在在每台通过 pgpool-II 访问的数据库中执行 insert_lock.sql。 你不需要在你执行“psql -f insert_lock.sql template1”后建立的数据库中这么做, 因为这个模板数据库将被克隆成新建的数据库
3. 搭建主/备模式
本例针对流复制模式
环境
OS: CentOS release 6.5 (Final)
DB: postgresql 9.6
pgpool服务器: pgpool 192.168.1.201
数据库主服务器:master 192.168.1.202
数据库从服务器:slave 192.168.1.203
架构设计
3.1 配置主机环境
. 对每个主机的/etc/hosts文件添加以下内容,
192.168.1.201 pgpool
192.168.1.202 master
192.168.1.203 slave . 配置环境变量
根据实际环境而定;示例
export PGHOME=/opt/pgsql96
export PGDATA=/home/postgres/data
export PATH=$PGHOME/bin:$PATH:$HOME/bin
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
export LANG=en_US.utf8
export PGPORT=
export PGUSER=postgres
export PGDATABASE=postgres PGPOOLHOME=/opt/pgpool
export PGPOOLHOME
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$PGHOME/bin:$PGPOOLHOME/bin
export PATH . 主机互信
用postgres用户登录;
主要用途是使得pgpool所在主机能登录postgresql所在主机。
$ ssh-keygen -t rsa
在pool节点都操作
$ ssh-copy-id postgres@master
$ ssh-copy-id postgres@slave
3.2 搭建流复制
参考《PG主备流复制.txt》;
4. 在master库上创建监控角色。在后面配置pool.conf需要设置
postgres=# create user srcheck PASSWORD '*****';
postgres=# alter user postgres password '*****';
postgres=# select rolname,rolpassword from pg_authid;
rolname | rolpassword
-------------------+-------------------------------------
pg_signal_backend |
replica | md5a28004efa9973e28807c49c166594b9d
postgres | md517214fe84590864b4d75cbeb0c4d57e9
srcheck | md57535ba2e04de102b8c3089e84b0d0d3b
3.3. 安装pgpool-II
在pool节点操作;postgres软件安装查考《PostgreSQL on Linux 部署手册》
[root@pool opt]# tar -zxvf pgpool-II-3.6.0.tar.gz
[root@pool opt]# cd pgpool-II-3.6.0
[root@pool pgpool-II-3.6.]# ./configure --prefix=/opt/pgpool --with-pgsql=/opt/pgsql96
[root@pool pgpool-II-3.6.]# gmake
[root@pool pgpool-II-3.6.]# gmake install
3.4 配置pgpool-II
[root@pool etc]$ cp pool_hba.conf.sample pool_hba.conf
[root@pool etc]$ cp pgpool.conf.sample-stream pgpool.conf
[root@pool etc]$ cp pcp.conf.sample pcp.conf
[root@pool etc]$ vim pgpool.conf
listen_addresses = '*'
port =
pcp_listen_addresses = '*'
pcp_port = # - Backend Connection Settings - backend_hostname0 = 'master'
# Host name or IP address to connect to for backend 0
backend_port0 =
# Port number for backend 0
backend_weight0 =
# Weight for backend 0 (only in load balancing mode)
backend_data_directory0 = '/home/postgres/data'
# Data directory for backend 0
backend_flag0 = 'ALLOW_TO_FAILOVER'
# Controls various backend behavior
# ALLOW_TO_FAILOVER or DISALLOW_TO_FAILOVER
backend_hostname1 = 'slave'
backend_port1 =
backend_weight1 =
backend_data_directory1 = '/home/postgres/data'
backend_flag1 = 'ALLOW_TO_FAILOVER' #------------------------------------------------------------------------------
# FILE LOCATIONS
#------------------------------------------------------------------------------ pid_file_name = '/home/postgres/pgpool/pgpool.pid'
# PID file name
# (change requires restart)
logdir = '/home/postgres/log'
# Directory of pgPool status file
# (change requires restart)
#------------------------------------------------------------------------------
# LOAD BALANCING MODE
#------------------------------------------------------------------------------ load_balance_mode = on #------------------------------------------------------------------------------
# MASTER/SLAVE MODE
#------------------------------------------------------------------------------ master_slave_mode = on
# Activate master/slave mode
# (change requires restart)
master_slave_sub_mode = 'stream'
# Master/slave sub mode
# Valid values are combinations slony or
# stream. Default is slony.
# (change requires restart)
# - Streaming - sr_check_period =
# Streaming replication check period
# Disabled (0) by default
sr_check_user = 'srcheck'
# Streaming replication check user
# This is neccessary even if you disable streaming
# replication delay check by sr_check_period = 0
sr_check_password = 'srcheck'
# Password for streaming replication check user
sr_check_database = 'postgres'
# Database name for streaming replication check
#------------------------------------------------------------------------------
# HEALTH CHECK
#------------------------------------------------------------------------------ health_check_period =
# Health check period
# Disabled (0) by default
health_check_timeout =
# Health check timeout
# 0 means no timeout
health_check_user = 'postgres'
# Health check user
health_check_password = 'li0924'
# Password for health check user
health_check_database = 'postgres'
# Database name for health check. If '', tries 'postgres' frist, #------------------------------------------------------------------------------
# FAILOVER AND FAILBACK
#------------------------------------------------------------------------------ failover_command = '/home/postgres/bin/failover_stream.sh %H' 其中需要创建对应的目录脚本;在pool主句
[postgres@pool ~]$ mkdir bin
[postgres@pool ~]$ mkdir log
[postgres@pool ~]$ mkdir pgpool
[postgres@pool ~]$ cd bin
[postgres@pool ~]$ cd bin
[postgres@pool bin]$ vi failover_stream.sh #! /bin/sh
# Failover command for streaming replication.
# Arguments: $1: new master hostname. new_master=$
trigger_command="$PGHOME/bin/pg_ctl promote -D $PGDATA" # Prompte standby database.
/usr/bin/ssh -T $new_master $trigger_command exit ; 配置pcp文件。配置管理pcp帐号
[root@pool etc]# pg_md5 li0924
5901cb2f82e1df6c9131753cc4cd3499
[root@pool etc]# vi pcp.conf
postgres:5901cb2f82e1df6c9131753cc4cd3499
[root@pool etc]# cat pool_hba.conf
# TYPE DATABASE USER CIDR-ADDRESS METHOD
local all all md5
# "local" is for Unix domain socket connections only
# IPv4 local connections:
#host all all 192.168.1.0/24 md5
host all all 0.0.0.0/ md5
#在pgpool中添加pg数据库的用户名和密码
[root@pool etc]# pg_md5 -p -m -u postgres pool_passwd
输入密码;即可生成pool_passwd文件
[root@pool etc]# cat pool_passwd
postgres:md517214fe84590864b4d75cbeb0c4d57e9
或者直接vi pool_passwd;密码在 select rolname,rolpassword from pg_authid;寻找
4.启动服务
.1在master/slave节点启动数据库
pg_start .2在pool节点启动pool服务
[postgres@pool ~]$ pgpool -n -d > pgpool.log >& &
[]
可以在/var/log/messages这样的信息。启动排查错误信息日志: /var/log/messages
Nov :: pool pgpool[]: [-] -- ::: pid : LOG: Setting up socket for 0.0.0.0:
Nov :: pool pgpool[]: [-] -- ::: pid : LOG: Setting up socket for :::
Nov :: pool pgpool[]: [-] -- ::: pid : LOG: pgpool-II successfully started. version 3.6. (subaruboshi) 8.3 关闭pool服务
pgpool -m fast stop
5. 查看信息
[postgres@pool ~]$ psql -p 9999
Password:
psql (9.6.0)
Type "help" for help. postgres=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay
---------+----------+------+--------+-----------+---------+------------+-------------------+-------------------
0 | master | 5432 | up | 0.500000 | primary | 0 | false | 0
1 | slave | 5432 | up | 0.500000 | standby | 0 | true | 0
(2 rows)
6. 高可用性
6.1 模拟主库数据库挂掉;是否可以继续提供服务
[postgres@pool ~]$ psql -p 9999
Password:
psql (9.6.0)
Type "help" for help. postgres=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_de
lay
---------+----------+------+--------+-----------+---------+------------+-------------------+---------------
----
0 | master | 5432 | down | 0.500000 | standby | 0 | false | 0
1 | slave | 5432 | up | 0.500000 | primary | 1 | true | 0
(2 rows)
从这里可以看出节点0的状态为down; 6.2 启动主库;在把节点0的状态恢复
[postgres@pool ~]$ pcp_attach_node -?
pcp_attach_node - attach a node from pgpool-II
Usage:
pcp_attach_node [OPTION...] [node-id]
Options:
-U, --username=NAME username for PCP authentication
-h, --host=HOSTNAME pgpool-II host
-p, --port=PORT PCP port number
-w, --no-password never prompt for password
-W, --password force password prompt (should happen automatically)
-n, --node-id=NODEID ID of a backend node
-d, --debug enable debug message (optional)
-v, --verbose output verbose messages
-?, --help print this help [postgres@pool ~]$ pcp_attach_node -d -p 9898 -n 0
Password:
DEBUG: recv: tos="m", len=8
DEBUG: recv: tos="r", len=21
DEBUG: send: tos="C", len=6
DEBUG: recv: tos="c", len=20
pcp_attach_node -- Command Successful
DEBUG: send: tos="X", len=4 [postgres@pool ~]$ psql -p 9999
Password:
psql (9.6.0)
Type "help" for help. postgres=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_de
lay
---------+----------+------+--------+-----------+---------+------------+-------------------+---------------
----
0 | master | 5432 | up | 0.500000 | standby | 0 | false | 0
1 | slave | 5432 | up | 0.500000 | primary | 1 | true | 0
(2 rows)
参考文献:http://blog.163.com/digoal@126/blog/static/1638770402014413104753331/
《PostgreSQL修炼之道》
pgpool-II 的使用的更多相关文章
- pgpool介绍和安装经验
Pgpool的介绍 一.介绍 是一个工作在PostgreSQL多服务器和PostgreSQL数据库客户端之间的中间件. 二.概念图 三.功能 连接池:pgpool -Ⅱ保存 连 接到PostgreSQ ...
- 转一篇pgpool配置
转一篇pgpool配置 http://dz.sdut.edu.cn/blog/subaochen/2013/08/postgresql-9-1的failover配置及其管理/ 环境介绍 在两台虚拟机上 ...
- Top PG Clustering HA Solutions for PostgreSQL
转自:https://severalnines.com/blog/top-pg-clustering-ha-solutions-postgresql If your system relies on ...
- CHAPTER ONE LOAD-BALANCING
1.1 Synopsis In this part, we will explain how to create a load-balancer withnginxfor a lot of OpenE ...
- 云原生 PostgreSQL 集群 - PGO:来自 Crunchy Data 的 Postgres Operator
使用 PGO 在 Kubernetes 上运行 Cloud Native PostgreSQL:来自 Crunchy Data 的 Postgres Operator! Cloud Native Po ...
- pgpool-II 4.3 中文手册-前言
什么是 Pgpool-II? Pgpool II 管理一个 PostgreSQL 服务器池,以实现单个 PostgreSQL 安装无法实现的一些功能.这些功能包括: 高可用 Pgpool-II 通过使 ...
- Leetcode 笔记 113 - Path Sum II
题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...
- Leetcode 笔记 117 - Populating Next Right Pointers in Each Node II
题目链接:Populating Next Right Pointers in Each Node II | LeetCode OJ Follow up for problem "Popula ...
- 函数式Android编程(II):Kotlin语言的集合操作
原文标题:Functional Android (II): Collection operations in Kotlin 原文链接:http://antonioleiva.com/collectio ...
- 统计分析中Type I Error与Type II Error的区别
统计分析中Type I Error与Type II Error的区别 在统计分析中,经常提到Type I Error和Type II Error.他们的基本概念是什么?有什么区别? 下面的表格显示 b ...
随机推荐
- APICloud 实践 —— 安装与创建应用
1.安装APICloud Studio 下载地址:https://www.apicloud.com/devtools 2.打开 APICloud Studio,登录 3.登录成功,在 代码编辑器 创建 ...
- HTML5规范尘埃落定,5个开发工具推荐
HTML5规范终于在今年正式定稿,对于从事多年HTML5开发的人员来说绝对是一个重大新闻.数字天堂董事长,DCloud CEO王安也发表了文章,从开发者和用户两个角度分析了HTML对两个人群的优势.其 ...
- Change Data template dynamically
1. Attached Property bound to task state. Any change will dynamically set data template.2. Visual St ...
- Spring系列-JDBC实例
前言:spring沾过一点点,但细节不了解,实例能力也不行,决定从头学起吧. 没有理论,只有实例代码,理论自行百度多的很的很 帖一下项目整体架构: 1.数据库建表 CREATE TABLE `cust ...
- (笔记)Mysql命令grant on:增加新用户并控制其权限
grant on命令用于增加新用户并控制其权限. grant on命令格式:grant select on 数据库.* to 用户名@登录主机 identified by “密码”; 1) 增加一个用 ...
- 嵌入式开发之zynq驱动—— zynq ps pl ddr 内存地址空间映射
http://www.wiki.xilinx.com/Zynq-7000+AP+SoC+-+32+Bit+DDR+Access+with+ECC+Tech+Tip http://patchwork.o ...
- OpenStack提交代码的review流程
本文整理向openstack社区提交代码的基本流程,以及社区一些介绍资料.如有转载,请注明出处! 先放张图说明一下OpenStack的code review的大体流程: 对OpenStack提交代码更 ...
- android位移动画的两种实现方式
在android开发,我们会常常使用到位移动画,普通情况下位移动画有两种实现方式.一种是直接通过java代码去实现,第二种是通过配置文件实现动画,以下是两种动画的基本是用法: 纯Java代码实现: / ...
- C# ToString()格式设置大全
C 货币 2.5.ToString("C") ¥2.50 D 十进制数 25.ToString("D5") 00025 E 科学型 25000.ToString ...
- Mac下给SD卡烧录树莓派系统
1.mac 磁盘工具 抹掉sd卡 为fat 2. df -h 看清sd卡号 3. 卸载sd卡 diskutil unmount /dev/disk2s2 Volume UNTITLED on disk ...