pgpool 主从流复制模式下的安装使用

[size=small]pgpool-II 是一个位于 PostgreSQL 服务器和 PostgreSQL 数据库客户端之间的中间件,它提供以下功能:
 连接池
pgpool-II 保持已经连接到 PostgreSQL 服务器的连接,并在使用相同参数(例如:用户名,数据库,协议版本)连接进来时重用它们。它减少了连接开销,并增加了系统的总体吞吐量。
 复制
pgpool-II 可以管理多个 PostgreSQL 服务器。激活复制功能并使在2台或者更多 PostgreSQL 节点中建立一个实时备份成为可能,这样,如果其中一台节点失效,服务可以不被中断继续运行。
 负载均衡
如果数据库进行了复制,则在任何一台服务器中执行一个 SELECT 查询将返回相同的结果。pgpool-II 利用了复制的功能以降低每台 PostgreSQL 服务器的负载。它通过分发 SELECT 查询到所有可用的服务器中,增强了系统的整体吞吐量。在理想的情况下,读性能应该和 PostgreSQL 服务器的数量成正比。负载均衡功能在有大量用户同时执行很多只读查询的场景中工作的效果最好。
 并行查询
使用并行查询时,数据可以被分割到多台服务器上,所以一个查询可以在多台服务器上同时执行,以减少总体执行时间。并行查询在查询大规模数据的时候非常有效。
现有的数据库应用程序基本上可以不需要修改就可以使用 pgpool-II


现有环境:
主:pgtest01 192.168.12.251 pg9.4.5
从:pgtest02 192.168.12.252 pg9.4.5
安装目录 /pgtina
数据目录 /pgtina/data

=================安装pgpool===========
1、下载安装包:
http://www.pgpool.net/mediawiki/index.php/Downloads
# wget http://192.168.10.100/pgpool-II-3.4.3.tar.gz

2、解压安装
# tar -zxvf pgpool-II-3.4.3.tar.gz
# mkdir pgpool
[postgres@pgtest01 pgtina]$ cat ~/.bash_profile
export LD_LIBRARY_PATH=/pgtina/lib
export PATH=/pgtina/bin:$PATH

# pwd
/package/pgpool-II-3.4.3
# ./configure --prefix=/pgpool -with-pgsql=path -with-pgsql=/pgtina --with-openssl 默认情况下,pgpool-II将安装到 /usr/local 目录。

--编译报错:
checking openssl/ssl.h usability... no
checking openssl/ssl.h presence... no
checking for openssl/ssl.h... no
configure: error: header file is required for SSL

# yum install openssl
# yum install openssl-devel 可以写成yum install -y openssl openssl-devel

编译通过,进行安装
make
make install

3、安装pg_regclass 和pg_recovery(两节点操作)
如果你在使用 PostgreSQL 8.0 或之后的版本,强烈推荐在需要访问的 PostgreSQL 中安装 pgpool_regclass 函数,
因为它被 pgpool-II 内部使用。 如果不这样做,在不同的 schema 中处理相同的表名会出现问题(临时表不会出问题)。
# find / -name "pgpool*.sql"
/package/pgpool-II-3.4.3/src/sql/pgpool_adm/pgpool_adm--1.0.sql
/package/pgpool-II-3.4.3/src/sql/pgpool-recovery/pgpool_recovery--1.1.sql
/package/pgpool-II-3.4.3/src/sql/pgpool-regclass/pgpool_regclass--1.0.sql

# find / -name "pgpool*.control"
/package/pgpool-II-3.4.3/src/sql/pgpool_adm/pgpool_adm.control
/package/pgpool-II-3.4.3/src/sql/pgpool-recovery/pgpool_recovery.control
/package/pgpool-II-3.4.3/src/sql/pgpool-regclass/pgpool_regclass.control

template1=# create extension pgpool_regclass;
ERROR: could not open extension control file "/pgtina/share/postgresql/extension/pgpool_regclass.control": No such file or directory

查看手册
http://www.pgpool.net/docs/latest/pgpool-zh_cn.html

正确的方式:
cd pgpool-II-x.x.x/sql/pgpool-regclass
make
make install
在这之后:
psql -f pgpool-regclass.sql template1
或者
psql template1
CREATE EXTENSION pgpool_regclass;

[postgres@pgtest01 ~]$ psql -f /pgtina/share/postgresql/extension/pgpool_regclass--1.0.sql template1
Use "CREATE EXTENSION pgpool_regclass" to load this file.

# cd /package/pgpool-II-3.4.3/src/sql
# ll
total 24
-rw-rw-r--. 1 postgres postgres 617 Jul 24 13:47 insert_lock.sql
-rw-rw-r--. 1 postgres postgres 1407 Jul 24 13:47 Makefile
drwxrwsr-x. 2 postgres postgres 4096 Jul 24 13:47 pgpool_adm
drwxrwsr-x. 2 postgres postgres 4096 Jul 24 13:47 pgpool-recovery
drwxrwsr-x. 2 postgres postgres 4096 Jul 24 13:47 pgpool-regclass
-rw-rw-r--. 1 postgres postgres 834 Jul 24 13:47 system_db.sql
# make
make: pg_config: Command not found
make: *** No targets. Stop.
# source /home/postgres/.bash_profile
# make
# make install

# cd /pgtina/share/postgresql/extension/ --果然有了这些文件
# ll
total 44
-rw-r--r--. 1 root root 2664 Nov 19 14:09 pgpool_adm--1.0.sql
-rw-r--r--. 1 root root 146 Nov 19 14:09 pgpool_adm.control
-rw-r--r--. 1 root root 1002 Nov 19 14:09 pgpool_recovery--1.1.sql
-rw-r--r--. 1 root root 178 Nov 19 14:09 pgpool_recovery.control
-rw-r--r--. 1 root root 557 Nov 19 14:09 pgpool-recovery.sql
-rw-r--r--. 1 root root 283 Nov 19 14:09 pgpool_regclass--1.0.sql
-rw-r--r--. 1 root root 152 Nov 19 14:09 pgpool_regclass.control
-rw-r--r--. 1 root root 142 Nov 19 14:09 pgpool-regclass.sql
-rw-r--r--. 1 postgres postgres 332 Nov 18 10:51 plpgsql--1.0.sql
-rw-r--r--. 1 postgres postgres 179 Nov 18 10:51 plpgsql.control
-rw-r--r--. 1 postgres postgres 381 Nov 18 10:51 plpgsql--unpackaged--1.0.sql

--再来创建:---成功
template1=# create extension pgpool_regclass;
CREATE EXTENSION
template1=# create extension pgpool_recovery;
CREATE EXTENSION

template1=# \df
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+---------------------+------------------+----------------------------------------------------------------------------------+--------
public | pgpool_pgctl | boolean | action text, stop_mode text | normal
public | pgpool_recovery | boolean | script_name text, remote_host text, remote_data_directory text | normal
public | pgpool_recovery | boolean | script_name text, remote_host text, remote_data_directory text, remote_port text | normal
public | pgpool_remote_start | boolean | remote_host text, remote_data_directory text | normal
public | pgpool_switch_xlog | text | arcive_dir text | normal
(5 rows)

备注: 每个库都需要安装 pgpool_regclass,为了方便在 template1 上安装 pgpool_regclass,以后新建的库都以 template1 为模板库。

5.配置 pgpool-II ( 两节点操作)
# cd /pgpool/etc/
# cp pcp.conf.sample pcp.conf

# find / -name "pg_md5"
/package/pgpool-II-3.4.3/src/tools/pgmd5/pg_md5
/pgpool/bin/pg_md5


# /pgpool/bin/pg_md5 -u postgres -p
password: test12
60474c9c10d7142b7508ce7a50acf414
备注: pgpool提供pcp接口,可以查看,管理pgpool的状态,并且可以远程操作pgpool,pcp.conf用来对pcp相关命令认证的文件,格式为USERID:MD5PASSWD。

--编写 pcp.conf 文件,写入以下
# USERID:MD5PASSWD
postgres:60474c9c10d7142b7508ce7a50acf414
pgpool:ba777e4c2f15c11ea8ac3be7e0440aa0

vi /etc/hosts
192.168.12.251 pgtest01
192.168.12.252 pgtest02

--配置 ifconfig, arping 执行权限
# chmod u+s /sbin/ifconfig
# chmod u+s /usr/sbin
备注: 以理普通用户能够执行以上命令, failover_command 命令要用到。

--配置两节点信任关系
# su - postgres
[postgres@pgtest01 ~]$ ssh postgres@pgtest02 --配置后要求无密码登录
[postgres@pgtest01 ~]$ ssh-keygen
Enter file in which to save the key (/home/postgres/.ssh/id_rsa):
[postgres@pgtest01 ~]$ ssh-copy-id postgres@pgtest02
postgres@pgtest02's password:
Now try logging into the machine, with "ssh 'postgres@pgtest02'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
[postgres@pgtest01 ~]$ ssh postgres@pgtest02 --成功

在另一台机器上也操作一下

--配置 pgpool.conf
# cd /pgpool/etc
# cp pgpool.conf.sample pgpool.conf

--开启日志
在日志 /etc/rsyslog.conf 加入以下行
# pgpool
local0.* /var/log/pgpool.log

# vi /etc/rsyslog.conf
# /etc/init.d/rsyslog restart
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]


--主节点的 pgpool.conf
[postgres@pgtest01 etc]$ grep ^[a-z] pgpool.conf
listen_addresses = '*'
port = 9999
socket_dir = '/tmp'
pcp_port = 9898
pcp_socket_dir = '/tmp'
backend_hostname0 = '192.168.12.251' ##配置数据节点 db1
backend_port0 = 5432
backend_weight0 = 1
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_hostname1 = '192.168.12.252' ##配置数据节点 db2
backend_port1 = 5432
backend_weight1 = 1
backend_flag1 = 'ALLOW_TO_FAILOVER'
enable_pool_hba = on
pool_passwd = 'pool_passwd'
authentication_timeout = 60
ssl = off
num_init_children = 32
max_pool = 4
child_life_time = 300
child_max_connections = 0
connection_life_time = 0
client_idle_limit = 0
log_destination = 'syslog'
print_timestamp = on
log_connections = on
log_hostname = on
log_statement = on
log_per_node_statement = off
log_standby_delay = 'none'
syslog_facility = 'LOCAL0'
syslog_ident = 'pgpool'
debug_level = 0
pid_file_name = '/pgpool.pid'
logdir = '/pgpool/log'
connection_cache = on
reset_query_list = 'ABORT; DISCARD ALL'
replication_mode = off
replicate_select = off
insert_lock = on
lobj_lock_table = ''
replication_stop_on_mismatch = off
failover_if_affected_tuples_mismatch = off
load_balance_mode = on
ignore_leading_white_space = on
white_function_list = ''
black_function_list = 'nextval,setval'
master_slave_mode = on # 设置流复制模式
master_slave_sub_mode = 'stream' # 设置流复制模式
sr_check_period = 5
sr_check_user = 'repluser'
sr_check_password = 'repluser'
delay_threshold = 16000
follow_master_command = ''
---从这开始没有了
parallel_mode = off
pgpool2_hostname = ''
system_db_hostname = 'localhost'
system_db_port = 5432
system_db_dbname = 'pgpool'
system_db_schema = 'pgpool_catalog'
system_db_user = 'pgpool'
system_db_password = ''
----------------
health_check_period = 5
health_check_timeout = 20
health_check_user = 'repuser'
health_check_password = 'rep123us345er'
health_check_max_retries = 3
health_check_retry_delay = 1
failover_command = '/opt/pgpool/failover_stream.sh %H ' ## 配置 failover 脚本,脚本内容下面会贴出。
failback_command = ''
fail_over_on_backend_error = on
search_primary_node_timeout = 10
recovery_user = 'nobody'
recovery_password = ''
recovery_1st_stage_command = ''
recovery_2nd_stage_command = ''
recovery_timeout = 90
client_idle_limit_in_recovery = 0
use_watchdog = on ---注意打开watchdog
trusted_servers = ''
ping_path = '/bin'
wd_hostname = '192.168.12.251'
wd_port = 9000
wd_authkey = ''
delegate_IP = '192.168.12.240' ## 配置 pgpool 的 VIP,避免 pgpool 的单点故障
ifconfig_path = '/sbin' ## 以下几个网卡命令不需要修改。
if_up_cmd = 'ifconfig eth0:0 inet $_IP_$ netmask 255.255.255.0'
if_down_cmd = 'ifconfig eth0:0 down'
arping_path = '/usr/sbin' # arping command path
arping_cmd = 'arping -U $_IP_$ -w 1'
clear_memqcache_on_escalation = on
wd_escalation_command = ''
wd_lifecheck_method = 'heartbeat'
wd_interval = 10
wd_heartbeat_port = 9694
wd_heartbeat_keepalive = 2
wd_heartbeat_deadtime = 30
heartbeat_destination0 = '192.168.12.252' # 配置对端的 hostname
heartbeat_destination_port0 = 9694
heartbeat_device0 = 'eth0'
wd_life_point = 3
wd_lifecheck_query = 'SELECT 1'
wd_lifecheck_dbname = 'template1'
wd_lifecheck_user = 'nobody'
wd_lifecheck_password = ''
other_pgpool_hostname0 = '192.168.12.252' ## 配置对端的 pgpool
other_pgpool_port0 = 9999 ---注意这里
other_wd_port0 = 9000
relcache_expire = 0
relcache_size = 256
check_temp_table = on
memory_cache_enabled = off
memqcache_method = 'shmem'
memqcache_memcached_host = 'localhost'
memqcache_memcached_port = 11211
memqcache_total_size = 67108864
memqcache_max_num_cache = 1000000
memqcache_expire = 0
memqcache_auto_cache_invalidation = on
memqcache_maxcache = 409600
memqcache_cache_block_size = 1048576
memqcache_oiddir = '/var/log/pgpool/oiddir'
white_memqcache_table_list = ''
black_memqcache_table_list = ''

--备节点的 pgpool.conf
[postgres@pgtest02 etc]$ grep ^[a-z] pgpool.conf
listen_addresses = '*'
port = 9999
socket_dir = '/tmp'
pcp_port = 9898
pcp_socket_dir = '/tmp'
backend_hostname0 = '192.168.12.251'
backend_port0 = 5432
backend_weight0 = 1
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_hostname1 = '192.168.12.252'
backend_port1 = 5432
backend_weight1 = 1
backend_flag1 = 'ALLOW_TO_FAILOVER'
enable_pool_hba = on
pool_passwd = 'pool_passwd'
authentication_timeout = 60
ssl = off
num_init_children = 32
max_pool = 4
child_life_time = 300
child_max_connections = 0
connection_life_time = 0
client_idle_limit = 0
log_destination = 'syslog'
print_timestamp = on
log_connections = on
log_hostname = on
log_statement = on
log_per_node_statement = off
log_standby_delay = 'none'
syslog_facility = 'LOCAL0'
syslog_ident = 'pgpool'
debug_level = 0
pid_file_name = '/opt/pgpool/pgpool.pid'
logdir = '/pgpool/log'
connection_cache = on
reset_query_list = 'ABORT; DISCARD ALL'
replication_mode = off
replicate_select = off
insert_lock = on
lobj_lock_table = ''
replication_stop_on_mismatch = off
failover_if_affected_tuples_mismatch = off
load_balance_mode = on
ignore_leading_white_space = on
white_function_list = ''
black_function_list = 'nextval,setval'
master_slave_mode = on
master_slave_sub_mode = 'stream'
sr_check_period = 0
sr_check_user = 'repluser'
sr_check_password = 'repluser'
delay_threshold = 16000
follow_master_command = ''
-----以下没有---
parallel_mode = off
pgpool2_hostname = ''
system_db_hostname = 'localhost'
system_db_port = 5432
system_db_dbname = 'pgpool'
system_db_schema = 'pgpool_catalog'
system_db_user = 'pgpool'
system_db_password = ''
------------------------------
health_check_period = 0
health_check_timeout = 20
health_check_user = 'nobody'
health_check_password = ''
health_check_max_retries = 0
health_check_retry_delay = 1
failover_command = '/opt/pgpool/failover_stream.sh %H '
failback_command = ''
fail_over_on_backend_error = on
search_primary_node_timeout = 10
recovery_user = 'nobody'
recovery_password = ''
recovery_1st_stage_command = ''
recovery_2nd_stage_command = ''
recovery_timeout = 90
client_idle_limit_in_recovery = 0
use_watchdog = on
trusted_servers = ''
ping_path = '/bin'
wd_hostname = '192.168.12.252'
wd_port = 9000
wd_authkey = ''
delegate_IP = '192.168.12.240'
ifconfig_path = '/sbin'
if_up_cmd = 'ifconfig eth0:0 inet $_IP_$ netmask 255.255.255.0'
if_down_cmd = 'ifconfig eth0:0 down'
arping_path = '/usr/sbin' # arping command path
arping_cmd = 'arping -U $_IP_$ -w 1'
clear_memqcache_on_escalation = on
wd_escalation_command = ''
wd_lifecheck_method = 'heartbeat'
wd_interval = 10
wd_heartbeat_port = 9694
wd_heartbeat_keepalive = 2
wd_heartbeat_deadtime = 30
heartbeat_destination0 = '192.168.12.251'
heartbeat_destination_port0 = 9694
heartbeat_device0 = 'eth0'
wd_life_point = 3
wd_lifecheck_query = 'SELECT 1'
wd_lifecheck_dbname = 'template1'
wd_lifecheck_user = 'nobody'
wd_lifecheck_password = ''
other_pgpool_hostname0 = '192.168.12.251'
other_pgpool_port0 = 9999
other_wd_port0 = 9000
relcache_expire = 0
relcache_size = 256
check_temp_table = on
memory_cache_enabled = off
memqcache_method = 'shmem'
memqcache_memcached_host = 'localhost'
memqcache_memcached_port = 11211
memqcache_total_size = 67108864
memqcache_max_num_cache = 1000000
memqcache_expire = 0
memqcache_auto_cache_invalidation = on
memqcache_maxcache = 409600
memqcache_cache_block_size = 1048576
memqcache_oiddir = '/var/log/pgpool/oiddir'
white_memqcache_table_list = ''
black_memqcache_table_list = ''

--/opt/pgpool/failover_stream.sh 脚本内容
[pg93@db1 etc]$ cat /opt/pgpool/failover_stream.sh
#! /bin/sh
# Failover command for streaming replication.
# Arguments: $1: new master hostname.

new_master=$1
trigger_command="$PGHOME/bin/pg_ctl promote -D $PGDATA"

# Prompte standby database.
/usr/bin/ssh -T $new_master $trigger_command

exit 0;
备注: 我这里定义的 failover 脚本和 pgpool 手册上的脚本不同,这里使用了 pg_ctl promote 的切换方式,
一方面以文件触发的形式个人觉得不是很好。另一方面:当以 trigger file 形式实现 HA 时会遇到不能来回切
换的问题。

如果仔细看,可以看到这个切换脚本并不严谨,每当有节点离线时,它都会触发一次,也就是说如果当前掉线的
是备节点,它也会到对端主库执行一次 failover_command 命令,不过没关系,并不影响。


--启动 pgpool(两边都要启动)
[pg93@db2 etc]$ pgpool
备注: 此时可以查看 /var/log/pgpool.log 日志了,注意两节点都启动。

启动失败:
[postgres@pgtest01 bin]$ /pgpool/bin/pgpool
2015-11-19 15:33:30: pid 24712: WARNING: failed while loading hba configuration from file:"/pgpool/etc/pool_hba.conf"
2015-11-19 15:33:30: pid 24712: DETAIL: fopen failed with error: "No such file or directory"

cp /pgpool/etc/pool_hba.conf.sample pool_hba.conf

[postgres@pgtest01 etc]$ ps -ef|grep pgpool
postgres 24713 1 0 15:33 ? 00:00:00 /pgpool/bin/pgpool
postgres 24718 24713 0 15:33 ? 00:00:00 pgpool: watchdog
postgres 24719 24713 0 15:33 ? 00:00:00 pgpool: heartbeat receiver
postgres 24720 24713 0 15:33 ? 00:00:00 pgpool: heartbeat sender
postgres 24721 24713 0 15:33 ? 00:00:00 pgpool: lifecheck
postgres 24781 24713 0 15:33 ? 00:00:00 pgpool: wait for connection request
postgres 24782 24713 0 15:33 ? 00:00:00 pgpool: wait for connection request
postgres 24783 24713 0 15:33 ? 00:00:00 pgpool: wait for connection request
postgres 24784 24713 0 15:33 ? 00:00:00 pgpool: wait for connection request
postgres 24785 24713 0 15:33 ? 00:00:00 pgpool: wait for connection request
postgres 24786 24713 0 15:33 ? 00:00:00 pgpool: wait for connection request
postgres 24787 24713 0 15:33 ? 00:00:00 pgpool: wait for connection request
postgres 24788 24713 0 15:33 ? 00:00:00 pgpool: wait for connection request
postgres 24789 24713 0 15:33 ? 00:00:00 pgpool: wait for connection request
postgres 24790 24713 0 15:33 ? 00:00:00 pgpool: wait for connection request
postgres 24791 24713 0 15:33 ? 00:00:00 pgpool: wait for connection request
postgres 24792 24713 0 15:33 ? 00:00:00 pgpool: PCP: wait for connection request
postgres 24794 24713 0 15:33 ? 00:00:00 pgpool: worker process
postgres 24939 24680 0 15:38 pts/2 00:00:00 grep pgpool

查看后台日志:
# tail -f /var/log/pgpool.log
Nov 19 15:33:38 pgtest01 pgpool[24713]: [96-1] 2015-11-19 15:33:38: pid 24713: LOG: child process with pid: 24751 exits with status 0
Nov 19 15:33:38 pgtest01 pgpool[24713]: [97-1] 2015-11-19 15:33:38: pid 24713: LOG: child process with pid: 24751 exited with success and will not be restarted
Nov 19 15:33:38 pgtest01 pgpool[24713]: [98-1] 2015-11-19 15:33:38: pid 24713: LOG: child process with pid: 24752 exits with status 0

当从库启动后log更新了下面两条:
Nov 19 15:40:34 pgtest01 pgpool[24718]: [10-1] 2015-11-19 15:40:34: pid 24718: LOG: sending watchdog response
Nov 19 15:40:34 pgtest01 pgpool[24718]: [10-2] 2015-11-19 15:40:34: pid 24718: DETAIL: receive add request from 192.168.12.252:9999 and accept it

以上的命令不打印日志信息,因为 pgpool 脱离终端了。如果你想显示 pgpool 日志信息,你需要传递 -n 到 pgpool 命令。此时 pgpool-II 作为非守护进程模式运行,也就不会脱离终端了。
$ pgpool -n &
日志消息会打印到终端,所以推荐使用如下的选项。
$ /pgpool/bin/pgpool -n -d > /tmp/pgpool.log 2>&1 & --命令都要带详细路径。
-d 选项启用调试信息生成。
pgpool -d -n #
-d 模式Debug下log
-n 是不使用后台模式


以上命令持续追加日志消息到 /tmp/pgpool.log 中。如果你需要切换日志文件,可以将日志传递到一个支持日志轮
换功能的外部命令。例如,你可以使用 Apache2 带的 rotatelogs 工具。

--pgpool 关闭命令
[pg93@db2 etc]$ pgpool -m fast stop

--pgpool reload 命令
[pg93@db1 etc]$ pgpool reload


登录查看,发现这个参数没办法显示:
[postgres@pgtest01 etc]$ psql -h 192.168.12.251 -p 5432 -U postgres -d postgres
psql (9.4.5)
Type "help" for help.

postgres=# show pool_nodes;
ERROR: unrecognized configuration parameter "pool_nodes"

[postgres@pgtest01 etc]$ psql -h 192.168.12.251 -p 9999 -U postgres -d postgres --注意端口
psql (9.4.5)
Type "help" for help.

postgres=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role
---------+----------------+------+--------+-----------+---------
0 | 192.168.12.251 | 5432 | 2 | 0.500000 | primary
1 | 192.168.12.252 | 5432 | 3 | 0.500000 | standby
(2 rows)

备注: db2 为 primary, db1 为 standby,status 为 2 ,表示正常连接; 关于 status 状态,如下
0 - This state is only used during the initialization. PCP will never display it.
1 - Node is up. No connections yet.
2 - Node is up. Connections are pooled.
3 - Node is down.

参数里面有一个写错了,写成了5433,修改后重启pgpool,standby的status依然是3
[postgres@pgtest01 etc]$ /pgpool/bin/pgpool -m fast stop
2015-11-19 15:54:42: pid 25448: LOG: stop request sent to pgpool. waiting for termination...
.....done.
[postgres@pgtest01 etc]$ /pgpool/bin/pgpool
[postgres@pgtest01 etc]$

在从库上只看到一条主库的信息
[postgres@pgtest02 pgpool]$ psql -h 192.168.12.252 -p 9999 -U postgres postgres
psql (9.4.5)
Type "help" for help.

postgres=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role
---------+----------------+------+--------+-----------+---------
0 | 192.168.12.251 | 5432 | 2 | 1.000000 | primary
(1 row)


2015-11-19 16:12:38: pid 25943: DEBUG: watchdog heartbeat: send heartbeat signal to 192.168.12.252:9694
2015-11-19 16:12:38: pid 25942: DEBUG: watchdog heartbeat: received heartbeat signal from "192.168.12.252:9999"

ov 19 16:15:56 pgtest02 pgpool[17626]: [149-1] 2015-11-19 16:15:56: pid 17626: DEBUG: watchdog heartbeat: received heartbeat signal from "192.168.12.251:9999"
Nov 19 16:15:56 pgtest02 pgpool[17628]: [99-1] 2015-11-19 16:15:56: pid 17628: DEBUG: watchdog life checking by heartbeat
Nov 19 16:15:56 pgtest02 pgpool[17628]: [99-2] 2015-11-19 16:15:56: pid 17628: DETAIL: checking pgpool 0 (192.168.12.252:9999)
Nov 19 16:15:56 pgtest02 pgpool[17628]: [100-1] 2015-11-19 16:15:56: pid 17628: DEBUG: watchdog life checking by heartbeat
Nov 19 16:15:56 pgtest02 pgpool[17628]: [100-2] 2015-11-19 16:15:56: pid 17628: DETAIL: OK; status 3

status = 2 正常在使用中,status=3 被移除需要恢复,启动pg_pool时加入 -D 移除以前的数据库状态。
/pgpool/bin/pgpool -n -d -D > /tmp/pgpool.log 2>&1 & 两边都重启一下,带上-D参数,然后两台机器看到都正常了。
postgres=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role
---------+----------------+------+--------+-----------+---------
0 | 192.168.12.251 | 5432 | 2 | 0.500000 | primary
1 | 192.168.12.252 | 5432 | 2 | 0.500000 | standby
(2 rows)


六: HA 验证
根据上面 show_nodes 输出, 此时192.168.12.251节点为主库,192.168.12.252节点为备库,并且 pgpool 目前跑在192.168.12.251上

# chmod +x failover_stream.sh
# cat failover_stream.sh
#! /bin/sh
# Failover command for streaming replication.
# Arguments: $1: new master hostname.
new_master=$1
trigger_command="$PGHOME/bin/pg_ctl promote -D $PGDATA"
# Prompte standby database.
/usr/bin/ssh -T $new_master $trigger_command
exit 0;
# echo $PGHOME
添加环境变量
# su - postgres
[postgres@pgtest01 ~]$ echo $PGHOME

[postgres@pgtest01 ~]$ vi .bash_profile
export PATH=$PATH:$HOME/bin
export LD_LIBRARY_PATH=/pgtina/lib
export PATH=/pgtina/bin:$PATH
export PGHOME=/pgtina
export PGDATA=/pgtina/data

1 关 12.251上的数据库
12.251关闭数据库
[postgres@pgtest01 ~]$ pg_ctl -m fast stop
waiting for server to shut down.... done
server stopped

12.251上查看
[postgres@pgtest01 ~]$ pg_controldata |grep cluster
Database cluster state: shut down
12.252上查看
[postgres@pgtest02 ~]$ pg_controldata |grep cluster
Database cluster state: in archive recovery

postgres=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role
---------+----------------+------+--------+-----------+---------
0 | 192.168.12.251 | 5432 | 3 | 0.500000 | standby
1 | 192.168.12.252 | 5432 | 2 | 0.500000 | standby ---没有变成主库,可能跟我设定了trigger_file有关系 #trigger_file = '/tmp/pg.trigger.252' 注释掉

重新启动了主库12.251,发现状态没变化,但主库可以同步,现在再重启一次pgpool试试。加上-D
[postgres@pgtest01 ~]$ /pgpool/bin/pgpool -n -d -D> /tmp/pgpool.log 2>&1 & 恢复了状态

再来试试切换:
[postgres@pgtest01 ~]$ pg_ctl -D /pgtina/data stop
waiting for server to shut down....... done
server stopped
[postgres@pgtest01 ~]$ pg_controldata |grep cluster
Database cluster state: shut down
[postgres@pgtest02 data]$ pg_controldata |grep cluster --12.252
Database cluster state: in production


[pg93@db1 etc]$ ll /pgtina/data/recovery.done
备注:可以看到12.252节点已完成从 standby 角色切换到 primary ,并且 $PGDATA/recovery.conf 文件变成 recovery.done.

查看 pgpool 状态
[postgres@pgtest01 pgpool]$ psql -h 192.168.12.240 -p 9999 -U postgres postgres ---使用vip连接pgpool
psql (9.4.5)
Type "help" for help.
postgres=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role
---------+----------------+------+--------+-----------+---------
0 | 192.168.12.251 | 5432 | 3 | 0.500000 | standby
1 | 192.168.12.252 | 5432 | 2 | 0.500000 | primary
(2 rows)
备注: 12.252已转换成 primary 角色。 12.251状态为 3 ,表示 down 状态。

接下来以 standby 身份启动12.251 --注意两边的recovery.conf配置内容不一样哟
[postgres@pgtest01 data]$ mv recovery.done recovery.conf
[postgres@pgtest01 data]$ vi recovery.conf
primary_conninfo = 'host=192.168.12.252 port=5432 user=repluser password=repluser application_name=standby2'

启动新备库12.151
[postgres@pgtest01 data]$ pg_ctl -D /pgtina/data start
server starting

12.252上操作,添加12.251-新从节点信息
[postgres@pgtest02 bin]$ /pgpool/bin/pcp_attach_node -d 5 pgtest01 9898 pgpool pgpool 1 --这里用户密码错了postgres和密码123456由之前pcp.conf中设置所得。
Format:
pcp_attach_node _timeout_ _host_ _port_ _userid_ _passwd_ _nodeid_

把给定的节点加入到 pgpool-II。
DEBUG: send: tos="R", len=44
DEBUG: recv: tos="r", len=63, data=AuthenticationFailed
DEBUG: authentication failed. reason=AuthenticationFailed
AuthorizationError

认证失败: 用户和密码,还有端口id都不对,要注意看show pool_nodes和pcp.conf中设置的用户密码。
[postgres@pgtest02 bin]$ /pgpool/bin/pcp_attach_node -d 5 pgtest01 9898 postgres test12 0
DEBUG: send: tos="R", len=46
DEBUG: recv: tos="r", len=21, data=AuthenticationOK
DEBUG: send: tos="D", len=6
DEBUG: recv: tos="c", len=20, data=CommandComplete
DEBUG: send: tos="X", len=4

查看状态,12.251变成了1,显然还是有问题:--重新连接进去就ok了。
postgres=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role
---------+----------------+------+--------+-----------+---------
0 | 192.168.12.251 | 5432 | 2 | 0.500000 | standby
1 | 192.168.12.252 | 5432 | 2 | 0.500000 | primary
(2 rows)

但是在12.252这边看又正常了。
postgres=# show pool_nodes; ------12.252显示251是主库,但12.251显示252是主库呀!!!,检查问题!
node_id | hostname | port | status | lb_weight | role
---------+----------------+------+--------+-----------+---------
0 | 192.168.12.251 | 5432 | 2 | 0.500000 | primary
1 | 192.168.12.252 | 5432 | 2 | 0.500000 | standby
(2 rows)

12.251的日志报错:连不上主库
FATAL: could not connect to the primary server: FATAL: no pg_hba.conf entry for replication connection from host "192.168.12.251", user "repluser"

原来12.252的pg_hba.conf文件中没设置权限:
host replication repluser 192.168.12.251/32 md5


把12.252的pgpool重启一次,加上-D参数
发现显示终于正常了:
postgres=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role
---------+----------------+------+--------+-----------+---------
0 | 192.168.12.251 | 5432 | 2 | 0.500000 | standby
1 | 192.168.12.252 | 5432 | 2 | 0.500000 | primary
(2 rows)
备注:切换成功!!!!!


----------------------------------切换步骤总结--------------------------
都是在同一台机器上的操作:

1、确保触发文件被注释掉
#trigger_file

2、关闭主库db
pg_ctl -m fast stop
pg_controldata |grep cluster --查看状态(主 shut down ,从 in production--变成了新主)
psql -h 192.168.12.240 -p 9999 -U pgpool pgpool
show pool_nodes;
node_id | hostname | port | status | lb_weight | role
---------+----------------+------+--------+-----------+---------
0 | 192.168.12.251 | 5432 | 2 | 0.500000 | primary --新主
1 | 192.168.12.252 | 5432 | 3 | 0.500000 | standby --新从
(2 rows)


3、将新从添加到pgpool
mv recovery.done recovery.conf --修改文件名
pg_ctl -D /pgtina/data start --启动新从库
/pgpool/bin/pcp_attach_node -d 5 pgtest02 9898 postgres test12 1 --注意最后的nodeid和主机名都要对应修改(0,1)
/pgpool/bin/pcp_attach_node -d 5 pgtest01 9898 postgres test12 0

正常情况下,这样就基本切换成功。vip已经可以自己漂移了

4、如果pgpool状态不正常,那么一定要重启一下pgpool
/pgpool/bin/pgpool -m fast stop
/pgpool/bin/pgpool -n -d -D> /tmp/pgpool.log 2>&1 &


[postgres@pgtest02 ~]$ The authenticity of host '192.168.12.252 (192.168.12.252)' can't be established. --切换总是会遇到这个报错:
RSA key fingerprint is ad:09:f3:ce:a7:95:c1:e6:39:20:cb:4c:92:13:c0:d2.
Are you sure you want to continue connecting (yes/no)? ------一定要保证root和pg用户都能ssh到自身和对方主机


-----------------------------------------------------------------------
2 关pgpool master,测试vip的漂移

注意:此时12.252是主库,12.251是从库,我们去看看之前pgadmin的那个连接,是否能读写,看连的是主是从,设置的192.168.12.240---5432
insert into t1 values(999,00,00) ---报错:ERROR: cannot execute INSERT in a read-only transaction --说明没有自动漂移到12.252上面


说明:1、主从的切换,是停主库pg_ctl -D /pgtina/data stop,pgpool会把从库自动变成主库,再对主库做pcp_attach_node。
2、vip的漂移,是将新从库上的pgpool关闭重启,使它漂移到新主库上去。

[postgres@pgtest01 pg_log]$ /pgpool/bin/pgpool -m fast stop

从12.29连接过来,发现两个端口都可以连接到数据库操作。
# psql -h 192.168.12.240 -U postgres postgres -p 9999 --使用这个端口连接的是pgpool控制台,使用5432就会连接到数据库操作
tina=# insert into t1 values (9,10,10);
INSERT 0 1

[postgres@pgtest01 data]$ grep ^[a-z] pg_hba.conf
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
host all all 192.168.12.252/24 trust ---限定192.168.12开头的都可以连接进来,要让192.168.12.240可以连接才行。
host all all 0.0.0.0/0 md5
host all all 192.168.10.100/32 md5
host replication repluser 192.168.12.252/32 md5

pgpool VIP :192.168.12.240 从12.251飘到12.252,注意此时仅 pgpool 的 VIP 飘移, db1,db2 上的数据库角色不变, pgpool 的切换非常容易,直接关闭新备库的pgpool


[postgres@pgtest02 data]$ psql -h 192.168.12.240 -p 9999 -U postgres postgres
psql: ERROR: unable to read message length
DETAIL: message length (12) in slot 1 does not match with slot 0(8) ---因为ip被限制了,连接不上。

3 db1 掉电 power off
这里通过 vmwaer 执行 power off 模拟断电的情况, 在 db1(现在的 Primary 节点) 执行 power off ,发现 pgpool VIP 能切换到 db1 ,同时 db1 上的数据库切换成 primary ,切换成功。

第二种,第三种情况就不贴详细日志了。


===========================用户密码认证登陆测试===================
psql: ERROR: MD5 authentication is unsupported in replication, master-slave and parallel modes. ---需要对12.252完全开放
HINT: check pg_hba.conf

注意以下三个文件:
/pgtina/data/pg_hba.conf
/pgpool/etc/pool_hba.conf
/pgpool/etc/pcp.conf
/pgpool/etc/pool_passwd
[postgres@pgtest02 data]$ grep ^[a-z] pg_hba.conf
local all all trust ---本地不要使用md5,因为需要进行cron的一些任务
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
host all all 0.0.0.0/0 md5 --全网都必须通过md5认证连进db
host replication repluser 192.168.12.251/32 md5

[postgres@pgtest02 etc]$ grep ^[a-z] pool_hba.conf
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
host all all 0.0.0.0/0 md5 ----全网都必须通过md5认证连进pgpool

[postgres@pgtest02 etc]$ grep ^[a-z] pcp.conf ----/pgpool/bin/pg_md5 -u postgres -p
postgres:60474c9c10d7142b7508ce7a50acf414
sqluser:d4f1362367d199a64af12b86efee4a09
fenxi:e020da2d9ffa07b8cbaef98663b48fc6
pgpool:fa039bd52c3b2090d86b0904021a5e33

[postgres@pgtest01 etc]$ /pgpool/bin/pg_md5 -m -u postgres -p ---输入数据库密码
password:
[postgres@pgtest01 etc]$ tail pool_passwd --自动写入的
postgres:md503416eb55cdf9cd532c638f12c1918ea

---终于成功使用密码登陆,无密码拒绝访问192.168.12.240:9999 或者251:9999 252:9999
---无密码拒绝访问251:5432 252:5432 但是12.240:5432却可以无密码连接进来!!!(不知道是不是因为5432是db的端口,9999是pgpool的端口

添加一些其他用户:sqluser fenxi pgpool
/pgpool/bin/pg_md5 -m -u fenxi -p
/pgpool/bin/pg_md5 -m -u sqluser -p
=========================================================================================================================================
su postgres
createuser -p 5432 pgpool //在本地的postgresql数据库创建pgpool用户
tina=# create user pgpool login encrypted password 'pgpool123' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
createdb -p 5432 -O pgpool pgpool //在本地的postgresql数据库创建pgpool数据库,所有者为pgpool

[postgres@pgtest02 etc]$ createdb -p 5432 -O pgpool pgpool
[postgres@pgtest02 etc]$ psql -f /pgpool/share/pgpool-II/system_db.sql -U pgpool pgpool
psql:/pgpool/share/pgpool-II/system_db.sql:3: ERROR: schema "pgpool_catalog" does not exist
psql:/pgpool/share/pgpool-II/system_db.sql:4: ERROR: schema "pgpool_catalog" does not exist
psql:/pgpool/share/pgpool-II/system_db.sql:5: ERROR: schema "pgpool_catalog" does not exist
psql:/pgpool/share/pgpool-II/system_db.sql:6: ERROR: schema "pgpool_catalog" does not exist
CREATE SCHEMA
CREATE TABLE
CREATE TABLE
CREATE TABLE

pgpool=# select tablename from pg_tables where schemaname='pgpool_catalog';
tablename
---------------
replicate_def
dist_def
query_cache

///////////////////////////////////////////////////////
///////////////////////////////////////////////////////

使用触发文件进行主从切换-----可能这种方式不太严谨,而且也不利于来回切换:
主库故障后,备库切换成主库的触发文件如下:
# more failover_stream.sh
#! /bin/sh
# Failover command for streaming replication.
# This script assumes that DB node 0 is primary, and 1 is standby.
#
# If standby goes down, do nothing. If primary goes down, create a
# trigger file so that standby takes over primary node.
#
# Arguments: $1: failed node id. $2: new master hostname. $3: path to
# trigger file.
failed_node=$1
new_master=$2
trigger_file=$3
# Do nothing if standby goes down.
if [ $failed_node = 1 ]; then
exit 0;
fi
# Create the trigger file.
/usr/bin/ssh -T $new_master /bin/touch $trigger_file
exit 0;

因此,在pg的postgresql.conf中要贺pgpool参数文件的定义( /postgres/data/trigger.file)一致


不指定-h ,只指定-p 9999 就可以连上主库,而不是本地,指定了5432,那就连到本地只读库了。
[postgres@pgtest01 ~]$ psql -p 5432 -U postgres -d postgres
psql (9.4.5)
Type "help" for help.

postgres=# \c tina
You are now connected to database "tina" as user "postgres".
tina=# insert into t1 values(100,100,100);
ERROR: cannot execute INSERT in a read-only transaction




//////////////////////////////////////////部分参数含义////////////////////////////////////////////
我们需要设置用于 pgpool-II 的后台 PostgreSQL 服务器了。这些服务器可以与 pgpool-II 在同一台主机上,也可以在独立的主机上。
如果你决定将所有服务器都放在同一台主机上,必须为每个服务分配不同的端口。如果服务器被安置在不同的机器上,他 们必须被正确以便可以通过网络接受 pgpool-II 的连接。
在本教程中,我们将三台服务器放在与 pgpool-II 相同的机器上,分别给它们分配端口号 5432,5433,5434。要配置 pgpool-II,请如下编辑 pgpool.conf。
backend_hostname0 = 'localhost'
backend_port0 = 5432
backend_weight0 = 1
backend_hostname1 = 'localhost'
backend_port1 = 5433
backend_weight1 = 1
backend_hostname2 = 'localhost'
backend_port2 = 5434
backend_weight2 = 1
分别为 backend_hostname,backend_port,backend_weight 设置节点的主机名,端口号和负载均衡系数。在每个参数串的后面,
必须通过添加从0开始(例如 0,1,2,…)的整数来指出节点编号。
backend_weight 参数都为 1 ,这意味着 SELECT 查询被平均分配到三台服务器上。


$ pgpool -n 2>&1 | /usr/local/apache2/bin/rotatelogs \ -l -f /var/log/pgpool/pgpool.log.%A 86400 &
这将生成名称类似于 “pgpool.log.Thursday” 的日志文件,然后在每天午夜 00:00 轮换日志文件。如果日志文件已经存在,
rotatelogs 将追加日志到这个文件中。如果想在轮换前删除旧日志文件,你可以使用 cron:
55 23 * * * /usr/bin/find /var/log/pgpool -type f -mtime +5 -exec /bin/rm -f '{}' \;


--------------------------
pgpool-II 通过 SHOW 命令提供一些信息。SHOW 是一个真实的 SQL 语句, 但是如果该命令查询 pgpool-II 信息的话,pgpool-II 解释了该命令。可选项如下:

pool_status, 获取配置
pool_nodes, 获取节点信息
pool_processes, 获取pgPool-II 进程信息
pool_pools, 获取pgPool-II 所有的连接池信息
pool_version, 获取pgPool_II 版本信息
注意:术语 'pool' 指的是一个 pgpool 进程所拥有的 PostgreSQL 会话池,并非指所有的 pgpool 所拥有的会话。

SQL语句中的 "pool_status" 在以前的版本中已经存在,但是其它可选项在 3.0 中才出现。


-----------------------------------------
pgpool的日志---增长太快,需要轮换,以便删除

APACHE的安装
软件:httpd-2.0.64.tar.bz2 系统:RHEL5.5
apache现在分为两个版本1.x和2.x,下载地址:http://httpd.apache.org/
解压:
# tar xvf httpd-2.0.64.tar.bz2
配置:
# ./configure --prefix=/opt/apache2
/opt/apache2为安装目录
安装:
# make && make install
启动:
# /opt/apache2/bin/apachectl start
停止:
# /opt/apache2/bin/apachectl stop

如果你需要切换日志文件,可以将日志传递到一个支持日志轮换功能的外部命令。例如,你可以使用 Apache2 带的 rotatelogs 工具。
$ pgpool -n 2>&1 | /usr/local/apache2/bin/rotatelogs \ -l -f /var/log/pgpool/pgpool.log.%A 86400 &
-f 选项让 rotatelogs 在启动的时候生成一个日志文件,这个功能随 apache 2.2.9 或更高版本提供。
这将生成名称类似于 “pgpool.log.Thursday” 的日志文件,然后在每天午夜 00:00 轮换日志文件。如果日志文件已经存在,rotatelogs 将追加日志到这个文件中。

如果想在轮换前删除旧日志文件,你可以使用 cron:
55 23 * * * /usr/bin/find /var/log/pgpool -type f -mtime +5 -exec /bin/rm -f '{}' \;

apache中的cronolog 对你可能有用。
$ pgpool -n 2>&1 | /usr/sbin/cronolog \ --hardlink=/var/log/pgsql/pgpool.log \ '/var/log/pgsql/%Y-%m-%d-pgpool.log' &

可以新建一个专门存放poollog的目录,以便删除:(并不需要启动apache,只是利用这个自带工具而已) ---最新的pgpool启动命令
/pgpool/bin/pgpool -n -d 2>&1 | /opt/apache2/bin/rotatelogs -l /tmp/pgpool.log.%Y%m%d 86400 &

最后生成的日志格式:/tmp/pgpool.log.20151124


?转义符 描述
%a 简写的星期名
%A 全写的星期名
%b 简写的月名
%B 全写的月名
%c 日期与时间
%d 一月中的天,01-31
%H 时,00-23
%I 12小时时钟表示的小时,01-12
%j 一年中的天,001-366
%m 一年中的月,01-12
%M 分,00-59
%P a.m或p.m
%S 秒,00-61
%u 星期中的天,1-7(星期1为1)
%U 一年中的星期,01-53(星期日为一个星期的第一天)
%V 一年中的星期,01-53(星期一为一个星期的第一天)
%w 一个星期中的天,0-6(星期日为0)
%x 本地格式日期
%X 本地格式时间
%y 小于1900的年号
%Y 年
%Z 时区名字
%% A%字符
---------------------------

PCP 命令列表

PCP 命令是UNIX命令,通过网络操作pgpool-II。

* pcp_node_count - 获取节点数量
* pcp_node_info - 获取节点信息
* pcp_proc_count - 获取进程列表
* pcp_proc_info - 获取进程信息
* pcp_systemdb_info - 获取System DB信息
* pcp_detach_node - 从pgpool-II分离一个节点
* pcp_attach_node - 给pgpool-II关联一个节点
* pcp_promote_node - 给pgpool-II提升一个新的master节点
* pcp_stop_pgpool - 停止 pgpool-II


其中一个点的参数设置:
listen_addresses = '*'
port = 9999
socket_dir = '/tmp'
listen_backlog_multiplier = 2
pcp_listen_addresses = '*'
pcp_port = 9898
pcp_socket_dir = '/tmp'
backend_hostname0 = '192.168.12.251'
backend_port0 = 5432
backend_weight0 = 1
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_hostname1 = '192.168.12.252'
backend_port1 = 5432
backend_weight1 = 1
backend_flag1 = 'ALLOW_TO_FAILOVER'
enable_pool_hba = on
pool_passwd = 'pool_passwd'
authentication_timeout = 60
ssl = off
num_init_children = 32
max_pool = 4
child_life_time = 300
child_max_connections = 0
connection_life_time = 0
client_idle_limit = 0
log_destination = 'syslog'
log_line_prefix = '%t: pid %p: ' # printf-style string to output at beginning of each log line.
log_connections = on
log_hostname = on
log_statement = on
log_per_node_statement = off
log_standby_delay = 'none'
syslog_facility = 'LOCAL0'
syslog_ident = 'pgpool'
debug_level = 0
pid_file_name = '/pgpool/pgpool.pid'
logdir = '/pgpool/log'
connection_cache = on
reset_query_list = 'ABORT; DISCARD ALL'
replication_mode = off
replicate_select = off
insert_lock = on
lobj_lock_table = ''
replication_stop_on_mismatch = off
failover_if_affected_tuples_mismatch = off
load_balance_mode = on
ignore_leading_white_space = on
white_function_list = ''
black_function_list = 'nextval,setval,nextval,setval'
database_redirect_preference_list = ''
app_name_redirect_preference_list = ''
allow_sql_comments = off
master_slave_mode = on
master_slave_sub_mode = 'stream'
sr_check_period = 5
sr_check_user = 'repluser'
sr_check_password = 'repluser'
delay_threshold = 16000
follow_master_command = ''
health_check_period = 5
health_check_timeout = 20
health_check_user = 'repluser'
health_check_password = 'repluser'
health_check_max_retries = 3
health_check_retry_delay = 1
connect_timeout = 10000
failover_command = '/pgpool/failover_stream.sh %H '
failback_command = ''
fail_over_on_backend_error = on
search_primary_node_timeout = 10
recovery_user = 'nobody'
recovery_password = ''
recovery_1st_stage_command = ''
recovery_2nd_stage_command = ''
recovery_timeout = 90
client_idle_limit_in_recovery = 0
use_watchdog = on
trusted_servers = ''
ping_path = '/bin'
wd_hostname = '192.168.12.251'
wd_port = 9000
wd_authkey = ''
delegate_IP = '192.168.12.240'
ifconfig_path = '/sbin'
if_up_cmd = 'ifconfig eth0:0 inet $_IP_$ netmask 255.255.255.0'
if_down_cmd = 'ifconfig eth0:0 down'
arping_path = '/usr/sbin' # arping command path
arping_cmd = 'arping -U $_IP_$ -w 1'
clear_memqcache_on_escalation = on
wd_escalation_command = ''
wd_lifecheck_method = 'heartbeat'
wd_interval = 10
wd_heartbeat_port = 9694
wd_heartbeat_keepalive = 2
wd_heartbeat_deadtime = 30
heartbeat_destination0 = '192.168.12.252'
heartbeat_destination_port0 = 9694
heartbeat_device0 = 'eth0'
wd_life_point = 3
wd_lifecheck_query = 'SELECT 1'
wd_lifecheck_dbname = 'template1'
wd_lifecheck_user = 'nobody'
wd_lifecheck_password = ''
other_pgpool_hostname0 = '192.168.12.252'
other_pgpool_port0 = 9999
other_wd_port0 = 9000
relcache_expire = 0
relcache_size = 256
check_temp_table = on
check_unlogged_table = on
memory_cache_enabled = off
memqcache_method = 'shmem'
memqcache_memcached_host = 'localhost'
memqcache_memcached_port = 11211
memqcache_total_size = 67108864
memqcache_max_num_cache = 1000000
memqcache_expire = 0
memqcache_auto_cache_invalidation = on
memqcache_maxcache = 409600
memqcache_cache_block_size = 1048576
memqcache_oiddir = '/var/log/pgpool/oiddir'
white_memqcache_table_list = ''
black_memqcache_table_list = ''
parallel_mode = off
pgpool2_hostname = ''
system_db_hostname = 'localhost'
system_db_port = 5432
system_db_dbname = 'pgpool'
system_db_schema = 'pgpool_catalog'
system_db_user = 'pgpool'
system_db_password = 'pgpool'

做了一个pgbouncer和pgpool的测试,过程省略

测试总结:
1)Pgbouncer的优点:
pgbouncer非常简单,也易于修改,当不需要使用的时候,直接停下pgbouncer,
修改pg的pg_hba.conf 允许所有主机通过md5方式连接db即可。
Host all all 0.0.0.0/0 md5
几乎对db无任何影响,它独立存在,安装使用时也不需要进行停库等操作,只需要在安装好之后,通知大家修改端口。
pgbouncer对性能的损耗也相对较小。

2)Pgbouncer的缺点:
Pgbouncer的功能单一,只有连接池一个功能,不能负载均衡。

3)pgpool的优点:
HA,可以在主节点挂掉的情况下,自动迁移,用户无感知;负载均衡,可以减轻主节点的压力,连接池,可以避免连接数过多造成db hang住,复制和并行暂不介绍

4)pgpool的缺点:
性能损耗严重,连接池的功能不如pgbouncer,不算稳定,出问题的概率比较大
[/size]

你可能感兴趣的