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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介:
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  
[root@pgtest01 package]# wget http://192.168.10.100/pgpool-II-3.4.3.tar.gz 

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

[root@pgtest02 pgpool-II-3.4.3]# pwd 
/package/pgpool-II-3.4.3 
[root@pgtest01 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 <openssl/ssl.h> is required for SSL 

[root@pgtest01 pgpool-II-3.4.3]# yum install openssl 
[root@pgtest01 pgpool-II-3.4.3]# 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 中处理相同的表名会出现问题(临时表不会出问题)。 
[root@pgtest01 extension]# 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 

[root@pgtest01 extension]# 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. 

[root@pgtest01 pgpool-regclass]# cd /package/pgpool-II-3.4.3/src/sql 
[root@pgtest01 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 
[root@pgtest01 sql]# make 
make: pg_config: Command not found 
make: *** No targets.  Stop. 
[root@pgtest01 sql]# source /home/postgres/.bash_profile 
[root@pgtest01 sql]# make 
[root@pgtest01 sql]# make install 

[root@pgtest01 sql]# cd /pgtina/share/postgresql/extension/    --果然有了这些文件 
[root@pgtest01 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 ( 两节点操作) 
[root@pgtest02 sql]# cd /pgpool/etc/ 
[root@pgtest02 etc]# cp pcp.conf.sample pcp.conf 

[root@pgtest01 etc]# find / -name "pg_md5" 
/package/pgpool-II-3.4.3/src/tools/pgmd5/pg_md5 
/pgpool/bin/pg_md5 


[root@pgtest01 etc]# /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 执行权限 
[root@pgtest02 etc]# chmod u+s /sbin/ifconfig 
[root@pgtest02 etc]# chmod u+s /usr/sbin 
备注:  以理普通用户能够执行以上命令,  failover_command 命令要用到。 

--配置两节点信任关系 
[root@pgtest01 etc]# 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 
[root@pgtest01 etc]# cd /pgpool/etc 
[root@pgtest01 etc]# cp pgpool.conf.sample pgpool.conf 

--开启日志 
    在日志 /etc/rsyslog.conf  加入以下行 
# pgpool 
local0.*    /var/log/pgpool.log    
    
[root@pgtest01 etc]# vi /etc/rsyslog.conf 
[root@pgtest01 etc]# /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 

查看后台日志: 
[root@pgtest01 log]# 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上 

[root@pgtest01 pgpool]# chmod +x failover_stream.sh 
[root@pgtest01 pgpool]# 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; 
[root@pgtest01 pgpool]# echo $PGHOME 
添加环境变量 
[root@pgtest01 pgpool]# 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连接过来,发现两个端口都可以连接到数据库操作。 
[root@antiywh-5NMQMH1 ~]# 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 

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

使用触发文件进行主从切换-----可能这种方式不太严谨,而且也不利于来回切换: 
主库故障后,备库切换成主库的触发文件如下: 
[root@pgtest6 pgpool-II-pg93]# 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/ 
解压: 
[root@localhost soft]# tar xvf httpd-2.0.64.tar.bz2 
配置: 
[root@localhost httpd-2.0.64]# ./configure --prefix=/opt/apache2    
/opt/apache2为安装目录 
安装: 
[root@localhost httpd-2.0.64]# make && make install 
启动: 
[root@localhost /]# /opt/apache2/bin/apachectl start 
停止: 
[root@localhost /]# /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,不算稳定,出问题的概率比较大 
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
SQL 关系型数据库 测试技术
timescaleDB双机热备流复制与测试
最近有项目要用到热备功能,timescaledb只能兼容pg的流复制,不能兼容其他的复制策略,所以这里我们采用pg的流复制功能镜像部署,并进行了一些测试
879 0
|
4月前
|
关系型数据库 数据库 PostgreSQL
[postgres]配置主从异步流复制
[postgres]配置主从异步流复制
|
jenkins Java 持续交付
jenkins主从模式配置
jenkins主从模式配置
252 0
jenkins主从模式配置
|
SQL 存储 关系型数据库
PostgreSQL 流复制搭建主从环境,同步和异步的解释,压力测试,主从角色切换|学习笔记
快速学习PostgreSQL 流复制搭建主从环境,同步和异步的解释,压力测试,主从角色切换
PostgreSQL 流复制搭建主从环境,同步和异步的解释,压力测试,主从角色切换|学习笔记
|
关系型数据库 网络安全 数据库
PGPool-II+PG流复制实现HA主备切换
基于PG的流复制能实现热备切换,但是是要手动建立触发文件实现,对于一些HA场景来说,需要当主机down了后,备机自动切换,经查询资料知道pgpool-II可以实现这种功能。
3044 0
|
存储 监控 安全
lsyncd 配合 rsync 实时差异同步节点文件
lsyncd 配合 rsync 实时差异同步节点文件
471 0
LXJ
|
关系型数据库 Shell 数据库
postgresql双机热备(流复制)及主备切换
postgresql双机热备(流复制)及主备切换
LXJ
2513 0
|
域名解析 关系型数据库 MySQL
MySQL高可用工具Orchestrator系列二:复制拓扑的发现
mysql高可用工具orchestrator系列文章
1005 0
|
关系型数据库 Linux 数据库
PostgreSQL数据库异步的流复制
一、虚拟主机安装 1.使用VMware虚拟机安装CentOS操作系统操作系统环境CentOS Linux release 7.2.1511 (Core) 软件选择 选择安装GNOME桌面 安装位置 选择自动分区 2.通过克隆的方式,生成主备两台主机。
1895 0
|
关系型数据库 数据库 PostgreSQL

热门文章

最新文章