使用PgBouncer连接池

使用PgBouncer连接池

PgBouncer工具可以管理PostgreSQL和Greenplum数据库连接的连接池。

以下话题描述了如何在Greenplum数据库上配置PgBouncer。 更多有关如何在PostgreSQL上使用PgBouncer的信息,请参考 PgBouncer网站

概述

数据库连接池是一种数据库连接的缓存。一旦一个池子的连接被建立,连接池就能消除创建 数据库连接的开销,这样客户端能更快地连接并且服务器的负载也能被降低。

PgBouncer连接池来自于PostgreSQL社区,它被包括在Greenplum数据库中。PgBouncer 可以为多个数据库管理连接池,并且这些数据库可以位于不同的Greenplum数据库集群或者 PostgreSQL后端。PgBouncer会为每一种数据库用户与数据库的组合建立一个池。一个被 池化的连接只能被来自于同一个用户和数据库的另一个连接请求重用。当客户端断开连接后, PgBouncer会将连接归还给连接池以做下次重用。

PgBouncer有三种池模式来共享连接:
  • 会话池化 – 当一个客户端连接时,只要它保持连接状态,就分配给它一个连接。 当该客户端断开连接时,该连接才被放回到池中。
  • 事务池化 – 在一个事务运行期间,分配一个连接给客户端。当PgBouncer发现 事务完成,该连接就被放回到池中。这种模式只能被用于不使用依赖于会话的特性的应用。
  • 语句池化 – 语句池化类似于事务池化,但是不允许多语句事务。这种模式的 目标是为了在客户端强制自动提交模式,且它的定位是PostgreSQL上的PL/Proxy。

可以为PgBouncer设置一种默认的池模式,并且该模式可以被单个数据库和用户覆盖。

通过连接到一个虚拟的pgbouncer数据库,用户可以使用类SQL命令监控和管理PgBouncer。 可以不重启PgBouncer就修改配置参数,只需要重新载入配置文件就能发现更改。 PgBouncer支持PostgreSQL和Greenplum数据库上的标准连接接口。Greenplum数据库客户端应用 (例如psql)可以连接到正在运行的PgBouncer主机和端口号,而不是 Greenplum的Master主机和端口号。

PgBouncer有一个类psql的管理控制台界面。授权用户可以通过该控制台 连接到一个虚拟数据库来监控和管理PgBouncer。您可以通过管理控制台来管理PgBouncer后台进程, 也可以用控制台在运行时更新和重载PgBouncer配置,而不停止和重启PgBouncer进程。

PgBouncer原生支持TLS。

迁移PgBouncer

当您迁移到一套新版本的Greenplum数据库时,必须迁移PgBouncer实例到新版本的Greenplum 数据库。

  • 如果您正在迁移Greenplum 5.8.x版本数据库或更早版本,可以在不丢弃连接的 情况下迁移PgBouncer。采用带有-R选项和配置文件的命令拉起新的PgBouncer 进程。
    $ pgbouncer -R -d pgbouncer.ini

    -R(重启)选项启动新进程以Unix套接字的方式连接到旧进程并发出以下命令:

    SUSPEND;
    SHOW FDS;
    SHUTDOWN;

    当新进程检测到旧进程完成后,它接管旧连接的工作。最可能的原因是SHOW FDS 命令将实际的文件定位符发送新进程。如果事务因任何原因失败,新进程会被杀掉,旧进程仍然接管 原来的工作。

  • 如果您正在迁移Greenplum 5.9.0版本数据库或更高版本,您必须关闭旧版本安装文件中 的PgBouncer实例,在新数据库安装文件中重新配置并启动PgBouncer实例。
  • 如果您采用stunnel加密旧安装文件的PgBouncer连接,在新环境中必须使用与PgBouncer 1.8.1 及更新版本适配的内建TLS配置SSL/TLS。
  • 如果您在旧环境中使用了LDAP授权,在新环境中必须使用与PgBouncer 1.8.1及更新版本适配的 内建集成PAM配置LDAP。必须移除或替换auth_file中所有 以ldap://开头的密码串。

配置PgBouncer

通过配置文件配置PgBouncer和它到Greenplum数据库的访问。配置文件通常命名为pgbouncer.ini, 提供Greenplum数据库的位置信息。pgbouncer.ini文件也指定PgBouncer的进程、连接池、 授权用户和授权配置。

pgbouncer.ini配置文件示例内容如下:
[databases]
postgres = host=127.0.0.1 port=5432 dbname=postgres
pgb_mydb = host=127.0.0.1 port=5432 dbname=mydb

[pgbouncer]
pool_mode = session
listen_port = 6543
listen_addr = 127.0.0.1
auth_type = md5
auth_file = users.txt
logfile = pgbouncer.log
pidfile = pgbouncer.pid
admin_users = gpadmin

有关PgBouncer配置文件格式和其支持的配置参数列表等信息信息,请见 pgbouncer.ini参考页面。

当客户端连接到PgBouncer时,连接池从pgbouncer.ini配置文件中查找 受访数据库(可能是实际数据库的别名)对应的主机名、端口号和数据库名。该配置文件也定义数据库的 授权模式。

PgBouncer要求有一个授权文件,该文件是一个包含Greenplum数据库用户名和密码的文本文件。 文件内容与pgbouncer.ini中配置的auth_type 授权类型密切相关。密码可能是干净文本或MD5编码的字符串。用户也可以配置PgBouncer通过 查询目标数据库来获取授权文件中未定义的密码信息。

PgBouncer授权文件格式

PgBouncer有自己的用户授权文件。用户可以在pgbouncer.ini配置文件 的auth_file属性中定义文件名。auth_file文本文件 格式如下:

"username1" "password" ...
"username2" "md5abcdef012342345" ...

auth_file为每个用户占用一行。每行至少有两个域,两个都用双引号包裹 (" ")。第一部分定义Greenplum数据库用户名,第二部分为明文或 MD5编码的密码。PgBouncer忽略改行余下的部分。

auth_file文件格式与Greenplum数据库所用的授权信息文件 pg_auth相似。PgBouncer可以直接使用Greenplum数据库授权文件。)

使用MD5编码的密码,密码格式如下:
"md5" + MD5_encoded(<password><username>)

可以从pg_shadow视图中获取所有Greenplum数据库用户的MD5编码密码。

为PgBouncer配置基于HBA的授权

PgBouncer支持基于HBA的授权。要为PgBouncer配置基于HBA的授权,在pgbouncer.ini 配置文件中设置auth_type=hba,并在pgbouncer.ini文件中配置 HBA格式文件参数auth_hba_file

名称为hba_bouncer.conf的PgBouncer HBA文件的内容如下:
local       all     bouncer             trust
host        all     bouncer      127.0.0.1/32       trust

相关pgbouncer.ini配置文件中的对应配置部分:

[databases]
p0 = port=15432 host=127.0.0.1 dbname=p0 user=bouncer pool_size=2
p1 = port=15432 host=127.0.0.1 dbname=p1 user=bouncer
...

[pgbouncer]
...
auth_type = hba
auth_file = userlist.txt
auth_hba_file = hba_bouncer.conf
...

有关PgBouncer支持的HBA授权文件格式的详细讨论,请参考HBA file format

启动PgBouncer

用户可以在Greenplum数据库master主机或其他服务器上运行PgBouncer。如果在一台单独的服务器上 安装PgBouncer,用户可以使用PgBouncer管理客户端,通过更新PgBouncer配置文件和重载配置很容易的 切换客户端连接到standby master。

参考以下配置设置PgBouncer。

  1. 创建PgBouncer配置文件。例如,增加以下文本到文件pgbouncer.ini中:
    [databases]
    postgres = host=127.0.0.1 port=5432 dbname=postgres
    pgb_mydb = host=127.0.0.1 port=5432 dbname=mydb
    
    [pgbouncer]
    pool_mode = session
    listen_port = 6543
    listen_addr = 127.0.0.1
    auth_type = md5
    auth_file = users.txt
    logfile = pgbouncer.log
    pidfile = pgbouncer.pid
    admin_users = gpadmin

    该文件列出了数据库和它们连接的详细信息。该文件也配置了PgBouncer实例。 有关PgBouncer配置文件内容和格式的详细信息,请参考 Refer to the pgbouncer.ini参考页面。

  2. 创建授权文件。文件名应该和pgbouncer.ini文件中定义的auth_file 参数名字一样,users.txt。每行包含一个用户名和一个密码。密码的格式应该匹配PgBouncer 配置文件中定义的auth_type。如果auth_type参数为plain, 密码串应该为干净的文本文件密码,例如:
    "gpadmin" "gpadmin1234"
    如果auth_type如下面例子中为md5,授权部分必须是MD5编码格式。 MD5编码的密码格式如下:
    "md5" + MD5_encoded(<password><username>)
  3. 开始启动 pgbouncer:
    $ $GPHOME/bin/pgbouncer -d pgbouncer.ini

    -d选项代表以后台进程的形式运行PgBouncer。pgbouncer命令的 语法和选项,请见pgbouncer参考页面。

  4. 更新客户应用连接到pgbouncer,以代替直接连接到Greenplum数据库服务器。例如, 连接到上面配置的Greenplum数据库mydb,像如下方式一样运行psql
    $ psql -p 6543 -U someuser pgb_mydb

    -p选项的值代表用户配置的PgBouncer实例的listen_port端口号。

管理PgBouncer

PgBouncer提供一个类psql的管理控制台,可以通过指定PgBouncer端口号 和虚拟数据库名称pgbouncer来登录到PgBouncer管理控制台。 该控制台接受类SQL命令,这些命令允许用户监控、重新配置和管理PgBouncer。

有关PgBouncer管理控制台命令的完整文档,请参考 PgBouncer管理控制台命令参考。

要开始使用PgBouncer管理控制台,请遵循下列步骤。

  1. psql登录到pgbouncer虚拟数据库:
    $ psql -p 6543 -U username pgbouncer

    username必须是pgbouncer.ini配置文件中 admin_users参数中所设置的值。 如果pgbouncer进程运行在用户登录的当前Unix用户的UID下,用户还可以用该用户名登录。

  2. 要看PgBouncer管理控制台命令,运行SHOW help命令:
    pgbouncer=# SHOW help;
    NOTICE:  Console usage
    DETAIL:
        SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|VERSION
        SHOW FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM
        SHOW DNS_HOSTS|DNS_ZONES
        SHOW STATS|STATS_TOTALS|STATS_AVERAGES
        SET key = arg
        RELOAD
        PAUSE [<db>]
        RESUME [<db>]
        DISABLE <db>
        ENABLE <db>
        KILL <db>
        SUSPEND
        SHUTDOWN
  3. 如果用户对PgBouncer配置文件pgbouncer.ini做了修改, 用户可以用RELOAD命令重载它:
    pgbouncer=# RELOAD;

映射PgBouncer客户端到Greenplum数据库服务器连接

要映射PgBouncer客户端到Greenplum数据库服务器连接,可以使用PgBouncer管理控制台 命令SHOW CLIENTSSHOW SERVERS

  1. 使用ptrlink把本地客户端连接映射到服务器连接。
  2. 使用客户端连接的addrport标识来自客户端的TCP连接。
  3. 使用local_addrlocal_port标识到服务器的TCP连接。