Pgpool 官网
What is Pgpool-II
是一个PG server和PG db 客户端之间的中间件。
- 可以建立连接池,保存连接,复用这些重复的连接。
- 管理多个PG server。使用replication 函数建立实施备份在两个或多个地方,为了服务不熟影响。
- 负载均衡。Pgpool-II利用复制特性的优势,在多个服务器之间分配选择查询来降低每个PG server的负载。
- 管理最大连接,最大连接之外的连接会排队,不会被立刻返回错误。
1. 下载
# wget http://www.pgpool.net/download.php?f=pgpool-II-3.7.4.tar.gz
下载之后的文件名可能有点小问题,改一下。
# mv download.php\?f\=pgpool-II-3.7.4.tar.gz pgpool-II-3.7.4.tar.gz
# tar -zxvf pgpool-II-3.7.4.tar.gz
2. 安装
# cd pgpool-II-3.7.4
# ./configure
# make
# make install
3. 配置
# cd /usr/local/etc/
# cp pgpool.conf.sample pgpool.conf
# vim pgpool.conf
listen_addresses = '*'
port = 9999
backend_data_directory0 = '/usr/local/pgsql/data'
# cp pcp.conf.sample pcp.conf
通过pg_md5获取一个加密的密码,写入到pcp.conf文件中
# pg_md5 mytest
a599d36c4c7a71ddcc1bc7259a15ac3a
# vim pcp.conf
mytest:a599d36c4c7a71ddcc1bc7259a15ac3a ### USERID:MD5PASSWD
配置数据库节点
# vim pgpool.conf
backend_hostname0 = 'localhost'
# Host name or IP address to connect to for backend 0
backend_port0 = 5432
# Port number for backend 0
backend_weight0 = 1
# Weight for backend 0 (only in load balancing mode)
backend_data_directory0 = '/usr/local/pgsql/data'
# Data directory for backend 0
backend_flag0 = 'ALLOW_TO_FAILOVER'
# Controls various backend behavior
# ALLOW_TO_FAILOVER, DISALLOW_TO_FAILOVER
# or ALWAYS_MASTER
backend_hostname1 = 'dbw21as'
backend_port1 = 5433
backend_weight1 = 1
backend_data_directory1 = '/usr/local/pgsql/data2'
backend_flag1 = 'ALLOW_TO_FAILOVER'
4. 启动/停止
启动的时候会在/var/run/pgpool/中创建pid文件,所以如果没有文件夹需要建立。
# pgpool
执行成功,但不打印之日。
如果想要打日志,就要执行,-d 启用调试信息。
pgpool -n -d > /var/log/pgpool/pgpool.log 2>&1 &
生成名称类似于 “pgpool.log.Thursday” 的日志文件,然后在每天午夜 00:00 轮换日志文件。
pgpool -n 2>&1 | /usr/local/apache2/bin/rotatelogs -l -f /var/log/pgpool/pgpool.log.%A 86400 &
停止:
关闭,如果有客户端连接就等待
# pgpool stop
如果还有客户端连接,强制关闭
# pgpool -m fast stop
#############################################################################
Runing Mode of Pgpool-II
在多个模式下,我们可以使用不同的配置文件模板,只需要更改简单的配置即可。
这些模式是互斥的,在启动服务器后不能更改。你应该在设计系统的早期做出决定。如果不确定,建议使用流复制模式。
1. streaming replication mode
/usr/local/etc/pgpool.conf.sample-stream
与PostgreSQL服务器一起使用流式复制。在这种模式下,PostgreSQL负责同步数据库。这种模式被广泛使用,也是推荐使用pgpool-II的方式。在模式中负载均衡.
2. logical replication mode
/usr/local/etc/pgpool.conf.sample-logical
与运行逻辑复制的PostgreSQL服务器一起使用。在这种模式下,PostgreSQL负责同步表。在模式中负载均衡。由于逻辑复制不复制所有表,因此用户有责任复制可负载平衡的表。PGPOLII负载平衡表所有表。这意味着如果一个表没有被复制,pgpool-II可能会在用户端查找过时的表。
3. master slave mode
/usr/local/etc/pgpool.conf.sample-master-slave
可用于操作Slony的PostgreSQL服务器。在这种模式下,PostgreSQL负责同步数据库。由于Slony-I正在被流复制所淘汰,除非使用特定的理由使用Slony,否则我们不建议使用这种模式。在模式中负载均衡.
4. native replication mode
/usr/local/etc/pgpool.conf.sample-replication
Pgpool-II 负责同步数据库。该模式的优点是同步方式是同步的:直到所有PostgreSQL服务器完成写入操作后,写入数据库才返回。但是,您可以使用PostgreSQL 9.6或更高版本获得类似的效果,在流复制中设置synchronous_commit = remote_apply,如果可以使用该设置,建议使用它代替本机复制模式,因为您可以避免在本机复制模式中的一些限制。由于PostgreSQL不提供跨节点快照控制,所以会话X可以在会话Y提交节点B上的数据之前看到会话Y提交的节点A上的数据。如果会话X尝试基于节点A上看到的数据更新节点B上的数据,那么节点A和节点A之间的数据一致性。B可能丢失了。为了避免这个问题,用户需要对数据发出显式锁定。这也是我们建议使用synchronous_commit = remote_apply的流复制模式的另一个原因。在模式中负载均衡.
5. raw mode
/usr/local/etc/pgpool.conf.sample
原始模式,最普通。
#############################################################################
测试native replication mode
1. 创建conf文件
cp pgpool.conf.sample-replication pgpool.conf
2. 配置数据库server
vim pgpool.conf
listen_addresses = '*'
backend_hostname0 = 'localhost'
# Host name or IP address to connect to for backend 0
backend_port0 = 5432
# Port number for backend 0
backend_weight0 = 1
# Weight for backend 0 (only in load balancing mode)
backend_data_directory0 = '/usr/local/pgsql/data'
# Data directory for backend 0
backend_flag0 = 'ALLOW_TO_FAILOVER'
# Controls various backend behavior
# ALLOW_TO_FAILOVER or DISALLOW_TO_FAILOVER
backend_hostname1 = 'dbw21ascom'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/usr/local/pgsql/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
3. 启动
pgpool -n -d > /var/log/pgpool/pgpool.log 2>&1 &
4.
$ psql -p 9999 -d test_0718 -c "create table test_0718_01(id int);"
$ psql -p 9999 -d test_0718 -c "insert into test_0718_01 values(1);"
INSERT 0 1
$ psql -p 9999 -d test_0718 -c "insert into test_0718_01 values(2);"
INSERT 0 1
到两个机器中的数据库查看
$ psql -U postgres -d test_0718 -h localhost -c "select * from test_0718_01;"
id
----
1
2
(2 rows)
$ psql -U postgres -d test_0718 -h dbw21as -c "select * from test_0718_01;"
id
----
1
2
(2 rows)