This repository has been archived by the owner on May 26, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 71
/
postgresql_connection_pooling.tex
72 lines (51 loc) · 5.13 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
\chapter{Мультиплексоры соединений}
\begin{epigraphs}
\qitem{Если сразу успеха не добились, пытайтесь снова и снова.
Затем оставьте эти попытки. Какой смысл глупо упорствовать?}{Уильям Клод Филдс}
\end{epigraphs}
\section{Введение}
Мультиплексоры соединений (программы для создания пула соединений) позволяют уменьшить накладные расходы на базу данных, в случае, когда огромное количество физических соединений ведет к падению производительности PostgreSQL. Это особенно важно на Windows, когда система ограничивает большое количество соединений. Это также важно для веб-приложений, где количество соединений может быть очень большим.
Для PostgreSQL существует PgBouncer и Pgpool-II, которые работают как мультиплексоры соединений.
\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}
Нужно создать файл пользователей \lstinline!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}
Если сравнивать PgPool-II и PgBouncer, то PgBouncer намного лучше работает с пулами соединений, чем PgPool-II. Если вам не нужны остальные возможности, которыми владеет PgPool-II (ведь пулы коннектов это мелочи к его функционалу), то конечно лучше использовать PgBouncer.
\begin{itemize}
\item PgBouncer потребляет меньше памяти, чем PgPool-II;
\item у PgBouncer возможно настроить очередь соединений;
\item в PgBouncer можно настраивать псевдо базы данных (на сервере они могут называться по-другому);
\end{itemize}
Также возможен вариант использования PgBouncer и PgPool-II совместно.