forked from le0pard/postgresql_book
-
Notifications
You must be signed in to change notification settings - Fork 0
/
postgresql_connection_pooling.tex
78 lines (56 loc) · 5.02 KB
/
postgresql_connection_pooling.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
\chapter{Мультиплексоры соединений}
\begin{epigraphs}
\qitem{Если сразу успеха не добились, пытайтесь снова и снова.
Затем оставьте эти попытки. Какой смысл глупо упорствовать?}{Уильям Клод Филдс}
\end{epigraphs}
\section{Введение}
Мультиплексоры соединений (программы для создания пула соединений) позволяют уменьшить накладные расходы на базу данных, в случае, когда огромное количество физических соединений ведет к падению производительности PostgreSQL. Это особенно важно на Windows, когда система ограничивает большое количество соединений. Это также важно для веб-приложений, где количество соединений может быть очень большим.
Вот список программ, которые создают пулы соединений:
\begin{itemize}
\item PgBouncer
\item Pgpool
\end{itemize}
\section{PgBouncer}
Это мультиплексор соединений для PostgreSQL от компании Skype. Существуют три режима управления.
\begin{itemize}
\item Session Pooling~--- наиболее <<вежливый>> режим. При начале сессии клиенту выделяется соединение с сервером; оно приписано ему в течение всей сессии и возвращается в пул только после отсоединения клиента;
\item Transaction Pooling~--- клиент владеет соединением с бакендом только в течение транзакции. Когда PgBouncer замечает, что транзакция завершилась, он возвращает соединение назад в пул;
\item Statement Pooling~--- наиболее агрессивный режим. Соединение с бакендом возвращается назад в пул сразу после завершения запроса. Транзакции с несколькими запросами в этом режиме не разрешены, так как они гарантировано будут отменены. Также не работают подготовленные выражения (prepared statements) в этом режиме.
\end{itemize}
К достоинствам PgBouncer относится:
\begin{itemize}
\item малое потребление памяти (менее 2 КБ на соединение);
\item отсутствие привязки к одному серверу баз данных;
\item реконфигурация настроек без рестарта.
\end{itemize}
Базовая утилита запускается так:
\begin{lstlisting}[language=Bash,label=lst:pgbouncer1,caption=PgBouncer]
$ pgbouncer [-d][-R][-v][-u user] <pgbouncer.ini>
\end{lstlisting}
Простой пример для конфига:
\begin{lstlisting}[label=lst:pgbouncer2,caption=PgBouncer]
[databases]
template1 = host=127.0.0.1 port=5432 dbname=template1
[pgbouncer]
listen_port = 6543
listen_addr = 127.0.0.1
auth_type = md5
auth_file = userlist.txt
logfile = pgbouncer.log
pidfile = pgbouncer.pid
admin_users = someuser
\end{lstlisting}
Нужно создать файл пользователей userlist.txt примерно такого содержания: \lstinline!"someuser" "same_password_as_in_server"!
Админский доступ из консоли к базе данных pgbouncer:
\begin{lstlisting}[language=Bash,label=lst:pgbouncer3,caption=PgBouncer]
$ psql -h 127.0.0.1 -p 6543 pgbouncer
\end{lstlisting}
Здесь можно получить различную статистическую информацию с помощью команды \lstinline!SHOW!.
\section{PgPool-II vs PgBouncer}
Все очень просто. PgBouncer намного лучше работает с пулами соединений, чем PgPool-II. Если вам не нужны остальные возможности, которыми владеет PgPool-II (ведь пулы коннектов это мелочи к его функционалу), то конечно лучше использовать PgBouncer.
\begin{itemize}
\item PgBouncer потребляет меньше памяти, чем PgPool-II;
\item у PgBouncer возможно настроить очередь соединений;
\item в PgBouncer можно настраивать псевдо базы данных (на сервере они могут называтся по-другому).
\end{itemize}
Хотя некоторые используют PgBouncer и PgPool-II совместно.