共计 2160 个字符,预计需要花费 6 分钟才能阅读完成。
作者:王志斌,曾取得中国 PostgreSQL 数据库治理工程师(PGCE),是 PostgreSQL 官网认证讲师,盘古云课堂特邀金牌讲师。
PgBouncer 具备三种可用的池模式:事务池,会话池和语句池:
事务连接池
数据库客户端很少在不间断的状况下执行间断的事务。而是通常在事务之间执行非数据库工作。这意味着服务器连贯在期待新工作达到时会破费大量工夫闲暇。
事务池模式试图缩小服务器连贯的闲暇工夫,如下所示:
- 池程序在开始事务时将服务器连贯调配给客户端。
- 客户端的事务实现后,池程序将开释连贯调配。
注意事项:
- 如果客户端运行多个事务,则每个事务能够在不同的服务器连贯上执行。
- 单个服务器连贯能够在其生命周期内运行由不同客户端收回的事务。
图 6 事务连接池
与服务器所容许的连贯相比,容许流动客户端的数量要多得多。只管取决于给定的工作负载,但常常会看到 10 倍或更多的流动客户端连贯与服务器连贯比率。
这的确带来了一个重要的正告:客户端不再冀望对数据库会话状态所做的更改在同一客户端进行的间断事务中持续存在,因为这些事务可能在不同的服务器连贯上运行。此外,如果客户端进行会话状态更改,它们可能并且很可能会影响其余客户端。
以下是一些应用下面的事务池示例:
- 如果客户端 1 在 T1 中的第一个服务器连贯上将会话设置为只读,而客户端 2 的 T3 是写事务,则 T3 将失败,因为它在当初的只读服务器连贯上运行。
- 如果客户端 1 运行 PREPARE a1 AS … 在 T1 上运行 EXECUTE a1 …,在 T2 上,则 T2 将失败,因为预编译语句对于运行 T1 的服务器连贯是本地的。
- 如果客户端 2 在 T3 中创立了一个长期表并尝试在 T4 中应用它,则 T4 将失败,因为该长期表对于运行 T3 的服务器连贯是本地的。
无关应用事务池时不反对的会话状态性能和操作的残缺列表,请参见 PgBouncer 的列表
会话连接池
调配给客户端的服务器连贯在客户端连贯的整个生命周期内继续。这看起来如同基本不应用连接池一样,然而有一个重要的区别:当调配的客户端断开连接时,服务器连贯不会被毁坏。当客户端断开连接时,池管理器将:
- 革除客户端所做的任何会话状态更改。
- 将服务器连贯返回到池中,以供其余客户端应用。
图 7 会话连接池
语句连接池
在此,服务器连贯调配仅在单个语句的持续时间内继续。这具备与事务池模式雷同的会话状态限度,同时还毁坏了事务语义。
图 8 语句连接池
这使得所有客户端连贯的行为就像在“主动提交”模式下一样。如果客户端尝试开始多语句事务,则合并程序将返回谬误。只管这是
表 3 连接池模式比照
从上述比照状况来看,在连接池的抉择上,须要根据业务环境特点来进行抉择,默认状况下举荐应用事务连接池,它兼顾了执行事务的个性,尤其多语句的反对,并且不会像会话连接池那样,尝尝处于期待状态。当然事务模式并不反对预编译语句。而依据具体业务场景的非凡须要,有些时候须要客户端与服务器端放弃连贯,或者反对预编译语句,这样只能抉择会话池模式。还有一些特例状况,某些业务场景只是单语句执行,那么语句池模式可能更适宜。因而比照这三种模式,能够发现从对客户端操作的反对水平来讲,会话池反对度最高,其次是事务池,最初是语句池模式。然而从反对的连接数来讲,可能刚好是相同的程序。
表 4 SQL 个性对照表
上表为会话连接池和事务连接池的 SQL 个性比照状况,能够通过比照具体业务场景与 SQL 个性的合乎度,来对连接池模式进行选型。
上面列举了一些示例场景:
- 有些只运行疾速查问,因而在没有事务的状况下能够共享一个会话来解决上百个并发查问。
- 一些角色成员对于会话级并发是平安的,并且总是应用事务。因而,他们能够平安地共享数百个并发事务的多个会话。
- 有些角色过于简单,无奈与其他人共享会话。因而,您对它们应用会话池模式能够防止当所有“插槽”都已占用时连贯谬误。
- 不要应用它代替 HAProxy 或其余负载均衡器。只管 pgbouncer 具备一些可配置的性能来解决负载均衡器要解决的问题,例如 dns_max_ttl,并且能够为其设置 DNS 配置,然而大多数产品环境都应用 HAProxy 或其余用于 HA 的负载均衡器。这是因为 HAProxy 的确善于以循环形式在服务器之间实现负载平衡,而不是 pgbouncer。只管 pgbouncer 对于 postgres 连接池更好,但最好应用一个小型守护程序来完满地执行一项工作,而不是应用较大的守护程序来实现两项工作,那样成果更糟。
在对于连接数的倡议值来讲,上文也给出了一个大抵的后果,就是个别状况下设置为 CPU 核数的 3 - 4 倍左右,当然这个不是绝对值,应该是在与业务场景相似的硬件环境中充沛进行测试后,才可能得出具体的数值。
还有一点须要留神的是连贯 Pgbouncer 的连贯形式,网络连接和 unix socket 连贯形式,较网络连接,unix socket 形式可能更加节俭网络通信的开销,因而如果 pgbouncer 和数据库在一台机器部署,能够优选该形式;如果处于不同服务器上,则抉择网络连接。
理解更多 PostgreSQL 热点资讯、新闻动态、精彩流动,请拜访中国 PostgreSQL 官方网站
解决更多 PostgreSQL 相干常识、技术、工作问题,请拜访中国 PostgreSQL 官网问答社区
下载更多 PostgreSQL 相干材料、工具、插件问题,请拜访中国 PostgreSQL 官网下载网站