pgpool 连接池使用文档
简述
pgpool 连接池采用进程模型,每个业务的连接,都会连接到pgpool的其中一个进程。
pgpool
|
V
—- 进程1 —-| —- 进程2 —- | —- 进程3 —-| —- num_init_children —-
|
V
poo1
poo2
max_pool
每个进程下,最多会建立max_pool 个到pg的连接。并建立 num_init_children 个进程。因此pgpool 与 pg 最多会建立 num_init_children * max_pool 个连接。而pgpool 最多会接收 num_init_children 个业务的连接。
因此当pg的连接数不够用的时候,可以减小max_pool的配置到1.否则会浪费很多的连接。
pgpool 只支持session级别的连接池功能,不支持其他级别。连接池会降低pg服务端启动pg进程时cpu/mem的消耗。因此如果业务是长连接,不是秒级别的连接后就断开,那么连接池是没有必要的。
若是该pgpool一直使用同一个database/username 连接该pgpool,那么根据缓存规则,将最多只有 num_init_children 个连接。因为缓存是根据database/username进行的。所以pgpool与pg的连接数量并非永远保持num_init_children * max_pool 个。
配置连接池
connection_cache
设置 on 启动连接池
max_pool
在pgpool子进程中缓存的最大连接数。当有新的连接使用相同的用户名连接到相同的数据库,pgpool将重用缓存的连接。如果不是,则 pgpool建立一个新的连接到 PostgreSQL。如果缓存的连接数达到了 max_pool,则最老的连接将被抛弃,并使用这个槽位来保存新的连接。
num_init_children
pgpool服务进程数。也是 pgpool支持的从客户端发起的最大并发连接数。如果超过 num_init_children 数的客户端尝试连接到 pgpool-II,它们将被阻塞(而不是拒绝连接),直到到任何一个 pgpool-II 进程的连接被关闭为止。最多有 2*num_init_children 可以被放入等待队列。
reset_query_list
PostgreSQL version | reset_query_list |
---|---|
7.1 or earlier | 'ABORT' |
7.2 to 8.2 | 'ABORT; RESET ALL; SET SESSION AUTHORIZATION DEFAULT' |
8.3 or later | 'ABORT; DISCARD ALL' |
connection_life_time
pgpool->pg 建立的连接,当该连接无人使用时,达到该秒数后,pgpool->pg的连接将被关闭。
child_life_time
pgpool子进程的生命周期,单位为秒。如果子进程空闲了这么多秒(没有业务连接到该进程),它将被终止,一个新的子进程将被创建。这个参数是用于应对内存泄露和其他不可预料错误的一个措施。默认值为 300 (5分钟)。0 将禁用本功能。
因为pgpool是进程模型,子进程退出后,该进程下max_pool个pgpool->pg的连接,将被关闭掉。
show pool_pools 会显示 (0:16 before process restarting) 还有多长时间,该进程会被终止。
client_idle_limit
当一个客户端在执行最后一条查询后如果空闲到了 client_idle_limit 秒数,到这个客户端的连接将被断开。
不论业务与pgpool的连接是处于事务中,还是非事务的idle状态,都会断开连接。断开 业务->pgpool 和 pgpool -> pg(max_pool个), 都会被断开, 不只是业务与pgpool的连接。
child_max_connections
当该子进程,接收到这么多次的连接时,将终止该进程,并重新启动一个进程。(该参数命名容易引起误解)。
比如 psql 连接,退出,假如设置的3, 那么执行第4次psql的时候,show pool_pools 会看到之前的进程已经退出,并启动了一个新的id的进程。
show pool_pools 通过 client_connection_count 列,可以看到该进程已经被连接了多少次。
查询指令
参数查询
lzzhang=# pgpool show max_pool;
max_pool
----------
2
(1 row)
设置参数
lzzhang=# PGPOOL SET client_idle_limit = 350;
SET
lzzhang=# PGPOOL SET client_idle_limit to default;
SET
只对当前连接有效
查询全部参数
lzzhang=# SHOW POOL_STATUS;
item | value | description
---------------------------------------+-----------------------------------------------------------------+---------------------------------------------------------------------------------
backend_clustering_mode | 1 | clustering mode
listen_addresses | localhost | host name(s) or IP address(es) to listen on
port | 9999 | pgpool accepting port number
unix_socket_directories | /tmp | pgpool socket directories
unix_socket_group | | owning user of the unix sockets
查询后端节点信息
lzzhang=# SHOW POOL_NODES;
node_id | hostname | port | status | pg_status | lb_weight | role | pg_role | select_cnt | load_balance_node | replication_delay | replication_state | replication_sync_state | last_status_change
---------+-----------+------+--------+-----------+-----------+---------+---------+------------+-------------------+-------------------+-------------------+------------------------+---------------------
0 | localhost | 5432 | up | unknown | 0.500000 | standby | unknown | 0 | true | 0 | | | 2024-01-03 14:46:02
(1 rows)
查询pgpool进程信息
lzzhang=# SHOW POOL_PROCESSES;
pool_pid | start_time | client_connection_count | database | username | backend_connection_time | pool_counter | status
----------+------------------------------------------------------+-------------------------+----------+----------+-------------------------+--------------+---------------------
1413184 | 2024-01-03 15:46:42 | 2 | lzzhang1 | lzzhang1 | 2024-01-03 15:53:16 | 1 | Idle
1413185 | 2024-01-03 15:46:42 (4:04 before process restarting) | 1 | | | | | Wait for connection
1413186 | 2024-01-03 15:46:42 | 2 | lzzhang | lzzhang | 2024-01-03 15:46:45 | 2 | Execute command
(3 rows)
每次返回 num_init_children 条数信息
status: 列可以看出,这个进程的是否有人使用
其余信息不是很重要,可以通过 https://www.pgpool.net/docs/latest/en/html/sql-show-pool-processes.html 获得
查看pgpool连接池信息
lzzhang2=> SHOW POOL_pools;
pool_pid | start_time | client_connection_count | pool_id | backend_id | database | username | backend_connection_time | client_connection_time | client_disconnection_time | cli
ent_idle_duration | majorversion | minorversion | pool_counter | pool_backendpid | pool_connected | status | load_balance_node
----------+------------------------------------------------------+-------------------------+---------+------------+----------+----------+-------------------------+------------------------+---------------------------+----
------------------+--------------+--------------+--------------+-----------------+----------------+---------------------+-------------------
1413184 | 2024-01-03 15:46:42 | 2 | 0 | 0 | lzzhang | lzzhang | 2024-01-03 15:48:08 | 2024-01-03 15:51:44 | 2024-01-03 15:51:56 | 0
| 3 | 0 | 2 | 1413295 | 0 | Idle | 0
1413184 | 2024-01-03 15:46:42 | 2 | 1 | 0 | lzzhang1 | lzzhang1 | 2024-01-03 15:53:16 | 2024-01-03 15:53:16 | | 0
| 3 | 0 | 1 | 1447750 | 1 | Idle | 1
1557612 | 2024-01-03 15:58:11 | 1 | 0 | 0 | lzzhang2 | lzzhang2 | 2024-01-03 16:03:30 | 2024-01-03 16:03:33 | 2024-01-03 16:03:32 | 0
| 3 | 0 | 2 | 1657383 | 1 | Execute command | 1
1557612 | 2024-01-03 15:58:11 | 1 | 1 | 0 | | | | | | 0
| 0 | 0 | 0 | 0 | 0 | Execute command | 0
1413186 | 2024-01-03 15:46:42 (2:32 before process restarting) | 3 | 0 | 0 | lzzhang | lzzhang | 2024-01-03 15:46:45 | 2024-01-03 15:53:40 | 2024-01-03 16:03:29 | 0
| 3 | 0 | 2 | 1413191 | 0 | Wait for connection | 0
1413186 | 2024-01-03 15:46:42 (2:32 before process restarting) | 3 | 1 | 0 | lzzhang1 | lzzhang1 | 2024-01-03 15:52:40 | 2024-01-03 15:52:40 | 2024-01-03 15:53:38 | 0
| 3 | 0 | 1 | 1433534 | 0 | Wait for connection | 0
(6 rows)
status:
Execute command: 正在执行命令
Idle: 等待客户端执行新的指令
Idle in transaction: 已经处于事务中,等待客户端的新的指令
Wait for connection: 等待客户端连接
已经建立到pg的连接database/username是非空的,若database/username是空的则该池没有建立到pgpool的连接
pool_pools 与 pool_processes 通过 pool_pid 进行关联。
pool_pools 中同一个pool_pid的条数与 max_pool 是相等的,所以可以查询到全部的缓存的信息
每次返回 num_init_children * max_pool * number_of_backends 信息,
更多内容可以参考: https://www.pgpool.net/docs/latest/en/html/sql-show-pool-pools.html
[CitusDB中国]站主,PostgreSQL粉丝,现从事Citus研发工作
愿Citus在中国发展的越来越好