Pgbouncer最佳实践之概念篇

了解更多Greenplum技术干货,欢迎访问Greenplum中文社区网站

Pgbouncer 是一款开源的轻量级数据库链接管理工具,能够缓存数据库链接,减小不断创建新数据库链接带来的性能损失。sql

PgBouncer能够直接用来管理Greenplum 的数据库链接。Greeplum的数据库安装包里面已包含它,用户能够直接使用。用户名和要链接的数据库组成key, PgBouncer 会为不一样的key建立不一样的链接池(每一个链接池中链接的用户和数据库是相同的),PgBouncer内部中可维护多个链接池。当客户端请求一个新链接的时,若对应的链接池中有空闲的链接,则直接复用,不然为其建立一个新的链接,但若是链接池中的链接数已到上限,则client端需等待;当客户端关闭链接的时候,PgBouncer 则把链接回收再利用。数据库

接下来咱们将经过系列文章来为你们讲解Pgbouncer的最佳实践,以及Pgbouncer在Greenplum中的应用。后端

使用PgBouncer 链接Greenplum的数据库和链接Postgres的用法同样, 只不过PgBouncer链接Greenplum的时候,链接的是master 节点。数组

PgBouncer包含psql-like的管理工具。有管理权限的用户使用psql 链接PgBouncer中虚拟的数据库pgbouncer, 可查看链接池中状态及管理PgBouncer。缓存

PgBouncer做为PostgreSQL数据库的链接池中间件。与其余存在于PostgreSQL的链接池中间件不一样,PgBouncer仅做为一个链接池和代理层为PostgreSQL和应用之间提供服务。服务器

Pgbouncer具有例如链接池模式、链接类型、端口重用,应用场景以及用户认证、网络认证等多种重要特性,下面将逐一讲述,并指望为读者提供一份在实施过程当中使用的配置指南。网络

数据库链接池在Pgbouncer中包括会话链接池、事务链接池、语句链接池三种方式。架构

一、会话链接池并发

官方解释为最有礼貌的方法。当客户端链接时,服务器链接将在其保持链接的整个过程当中分配给它。当客户端断开链接时,服务器链接将从新放入池中。此模式支持全部PostgeSQL功能。工具

二、事务链接池

服务器链接仅在事务期间分配给客户端。当PgBouncer发现事务已结束时,服务器链接将被放回池中。该模式破坏了PostgreSQL的一些基于会话的功能。仅当应用程序经过协做使用不中断功能时,才可使用它。有关不兼容的功能。

三、语句链接池

官方解释为最激进的方法。不容许多语句事务。本质上为了在客户端上强制执行“自动提交”模式,主要针对PL/Proxy。

另外支持其余特性包括:

  • 高性能,由于Pgbouncer自身不须要查看整个数据包,因此在网络开销上仅为2k(默认状况),对系统的内存要求小。
  • 部署灵活:Pgbouncer没有绑定到一台后端服务器。目标数据库能够驻留在不一样的主机上。
  • 可维护性强:支持大多数配置项的的在线从新配置;而且支持在线重启/升级,而不会断开客户端链接。
  • 认证灵活:用户认证支持基于文件的验证方式外,还提供了数据库查询验证;网络链接认证与Postgresql数据库一致,支持多种模式验证。
  • 灵活链接数:支持全局、数据库、用户和客户端链接数组合形式设置。

(注:文中未详细描述部分,请参见Pgbouncer[1]的官网相关文档,如配置手册、使用手册、FAQ等官方文档)

前面大体介绍了Pgbouncer的一些特性,详细特性请查阅(Pgbouncer官网),下面将针对使用Pgbouncer时的一些配置注意事项进行说明,为Pgbouncer的使用用户提供一个指引,知足复杂业务需求状况下充分利用Pgbouncer的特性来实现特定业务场景需求。

在对Pgbouncer进行配置的过程当中,须要特别关注链接池模式外,还须要明确数据链接数、链接方式,最后则是针对不一样业务场景的Pgbouncer部署形式。

首先讨论一下为何使用链接池[2],使用与不使用之间的性能差别,另外讨论链接池模式的工做流程、细节及一些注意事项进行阐述,最后提供一个适合的链接池建议。

在咱们进行Postgresql入门的时候,一般会看到这段介绍“PostgreSQL服务器能够处理来自客户端的多个并发链接。为此,它为每一个链接启动(“fork”)新进程,从那时起,客户端和新的服务器进程进行通讯,而无需原始postgres进程进行干预。所以,主服务器进程始终在运行,等待客户端链接,而客户端及关联的服务器进程来来每每。”可是,这意味着每一个新链接都会分叉一个新进程,保留在内存中,并可能在多个会话中变得过度繁忙。在业务量较小的状况下,这种方式基本能够知足要求,可是当业务量迅速激增,咱们可能就须要不断去更改max_connections来知足客户端的需求。当时一样也带来了很大的问题,如频繁的关闭和建立链接形成的内存开销,管理已产生的大量链接等等,最终致使服务器响应缓慢而没法对外提供数据库服务。在这样一个背景下,数据库链接池就被提出来了,对于使用Postgresql数据库来讲,通常分为客户端链接池,好比c3p0、druid等等;另一种则是服务器端链接池,例如pgbouncer、odyssey、pgpoolII等。

image

图 1 直连数据库服务器

这是没有链接池的PostgreSQL链接生命周期:

  1. 客户端经过请求并验证与服务器的链接来开始新会话。
  2. 服务器fork一个新的系统进程来处理链接和工做会话。会话状态是经过服务器级,数据库级和用户级配置参数的组合进行初始化的。
  3. 客户经过执行一个或多个事务来完成所需的工做。示例包括:
  • 针对关系(表,视图等)执行读写
  • 使用SET命令更改会话或事务状态
  • 准备并执行预编译语句
  1. 当客户端断开链接时,会话结束。
  2. 服务器销毁会话进程。

一个数据库会话包括全部经过单一链接的生命周期所作的工做。数据库会话的时间长度是可变的,而且在客户端和服务器上消耗的资源数量是可变的。

关键点在于:

  • 建立,管理和销毁链接过程会花费时间并消耗资源。
  • 随着服务器的链接数增长,管理这些链接所需的资源也随之增长。此外,随着客户端在服务器上进行处理,服务器的每一个进程内存使用量将继续增加。
  • 因为单个会话仅服务于单个客户端,所以客户端能够更改数据库会话的状态,并但愿这些更改在后续的事务中继续存在。

一个的链接池位于客户端和服务器之间。客户端链接到池管理器,而池管理器链接到服务器。引入链接池程序会将链接模型更改成客户端代理服务器架构:

image

图 2 使用链接池链接数据库

这使客户端链接生存期与服务器链接和进程生存期脱钩。链接池的做用:

  • 接受和管理来自客户端的链接
  • 创建和维护与服务器的链接
  • 将服务器链接分配给客户端链接

特色:

  • 单个服务器链接可处理来自不一样客户端的会话,事务和语句
  • 单个客户端会话的事务和/或语句可在不一样的服务器链接上运行

显而易见使用链接池可以下降服务器的内存开销,而且有效复用数据库链接,提供了良好的数据库链接性能管理。

做者简介

原文做者:王志斌,曾得到中国PostgreSQL数据库管理工程师(PGCE),是PostgreSQL官方认证讲师,盘古云课堂特邀金牌讲师。

Greenplum相关内容丰富:王晓冉,现任Greenplum研发工程师。研究生毕业于中国科学院软件所软件工程专业。目前主要负责gpcopy的研发工做。此前参与了gpkakfa的研发及Postgres Merge工做。

image

相关文章
相关标签/搜索