- 浏览: 244045 次
最新评论
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,不算稳定,出问题的概率比较大
连接池
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,不算稳定,出问题的概率比较大
发表评论
-
pg 锁
2016-01-14 16:26 0pg 锁 ... -
postgresql 的三类日志
2016-01-14 15:59 18539一、PostgreSQL有3种日志: 1)pg_log(数据 ... -
pg存储过程--创建分区表
2016-01-13 15:46 01)将普通表改成按时间字段分区表 调用select fun_c ... -
pg常用自制shell脚本-tina
2016-01-13 15:30 49531)小型监控: 1.在pg库主机上部署,每5分钟执行一次,插入 ... -
postgresql 时间类型和相关函数
2016-01-13 10:41 5471今天来好好学习一下postgresql涉及时间的字段类型和一些 ... -
pg 表空间
2016-01-07 16:28 3128一、说明 在数据库运维工作中,经常会有数据目录使用率较高 ... -
pg 定期vacuum和reindex
2016-01-07 14:56 8619定期vacuum和reindex: 一 ... -
pg 序列
2016-01-06 16:58 1625一、简介 一个序列对象通常用于为行或者表生成唯一的标识符。 ... -
pg 简单备份和恢复
2016-01-06 15:53 3772pg的备份和恢复 pg_dump ... -
ERROR: invalid page header in block 27073 of relation base/21078/45300926
2016-01-06 15:12 2147突然断网,检查后通知我们UPS断电,db所在主机重启 1、连上 ... -
pg_cancel_backend()和pg_terminate_backend()
2016-01-05 17:42 3556pg_cancel_backend()和pg_terminat ... -
canceling statement due to conflict with recovery
2016-01-05 17:12 1697报错: canceling statement due to ... -
postgresql dblink 使用
2015-12-31 14:33 2047dblink的使用 pg的跨库查询工具 select dbli ... -
root用户不能使用psql或者pg_dump等pg命令
2015-12-24 14:40 7048root用户不能使用psql或者pg_dump等pg命令 [ ... -
postgresql新建库2个常见报错
2015-12-22 16:43 6290今天使用pg建库发现两个报错: ERROR: new c ... -
安装postgresql 9.1.1
2015-12-22 16:25 642安装postgresql 9.1.1 ---版本自选,步骤相同 ... -
pgbadger监控安装和使用
2015-12-21 10:01 2036pgbadger监控安装和使用 https://github ... -
oracle,postgresql,mysql一些使用上的区别记录
2015-12-16 11:38 01.限制行数: select * from ta where ... -
postgresql存储过程实例:已审核证书存入临时表
2015-12-14 16:44 656存储过程实例: 需求: 思路:建立存储过程 代码逻辑: 1 ... -
pg 函数sfa_tmp_sleep()执行越来越慢-sql分析
2015-12-11 09:48 680pg 函数sfa_tmp_sleep()执行越来越慢 ...
相关推荐
【Postgres主从流复制+pgpool高可用方案】 一、方案介绍 1. 方案综述 在数据库系统中,高可用性是至关重要的,它确保即使在硬件故障或其他异常情况下,服务也能不间断地运行。PostgreSQL 提供了一种名为“流复制...
在 PostgreSQL 15 版本中,为了实现高可用性和负载均衡,我们通常会使用 pgPool II 这一中间件来配置主从集群。pgPool II 允许我们连接多个 PostgreSQL 数据库实例,并在它们之间智能地分配工作负载,同时提供故障...
在文档的【部分内容】中,作者介绍了在Ubuntu环境下如何安装和配置PostgreSQL以及pgpool,以及如何设置流复制模式的详细步骤: 1. 首先进行PostgreSQL数据库的安装,包括基本的PostgreSQL服务、开发包以及相关的库...
【pg+pgpool+Ubuntu实现分布式流复制模式】 在PostgreSQL数据库系统中,分布式流复制是一种高可用性和扩展性的解决方案,它可以确保数据在多个服务器之间实时同步,从而提供冗余和故障转移的能力。本文档主要介绍了...
### 分布式流复制模式实现:pg + pgpool + Ubuntu 本篇文档旨在详细介绍如何通过PostgreSQL(简称pg)、pgpool-II与Ubuntu操作系统构建一个基于流复制技术的分布式数据库系统。这种架构能够有效提高系统的可用性和...
本文档主要介绍了如何在Ubuntu操作系统上利用PostgreSQL和pgpool实现分布式流复制模式,这是一种用于提高数据可用性和容错性的架构。以下是详细的知识点解释: 1. **PostgreSQL安装与配置**: - 使用`apt-get`命令...
本文档主要介绍了如何在Ubuntu环境下,结合pgpool实现PostgreSQL的分布式流复制模式,这是一种用于高可用性和负载均衡的架构。 首先,我们要安装PostgreSQL 9.1版本及相关组件。这包括主程序、贡献模块、开发库以及...
pgpool-II使用指南-安装与配置.htm
本教程将深入讲解PostgreSQL数据库工程师所需的技能,包括主从复制、高可用性(HA)以及集群架构等关键知识点。 1. **主从复制**: 主从复制是数据库高可用性的一种常见实现方式,它允许数据在主数据库(master)...
- **主从流复制环境**:在 DB1 和 DB2 上部署 PostgreSQL 9.4 主从流复制环境。 - **pgpool 安装与配置**:在 PGPOOL1 和 PGPOOL2 上安装 `pgpool-II` 并进行必要的配置。 #### 四、实验步骤 **4.1、准备 ...
该配置使用了流复制技术来实现主备热备, PGPool软件作为中间件,将主备PG节点加入集群,实现读写分离、负载均衡和HA故障自动切换。 知识点1:PG流复制 PG流复制是一种高可用性技术,用于实现数据库的主备热备。它...
【pgpool-II 入门教程】是一篇针对数据库管理和优化工具 pgpool-II 的教程,旨在指导用户如何安装、配置及利用 pgpool-II 进行并行查询和数据复制。pgpool-II 是一个开源软件,主要功能是提供 PostgreSQL 数据库的...
本文将详细介绍如何在CentOS 6.5环境下,通过pgpool与PostgreSQL结合,配置一个包含主库和多个备库的异步流复制集群。 首先,我们有三台服务器(db1, db2, db3),其中db1为主库,db2和db3为备库。每台服务器上都...
它位于PostgreSQL服务器及其客户端之间,提供连接池,负载平衡,自动故障转移和复制。TL; DRDocker撰写$ curl -sSL ...
通用配置涉及连接池模式、复制模式、主备模式、流复制和客户端认证等方面。特定模式的配置则关注如何根据实际需求优化配置文件。此外,还涉及部署方法、显示命令、在线恢复、备份、看门狗、故障排除、限制和参考信息...
本手册详细介绍了如何构建基于PostgreSQL数据库的高可用架构,通过主从流复制、pgpool的安装与配置以及pg_rman的备份恢复策略,确保数据的安全性和服务的连续性。方案适用于企业级项目实施,旨在提供清晰的操作指南...
2. 数据库主从复制:pgpool-II 支持配置主从复制环境,确保数据的一致性和高可用性。当主数据库出现故障时,可以无缝切换到从库,保证服务不间断。 3. 负载均衡:pgpool-II 可以根据策略将来自客户端的查询分散到多...
默认的运行模式是流复制模式。要求Python> = 3.6该角色与Ansible> = 2.10兼容,但尚未通过Ansible 3.x进行测试。 有关用于开发角色的详细依赖关系,请参见 。角色变量检出文件以检索此角色变量的扩展列表。依存关系...