8.3 配置您的第一个pgbouncer设置

一旦我们已经完成了pbouncer的编译与安装,我们可以容易地启动它。要做到这一点,我们已经在一个本地实例(p0和p1) 建立了两个数据库。在本例中,执行设置的想法是使用pgbouncer作为代理。

8.3.1 写一个简单的配置文件并启动pgbouncer

为了使pgbouncer工作,我们可以写一个简单的配置文件,它可以被添加到pgboucner:

[databases]

p0 = host=localhost dbname=p0

p1 = host=localhost dbname=p1

[pgbouncer]

logfile = /var/log/pgbouncer.log

pidfile = /var/log/pgbouncer.pid

listen_addr = 127.0.0.1

listen_port = 6432

auth_type = trust

auth_file = /etc/pgbouncer/userlist.txt

pool_mode = session

server_reset_query = DISCARD ALL

max_client_conn = 100

default_pool_size = 20

此处不需要使用相同的数据库名。您可以把任何数据库名映射到任何连接字符串。我们已经发现了使用相同的名字的很有用。

一旦我们写完了这个配置文件,我们可以放心地启动pgbouncer看看会发生什么:

hs@iMac:/etc$ pgbouncer bouncer.ini

2013-04-25 17:57:15.992 22550 LOG File descriptor limit: 1024 (H:4096),

max_client_conn: 100, max fds possible: 150

2013-04-25 17:57:15.994 22550 LOG listening on 127.0.0.1:6432

2013-04-25 17:57:15.994 22550 LOG listening on unix:/tmp/.s.PGSQL.6432

2013-04-25 17:57:15.995 22550 LOG process up: pgbouncer 1.5.4, libevent

2.0.16-stable (epoll), adns: evdns2

在生产环境中,您会先配置身份验证,但是,让我们一步一步地做。

调度请求

当处理pgbouncer时,我们首先要配置的是我们要连接的数据库服务器的配置。在我们的例子中,我们简单地创建了p0和p1的连接。我们把连接字符串放到数据库服务器的配置中,该连接字符串告诉pgbouncer连接到哪里。由于pgbouncer本质上是某种代理的端口,我们也可以映射连接来使事情变得更加灵活。在这个种情况下,映射意味着保持数据的数据库不一定要和通过pgbouncer展示的虚拟数据库具有相同的名字。

下面的连接参数是允许的:dbname, host, port, user, password,client_encoding, datestyle, timezone, pool_size, and connect_query。所有的密码是在任何PostgreSQL连接串中您将会用到的。 其余的用来调整pgbouncer以适应您的需要。这里最重要的设置是池的大小,它定义了到这个特殊的pbouncer虚拟数据库所允许的连接的最大数目。

注意,池的大小和连接的PostgreSQL的连接数是不相关的。可以有不止一个挂起的到pgbouncer的连接等待到PostgreSQL的连接。

这里重要的事情是,您可以使用pgbouncer转发到许多不同的主机上的不同的数据库—没有必要所有的数据库都在相同的主机上,所以pgbouncer也可以帮助您集中化您的网络配置。

请注意,我们使用不同的密码连接到pgbouncer—因为所有的连接都在连接池里,我们不对PostgreSQL本身进行身份验证。

最后,我们可以配置一个connect_query选项。使用此设置我们可以定义个查询,只要连接被传递到应用程序该查询必须被执行。这有什么好处?您可能需要设置您的数据库中的一些变量,清除或者直接简单地改变一些运行时参数。有时,您不需要列出所有的数据库连接。尤其是有好多数据库,则可以派上用场。这个想法是直接列出所有之前没有被列出的请求到后备服务器:

* = host=fallbackserver

到p0和p1的连接将如前被处理—其它一切连接都会连接到后备连接字符串。

更基本的设置

在我们的例子中,pgbouncer将会监听6432端口。我们设置listen_addr 为127.0.0.1,所以现在,只允许本地连接。基本上listen_addr的作用就像postgresql.conf中的listen_addresses的作用一样。我们可以定义监听什么IP地址。

[在大多数情况下,您可能想给listen_addr使用*,因为您可能想把所有的网卡考虑在内。]

在我们的设置中,pgbouncer将会产生相当数量的日志条目。为了把这些日志写入到一个日志文件中,我们已经使用了我们配置文件中日志文件指令。强烈建议写日志文件,以确保您可以监测您的bouncer中的所有相关事情。

身份验证

一旦我们已经配置了我们的数据库和其它的基本设置,我们可以把我们的注意力转到身份验证了。正如您已经看到的,这个地方的配置连到(显示)您设置的数据库。所有的应用程序将指向pgbouncer,因此所有的身份验证相关的东西实际上将门卫处理。它是如何工作的呢?pgbouncer接受PostgreSQL支持的相同的身份验证方法,例如mmd5(auth_file可能包含md5加密文件),crypt(auth_file中的普通的文本密码),plain(清晰的文本密码),trust(没有身份验证)和any(和trust很像,但是忽略用户名)。

auth_file文件本身有一个简单的格式:

"hs" "15359fe57eb03432bf5ab838e5a7c24f"

"zb" "15359fe57eb03432bf5ab838e5a7c24f"

第一列包含用户名,然后是一个tab,最后是一个普通的文本字符串或者一个md5加密的密码。

8.3.2 pgbouncer的连接

一旦我们写完了这个基本的配置并启动系统,我们可以安全地连接到列出的数据库中的一个数据库:

hs@iMac:~$ psql -p 6432 p1 -U hs

psql (9.2.4)

Type "help" for help.

p1=#

在我们的例子当中,我们正连接到我们自己的名为p1的数据库。我们可以看到,shell已经正常地打开了,我们可以继续,并发出我们想要的SQL,就好像我们是连接到一个正常的数据库。

日志文件也将反应我们连接到数据库的工作和状态:

2013-04-25 18:10:34.830 22598 LOG C-0xbca010: p1/hs@unix:6432 login

attempt: db=p1 user=hs

2013-04-25 18:10:34.830 22598 LOG S-0xbe79c0: p1/hs@127.0.0.1:5432 new

connection to server

对于每一个连接,我们得到各种日志条目,以便系统管理员可以很容易地坚持正在发生什么事情。

Java问题

如果您碰巧使用Java作为前端,有几点必须要考虑。Java往往把一些参数传递给服务器作为连接字符串。其中一个参数是extra_float_digits。这个postgresql.conf的参数管理PostgreSQL的浮点行为,它通过Java设置以确保事情更加确定。

问题是,pgbouncer将只会接受在前小节列出来的参数—否则将会报错。

为了解决这个问题,您可以添加一个指令到您的bouncer 配置文件(pgbouncer文件部分):

ignore_startup_parameters = extra_float_digits

这将忽略JDBC设置,并允许pgbouncer正常地处理连接。如果您想使用Java,我们建议直接把这些参数放到postgresql.conf中以确保在生产环境中不会弹出讨厌的问题。

8.3.3 池模式

在配置文件中,您一定也看到了一个叫名字为pool_mode的配置变量,它还没有被描述过。其原因是,池模式是如此的重要,以至于我们准备了一整节来描述它。

一般来说,有三种不同的池模式可供选择:

• 会话

• 事务

• 语句

会话模式是pgbouncer的默认模式。只要应用程序从 bouncer 断开连接,连接就会返回到池中。在许多情况下,这是所期望的模式,因为我们只想节省连接开销—仅此而已。然而,在某些情况下,快速地把会话返回到池中可能是非常有用的。如果不同的事务之间存在滞后,这是尤其重要的。在事务模式下,当事务结束时(而不是当连接结束时),pgbouncer将会立即把一个连接返回到池中。这样做的优点是,我们仍然可以使用事务的好处,但是,连接被返回的更迅速了,因此,我们可以更加有效地使用那些打开的连接。对于大多数web应用程序来说,这可能是一个很大的优势,因为一个会话的生命是非常短的。

第三池模式,在语句结束时,语句允许我们立即返回一个连接。这是一个非常积极的设置,它基本上,被设置用来提供高并发的设置,其中的事务一点都不相关。为了确保在这个设置中任何事情都不出错,跨越一条语句以上的长事务是不允许的。

大多数人在这里会坚持默认的模式,但是,您必须记住,其它的模式也存在。

8.3.4 清理问题

在PostgreSQL调用fork()之后,一个干净,而且新生的连接的一个优势是,事实上,那个连接不包含任何不完善的设置,任何打开的游标,或者无论任何其它的遗留。这使得一个新的连接使用起来安全,并且避免其它连接的负面影响。

正如您已经在本章学习的,pgbouncer将会重新使用连接来避免这些fork()调用。现在问题是,“ 我们如何确保一些连接不会遭受由其它一些连接引起的副作用呢?”

这个问题的答案是 server_reset_query :无论什么时候一个连接返回到池中,pgbouncer能够运行一个查询或者设计的一组查询来清理您的数据库连接。这可以是任何基本的查询。实际上,设置它已经证明调用DISCARD ALL是明智的。DISCARD ALL是PostgreSQL的一个指令,它被设计通过关闭所有的游标,重置参数等等,来清理一个已经存在的连接。DISCARD ALL之后,连接和调用fork()之后一样新,并且可以安全地被一个未来的请求重新使用。

请记住,在一个连接返回到池之前或它被从池中获取之后,没有必要运行一个明确的ROLLBACK。pgbouncer已经自动做了事务回滚,因此,您可以完全肯定一个连接绝不会在一个事务内部。

最新文章

  1. [leetcode] 题型整理之字符串处理
  2. Bug管理工具之Mantis_配置篇
  3. 使用git建立远程仓库,让别人git clone下来
  4. 一、Spring——IoC
  5. VBA读取文件夹下所有文件夹及文件内容,并以树形结构展示
  6. javascript url 相关函数(escape/encodeURL/encodeURIComponent区别)
  7. android 使用代码实现 RelativeLayout布局
  8. codeforces 390E Inna and Large Sweet Matrix
  9. DataGridView出现大红叉--在使用多线程访问数据源时
  10. Codeforces Round #263 (Div. 1) C. Appleman and a Sheet of Paper 树状数组暴力更新
  11. The method setOnClickListener(View.OnClickListener) in the type View is not applicable
  12. linux 下执行.sh文件总是提示permission denied
  13. 邮件发送 emailsend .net开发
  14. rowid结构浅析
  15. 使用Spring实现读写分离( MySQL实现主从复制)
  16. python写一个防御DDos的脚本(请安好环境否则无法实验)
  17. AWS技术会议笔记
  18. Ambiguous mapping found
  19. Cow Contest POJ - 3660 (floyd 传递闭包)
  20. c#使用 Newtonsoft.Json 将entity转json时,忽略为null的属性

热门文章

  1. Linux操作系统是如何工作的
  2. Testbench代码设计技巧
  3. m_Orchestrate learning system---五、学的越多,做的越快
  4. Java 定制工具库 —— Print(import static)
  5. Visual Studio 2015 官方下载及密钥
  6. Tomcat学习(一)——使用Eclipse绑定Tomcat并发布应用
  7. HTML基础——网站图片显示页面
  8. JS报错:Cannot read property 'type' of undefined
  9. C++ 获取某一文件夹下的所有文件名
  10. 为什么在3ds Max 按系统默认的快捷键AIT+W 视口最大化切换没反应?