简介
连接池
pgpool-II 保持已经连接到 PostgreSQL 服务器的连接,并在使用相同参数(例如:用户名,数据库,协议版本)连接进来时重用它们。它减少了连接开销,并增加了系统的总体吞吐量。
复制
pgpool-II 可以管理多个 PostgreSQL 服务器。激活复制功能并使在2台或者更多 PostgreSQL 节点中建立一个实时备份成为可能,这样,如果其中一台节点失效,服务可以不被中断继续运行。
负载均衡
如果数据库进行了复制,则在任何一台服务器中执行一个 SELECT 查询将返回相同的结果。pgpool-II 利用了复制的功能以降低每台 PostgreSQL 服务器的负载。它通过分发 SELECT 查询到所有可用的服务器中,增强了系统的整体吞吐量。在理想的情况下,读性能应该和 PostgreSQL 服务器的数量成正比。负载均很功能在有大量用户同时执行很多只读查询的场景中工作的效果最好。
限制超过限度的连接
PostgreSQL 会限制当前的最大连接数,当到达这个数量时,新的连接将被拒绝。增加这个最大连接数会增加资源消耗并且对系统的全局性能有一定的负面影响。pgpoo-II 也支持限制最大连接数,但它的做法是将连接放入队列,而不是立即返回一个错误。
并行查询
使用并行查询时,数据可以被分割到多台服务器上,所以一个查询可以在多台服务器上同时执行,以减少总体执行时间。并行查询在查询大规模数据的时候非常有效。
运行的几种模式
Pgpool-II有四种不同的运行模式:流式复制模式、逻辑复制模式、主从模式(slony模式)、本地复制模式和原始模式。在任何模式下,Pgpool-II都提供了连接池和自动故障切换功能。在线恢复只能与流式复制模式和本地复制模式一起使用。这些模式是相互排斥的,启动服务器后不能更改。你应该在设计系统的早期阶段就决定使用哪种模式。如果你不确定,建议使用流式复制模式。
- pgpool.conf.sample-stream流式复制模式可用于操作流式复制的PostgreSQL服务器。在这种模式下,PostgreSQL负责同步数据库。
- pgpool.conf.sample-replication逻辑复制模式可以与操作逻辑复制的PostgreSQL服务器一起使用。在该模式下,PostgreSQL负责同步表。在该模式下可以进行负载均衡。由于逻辑复制并不复制所有的表,所以用户有责任复制可以负载均衡的表。Pgpool-II会对所有表进行负载均衡。这意味着如果一张表没有被复制,Pgpool-II可能会在用户端查找过时的表。
- pgpool.conf.sample-master-slave主从模式模式(slony模式)可以与运行Slony的PostgreSQL服务器一起使用。在这种模式下,Slony/PostgreSQL负责同步数据库。
- pgpool.conf.sample-logical在本地复制模式下,Pgpool-II负责同步数据库。该模式的优势在于同步是以同步的方式进行的:对数据库的写入直到所有PostgreSQL服务器完成写入操作才返回。然而,你可以使用PostgreSQL 9.6或更高版本,在流式复制中设置synchronous_commit = remote_apply,就能得到类似的效果。
配置说明 主从+负载均衡 pgpool.conf
listen_addresses = '*' 对外的暴露配置
port = 9998
backend_hostname0 = '127.0.0.1' 1库的配置
backend_port0 = 5433
backend_weight0 = 1
backend_data_directory0 = '/var/lib/postgresql/12/main' 数据目录
backend_hostname1 = '127.0.0.1'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/postgresql/12/main'
master_slave_mode = on 开启主从模式
master_slave_sub_mode = 'stream' 主从模式类型为流复制
log_statement = on
log_per_node_statement = on
pid_file_name = '/usr/local/pgpool/pgpool.pid'
logdir = '/usr/local/pgpool/log'
log_connections = on
log_hostname = on
debug_level = 1
failover_command = '错误转移命令'
sr_check_user = 'postgres'
delay_threshold = 10000
FAQ
- 负责均衡必须在复制的基础上
- 主从模式跟复制不能同时开启
- 负载均衡可以从语句阶段负载 也可以在会话阶段 statement_level_load_balance