=====Архитектура процессов и памяти===== ====Архитектура процесса==== PostgreSQL - это система управления реляционными базами данных клиент-серверного типа с многопроцессорной архитектурой, работающая на одном хосте. Набор из нескольких процессов, совместно управляющих одним кластером базы данных, обычно называется «сервером PostgreSQL», и он содержит следующие типы процессов: * Серверный процесс postgres является родительским для всех процессов, связанных с управлением кластером базы данных. * Каждый бэкэнд-процесс обрабатывает все запросы и операторы, выданные подключенным клиентом. * Различные фоновые процессы выполняют процессы каждой функции (например, процессы VACUUM и CHECKPOINT) для управления базой данных. * В связанных с репликацией процессах они выполняют потоковую репликацию. * В фоновом рабочем процессе, поддерживаемом с версии 9.3, он может выполнять любую обработку, реализованную пользователями. В следующих подразделах подробно описаны первые три типа процессов. Пример архитектуры процесса в PostgreSQL. \\ {{ :postgres:основы:fig-2-01.png?nolink |}} ====Postgres Server Process==== Как уже было описано выше, серверный процесс postgres является родительским для всего сервера PostgreSQL. В более ранних версиях он назывался «почтмейстер». При запуске утилиты pg_ctl с параметром start запускается процесс сервера postgres. Затем он выделяет в памяти общую область памяти, запускает различные фоновые процессы, запускает процессы, связанные с репликацией, и фоновые рабочие процессы, если это необходимо, и ожидает запросов на подключение от клиентов. Каждый раз, когда клиент получает запрос на соединение, он запускает внутренний процесс. (А затем запущенный внутренний процесс обрабатывает все запросы, отправленные подключенным клиентом.) ====Backend Processes==== Внутренний процесс, который также называется postgres, запускается серверным процессом postgres и обрабатывает все запросы, отправленные одним подключенным клиентом. Он связывается с клиентом с помощью одного TCP-соединения и завершается, когда клиент отключается. Поскольку разрешено работать только с одной базой данных, вы должны явно указать базу данных, которую хотите использовать при подключении к серверу PostgreSQL. ====Background Processes==== Таблица ниже показывает список фоновых процессов. В отличие от сервера postgres и внутреннего процесса, невозможно просто объяснить каждую из функций, потому что эти функции зависят от индивидуальных особенностей и внутренних компонентов PostgreSQL. ^процесс^описание^справка| |background writer|В этом процессе грязные страницы из общего буферного пула регулярно постепенно записываются в постоянное хранилище (например, жесткий диск, твердотельный накопитель). (В версии 9.1 или более ранней он также отвечал за процесс контрольной точки.)|[[.:pgsql08#_8.6.|Section 8.6]]| |checkpointer|В этом процессе в версии 9.2 или новее выполняется процесс контрольной точки.|[[.:pgsql08#_8.6.|Section 8.6]], [[.:pgsql09#_9.7.|Section 9.7]]| |autovacuum launcher|Для процесса вакуумирования периодически вызываются рабочие процессы автовакуума. (Точнее, он запрашивает создание рабочих процессов автоочистки на сервере postgres.)|[[.:pgsql06#_6.5.|Section 6.5]]| |WAL writer|Этот процесс периодически записывает и сбрасывает данные WAL из буфера WAL в постоянное хранилище.|[[.:pgsql09#_9.9.|Section 9.9]]| |statistics collector|В этом процессе собирается статистическая информация, например, для pg_stat_activity, для pg_stat_database и т. Д.| | |logging collector (logger)|Этот процесс записывает сообщения об ошибках в файлы журнала.| | |archiver|В этом процессе выполняется архивирование журнала.|[[.:pgsql09#_9.10.|Section 9.10]]| Здесь показаны фактические процессы сервера PostgreSQL. В следующем примере запущены один серверный процесс postgres (pid 9687), два внутренних процесса (pid 9697 и 9717) и несколько фоновых процессов, перечисленных в таблице. postgres> pstree -p 9687 -+= 00001 root /sbin/launchd \-+- 09687 postgres /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data |--= 09688 postgres postgres: logger process |--= 09690 postgres postgres: checkpointer process |--= 09691 postgres postgres: writer process |--= 09692 postgres postgres: wal writer process |--= 09693 postgres postgres: autovacuum launcher process |--= 09694 postgres postgres: archiver process |--= 09695 postgres postgres: stats collector process |--= 09697 postgres postgres: postgres sampledb 192.168.1.100(54924) idle \--= 09717 postgres postgres: postgres sampledb 192.168.1.100(54964) idle in transaction ====Архитектура памяти==== Архитектуру памяти в PostgreSQL можно разделить на две большие категории: * Область локальной памяти - выделяется каждым внутренним процессом для собственного использования. * Общая область памяти - используется всеми процессами сервера PostgreSQL. \\ {{ :postgres:основы:fig-2-02.png?nolink |}} \\ В следующих подразделах они кратко описаны. ====Область локальной памяти==== Каждый внутренний процесс выделяет область локальной памяти для обработки запросов; каждая область разделена на несколько подобластей, размеры которых могут быть фиксированными или переменными. Таблица показывает список основных подобластей. ^sub-area^описание^справка| |work_mem|Executor использует эту область для сортировки кортежей по операциям ORDER BY и DISTINCT, а также для соединения таблиц с помощью операций слияния-соединения и хэш-соединения.|[[.:pgsql03|Chapter 3]]| |maintenance_work_mem|Некоторые виды операций обслуживания (например, VACUUM, REINDEX) используют эту область.|[[.:pgsql06#_6.1.|Section 6.1]]| |temp_buffers|Executor использует эту область для хранения временных таблиц.| | ====Общая область памяти==== Общая область памяти выделяется сервером PostgreSQL при запуске. Эта область также разделена на несколько подобластей фиксированного размера. Таблица 2.3 показывает список основных подобластей. Подробности будут описаны в следующих главах. ^подобласть^описание^справка| |shared buffer pool|PostgreSQL загружает страницы в таблицы и индексы из постоянного хранилища сюда и управляет ими напрямую.|[[.:pgsql08|Chapter 8]]| |WAL buffer|Чтобы гарантировать, что никакие данные не были потеряны из-за сбоев сервера, PostgreSQL поддерживает механизм WAL. Данные WAL (также называемые записями XLOG) представляют собой журнал транзакций в PostgreSQL; а буфер WAL - это область буферизации данных WAL перед записью в постоянное хранилище.|[[.:pgsql09|Chapter 9]]| |commit log|Журнал фиксации (CLOG) сохраняет состояния всех транзакций (например, in_progress, подтверждено, прервано) для механизма управления параллелизмом (CC).|[[.:pgsql05#_5.4.|Section 5.4]]| В дополнение к ним PostgreSQL выделяет несколько областей, как показано ниже: * Подзоны для различных механизмов контроля доступа. (например, семафоры, облегченные блокировки, разделяемые и эксклюзивные блокировки и т. д.) * Подразделы для различных фоновых процессов, таких как контрольная точка и автоочистка. * Подразделы для обработки транзакций, такие как точка сохранения и двухфазная фиксация. и другие.