IP | 应用 | 版本 |
---|---|---|
10.10.10.56 | postgresql | 9.2.15 |
10.10.10.57 | postgresql | 9.2.15 |
10.10.10.56 | pgpool-II | 3.5 |
环境说明:两台postgresql,pgpool和其中一台postgresql在一台服务器上。
测试需求:测试pgpool实现postgresql的复制和负载均衡
1.源码安装
wget http://www.pgpool.net/download.php?f=pgpool-II-3.5.3.tar.gz tar -zxvf pgpool-II-3.5.3.tar.gz cd pgpool-II-3.5.3 ./configure --prefix=/usr/local/pgpool --with-openssl #报错configure: error: libpq is not installed or libpq is old #安装 yum install postgresql-devel即可 make make install
2.安装pgpool-regclass
使用 PostgreSQL 8.0 至 PostgreSQL 9.3,强烈推荐在需要访问的 PostgreSQL 中安装 pgpool_regclass 函数,因为它被 pgpool-II 内部使用。 如果不这样做,在不同的 schema 中处理相同的表名会出现问题(临时表不会出问题);而PostgreSQL 9.4或更高版本则不需要
cd pgpool-II-3.5.3/src/sql/pgpool-regclass make make install -bash-4.2$ psql -f pgpool-regclass.sql template1 或 psql template1 =# CREATE EXTENSION pgpool_regclass;
应在每台通过 pgpool-II 访问的数据库中执行 pgpool-regclass.sql 或者 CREATE EXTENSION。 你不需要在你执行“psql -f pgpool-regclass.sql template1” 或者 CREATE EXTENSION 后建立的数据库中这么做, 因为这个模板数据库将被克隆成新建的数据库。
3.建立insert_lock表
如果你在复制模式中使用了 insert_lock ,强烈推荐建立 pgpool_catalog.insert_lock 表,用于互斥。 到现在为止,insert_lock 还能够工作。但是,在这种情况下,pgpool-II 需要锁定插入的目标表。 这种行为和 pgpool-II 2.2 和 2.3 系列类似。由于表锁与 VACUUM 冲突,所以 INSERT 操作可能因而等待很长时间。
cd pgpool-II-3.5.3/src/sql/ psql -f insert_lock.sql tempalte1
应在在每台通过 pgpool-II 访问的数据库中执行 insert_lock.sql。 你不需要在你执行“psql -f insert_lock.sql template1”后建立的数据库中这么做, 因为这个模板数据库将被克隆成新建的数据库。
4.安装pgpool_recovery
如果你使用在线回复,需要以下一些函数: pgpool_recovery, pgpool_remote_start, pgpool_switch_xlog。
另外,附带工具pgpoolAdmin 控制 pgpool-II 启停和重新连接后端的 PostgreSQL 节点, 它需要函数 pgpool_pgctl;而且 pgpoolAdmin 需要函数 pgpool_pgctl 来对 PostgreSQL 进行停止/重启/重新加载参数操作。
可以使用和安装 pgpool_regclass 一样的方法安装着四个函数。 不过和 pgpool_regclass 不同的是,你只需要在 template1 数据库中安装这些函数。
cd pgpool-II-3.5.3/src/sql/pgpool-recovery make make install psql -f pgpool-recovery.sql template1 或 psql template1 =# CREATE EXTENSION pgpool_recovery
1.配置pcp.conf
pgpool提供pcp接口,可以查看,管理pgpool的状态,并且可以远程操作pgpool,pcp.conf用来对pcp相关命令认证的文件
cd /usr/local/pgpool cp etc/pcp.conf.sample etc/pcp.conf bin/pg_md5 -m -u pgpool -p 会自动生成pool_passwd postgres:md533c14731dfdfsdfsdf91e8d10c4bff5 cat etc/pcp.conf pgpool:md533c14731dfdfsdfsdf91e8d10c4bff5
2.配置pool_hba.conf
通过pool_hba.conf可以进行相关权限设置,类似于postgresql的pg_hba.conf
cd /usr/local/pgpool cp etc/pool_hba.conf.sample etc/pool_hba.conf bin/pg_md5 -m -u postgres -p 会自动生成pool_passwd postgres:md533c14731dfdfsdfsdf91e8d10c4bff5
**注意:
1.pool_hba.conf中的加密方式必须和pg_hba.conf中的加密方式一样,都为mds、trust或其他方式。若不一样会报错。
2.pool_hba.conf中的用户必须在postgresql数据库中存在
**
3.配置pgpool.conf
cd /usr/local/pgpool cp etc/pgpool.conf.sample etc/pgpool.conf #创建相关目录 mkdir -p /var/run/pgpool mkdir -p /usr/local/pgpool/logs vim etc/pgpool.conf listen_addresses = '*' port = 9999 socket_dir = '/tmp' listen_backlog_multiplier = 2 serialize_accept = off pcp_listen_addresses = '*' pcp_port = 9898 pcp_socket_dir = '/tmp' backend_hostname0 = '10.10.10.56' backend_port0 = 5432 backend_weight0 = 1 backend_data_directory0 = '/data/pgsql/data' backend_flag0 = 'ALLOW_TO_FAILOVER' backend_hostname1 = '10.10.10.57' backend_port1 = 5432 backend_weight1 = 1 backend_data_directory1 = '/data/pgsql/data' backend_flag1 = 'ALLOW_TO_FAILOVER' enable_pool_hba = on pool_passwd = 'pool_passwd' debug_level = 0 pid_file_name = '/var/run/pgpool/pgpool.pid' logdir = '/usr/local/pgpool/logs' replication_mode = on load_balance_mode = on master_slave_mode = off
其中:
replication_mode = on 复制模式打开,可以在两台postgresql数据库上进行实时备份
load_balance_mode = on 负载均衡模式打开,可以实现负载均衡
3.启动pgpool
/usr/local/pgpool/bin/pgpool
4.连接pgpool
psql -U postgres -p 9999 -h 10.10.10.56 Password for user postgres: psql (9.2.15) Type "help" for help. postgres=#
1.创建bench_replication数据库
psql -U postgres -p 9999 -h 10.10.10.56 Password for user postgres: psql (9.2.15) Type "help" for help. postgres=#create database bench_replication;
我们可以分别登陆56、57上的postgresql进行查看
psql -U postgres -p 5432 -h 10.10.10.56 Password for user postgres: psql (9.2.15) Type "help" for help. postgres=# \list List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -------------------+----------+----------+-------------+-------------+----------------------- bench_replication | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (4 rows)
可以看到两台postgresql都创建了bench_replication数据库,因此pgpool的复制是成功的。
2.pgbench测试
#安装pgbench yum install postgresql-contrib pgbench -i -h 10.10.10.56 -U postgres -p 9999 bench_replication
在所有pgsql节点中,下面列出的表和数据都被建立了,说明复制运行正常。
表名 | 行数 |
---|---|
branches | 1 |
tellers | 10 |
accounts | 100000 |
history | 0 |
以上只是简单介绍了pgpool-II的复制和负载均衡作为入门,还有很多功能没有介绍,需要我们继续探索。
补充:pgpool使用中遇到的坑总结
最早时候使用的是复制模式,数据到pgpool然后pgpool分别写入n个postgres.发现经常出现数据不一致问题,导致最终只有一个数据库可用
基于PIRT的online recovery 配置复杂
这个用到postgres9的新特性,前期配置测试都很easy,failover 也很好用,但是当服务连接上pgpool时,事务往往报错 postgres error : failed to read kind from backend,这个我在之前的文章中提到过,至今无法解决。
num_init_children 原来理解成了一个池的大小,如果超过了会自动扩增,但是实际上往往不够用,确切的说该值也是 pgpool-II 支持的从客户端发起的最大并发连接数。
所以这个值配的尽量大些,并且对这个值的更改必须重启pgpool.
当一个客户端在执行最后一条查询后如果空闲到了 client_idle_limit 秒数, 到这个客户端的连接将被断开.连接不应该让pgpool来断开,应该是应用主动去断开。如果让pgpool去断开,会导致客户端不可用。
当然pgpool也有一个好处,能够快速找到连接的应用。因为每个连接都是单独的进程,所以启动后会有num_init_children 个进程可以接受连接
使用# ps -ef |grep pgpool 可以看到
pgpool: wait for connection request 的进程是空进程,等待连接。
pgpool: postgres dbtest 10.115.53.167(51883) idle 这些进程是使用中的进程,并且可以看到是来自哪台机器,什么用户,连接的是什么数据库。
当然使用select * from pg_stat_activity 也能查到 连接情况
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。