Эта статья представляет собой краткое введение в принципы взаимодействия клиент-сервер. Полный список статей о внутреннем устройстве Postgres 15 вы можете найти здесь.

Еще одной задачей процесса postmaster является прослушивание входящих соединений. Когда появляется новый клиент, постмастер запускает для него процесс обслуживания (бэкенд). Клиент устанавливает соединение и начинает сеанс связи со своим серверным процессом. Сеанс продолжается до тех пор, пока клиент не отключится или соединение не будет потеряно.

Для каждого клиента на сервере создается собственный процесс обслуживания. Большое количество подключений может вызвать проблемы:

  • Каждому процессу требуется память для хранения кэша системного каталога, подготовленных запросов, промежуточных результатов запросов и других данных. Чем больше подключений открыто, тем больше памяти должно быть доступно.
  • Если соединения выполняются часто, а сессии короткие (т. е. клиент выполняет один небольшой запрос и отключается), то на установление соединений, порождение новых процессов и ненужное заполнение локальных кешей будет расходоваться запредельное количество ресурсов.
  • Чем больше процессов запущено, тем больше времени требуется для просмотра их списка, и эта операция выполняется очень часто. В результате производительность может снижаться по мере увеличения числа клиентов.

В таких случаях для ограничения количества обслуживающих процессов используется пул соединений. PostgreSQL не имеет встроенного пула соединений, поэтому приходится использовать сторонние решения: менеджеры пулов, встроенные в сервер приложений, или внешние программы (например, PgBouncer или Одиссея). Обычно один процесс на сервере поочередно выполняет транзакции от разных клиентов. Это накладывает определенные ограничения на разработку приложений, позволяя использовать инструменты, локализованные в рамках транзакции, но не сеанса.

Чтобы клиент и сервер понимали друг друга, они должны использовать один и тот же протокол взаимодействия. Обычно для реализации протокола используется стандартная библиотека libpq, хотя встречаются и независимые реализации.

В общих чертах протокол позволяет клиенту подключаться к серверу и выполнять запросы SQL.

Подключение всегда осуществляется под определенной ролью (пользователь) и к определенной базе данных. Несмотря на то, что сервер работает с кластером баз данных, для использования нескольких баз данных в приложении к каждой из них необходимо будет осуществлять отдельное подключение. Аутентификация выполняется во время соединения: процесс обслуживания проверяет, является ли пользователь тем, за кого себя выдает (например, запрашивая пароль), и проверяет разрешения пользователя. для подключения к серверу и к выбранной базе данных.

SQL-запросы отправляются в процесс обслуживания в текстовой форме. Процесс анализирует текст, оптимизирует запрос, выполняет его и возвращает результат клиенту.

В следующей статье мы начнем открывать для себя изоляцию! И в качестве первого шага мы поговорим о последовательности.

Полный список статей серии вы можете найти здесь.

Спасибо за чтение!

Рекомендации

PostgreSQL 15 изнутри. — М.: ДМК Пресс, 2023. — 662 с. ISBN 978–5–93700–178–8