70.2. Silk #
- 70.2.1. Концепция
- 70.2.2. Цикл событий
- 70.2.3. Маршрутизация и мультиплексирование
- 70.2.4. Обработка ошибок и целостность маршрута
- 70.2.5. Передача/порционирование/разделение данных в сверхбольших кортежах
- 70.2.6. Управление потоками
- 70.2.7. Тонкости реализации
- 70.2.8. Представления для диагностики мультиплексора
- 70.2.9. Функции
- 70.2.2. Цикл событий
70.2.1. Концепция #
Silk (Postgres Pro Shardman InterLinK) — это экспериментальная транспортная функциональность для коммуникации между кластерами. Она подключается в тот момент, когда postgres_fdw
решает передать восстановленный фрагмент запроса через соединение libpq
на удалённый узел, заменяя собой соединение libpq
. Эта функциональность предназначена для уменьшения количества незанятых подключений postgres_fdw
во время выполнения транзакции, минимизации задержки и повышения общей пропускной способности.
Реализация Silk использует несколько обслуживающих процессов. Основной процесс маршрутизации/мультиплексирования (по одному на экземпляр PostgreSQL) называется silkroad
, а группа обслуживающих процессов — silkworms
. Хотя postgres_fdw
использует libpq
, оно порождает несколько подключений libpq
от каждого обслуживающего процесса к удалённому узлу (где соответственно порождаются несколько обслуживающих процессов). Но если silk
заменяет libpq
, каждый процесс silkroad
подключается только к одному удалённому процессу silkroad
. В этой схеме удалённые silkworms
играют роль удалённых обслуживающих процессов, в противном случае порождённых postgres_fdw
.
Silkroad
связывает локальный обслуживающий процесс с рабочими процессами удалённого узла следующим образом:
Обслуживающий процесс использует обычный API
postgres_fdw
для доступа к удалённым данным. Ноpostgres_fdw
, когда включён silk, записывает запрос в очередь общей памяти вместо подключенияlibpq
;Процесс
Silkroad
анализирует входящую очередь общей памяти от этого обслуживающего процесса и направляет сообщение соответствующему сетевому подключению с удалённым процессомsilkroad
.Удалённый процесс
silkroad
захватывает входящее сообщение из сети и (если оно новое) перенаправляет его в доступную очередь общей памяти рабочего процесса (или в специальную очередь «неназначенных заданий», если все рабочие процессы заняты) .Наконец, удалённый рабочий процесс получает сообщение через свою очередь общей памяти, выполняет его и отправляет обратно получившиеся кортежи (или ошибку) таким же образом.
Silkroad
действует здесь как обычный сетевой коммутатор, перебрасывая пакеты между общей памятью серверной части и соответствующим сетевым сокетом. Этот процесс ничего не знает о содержании сообщения, полагаясь только на его заголовок.
70.2.2. Цикл событий #
Процесс Silkroad
запускает цикл событий на базе библиотеки libev
. Очередь общей памяти каждого обслуживающего процесса отображается в цикле обработки событий с помощью дескриптора eventfd
, а каждое сетевое подключение — с помощью дескриптора сокета.
Во время запуска обслуживающий процесс регистрирует себя (свои дескрипторы eventfd
) в локальном процессе silkroad
. Silkroad
отвечает, указывая, какие сегменты памяти использовать для очереди сообщений обслуживающего процесса. С этого момента silkroad
будет реагировать на события из очереди, связанной с этим обслуживающим процессом. Сетевые подключения между локальными и удалёнными silkroads
будут установлены сразу по первому запросу от обслуживающего процесса к удалённому узлу и будут существовать до тех пор, пока оба участника (процессы silkroad
) существуют.
70.2.3. Маршрутизация и мультиплексирование #
Для каждого подзапроса ожидается подмножество кортежей и поэтому взаимодействие внутри подзапроса представляется как двунаправленный поток данных. Silkroad
использует внутреннюю таблицу маршрутизации для регистрации этих потоков. Уникальный идентификатор потока (в кластере Postgres Pro Shardman) формируется как пара «адрес исходного узла, адрес целевого узла» и локально (внутри узла) уникальный номер. Каждый конкретный подзапрос от обслуживающего процесса к удалённым узлам будет зарегистрирован silkroad
как такой поток. Таким образом, любой обслуживающий процесс может быть связан со многими потоками одновременно.
Когда локальный процесс silkroad
получает от серверной части сообщение с новым идентификатором потока, он регистрирует его в локальной таблице маршрутизации, а затем перенаправляет это сообщение в соответствующий сокет. Если подключение с удалённым silkroad
не существует, оно устанавливается с помощью процедуры согласования. Исходное сообщение, инициировавшее согласование, помещается в специальный внутренний буфер до тех пор, пока согласование не завершится успешно. Удалённый процесс silkroad
, получив пакет с новым идентификатором, регистрирует его в своей таблице, затем назначает рабочий процесс silkworm
из пула доступных рабочих процессов и помещает сообщение в очередь общей памяти рабочего процесса. Если все рабочие процессы silkworm
в данный момент заняты, сообщение будет отложено, т. е. помещено в специальную «очередь неназначенных заданий» (обратите внимание, что значение параметра конфигурации shardman.silk_unassigned_job_queue_size
равно 1024). Если в очереди нет свободного места, будет сгенерировано сообщение об ошибке, которое будет отправлено обратно исходному обслуживающему процессу. Задание из этой очереди будет позже назначено первому доступному рабочему процессу, когда он освободится от предыдущего задания.
Когда рабочий процесс получает новое «задание», он выполняет его через подсистему SPI
, организует получившиеся кортежи в пакеты и отправляет их обратно через общую память локальному процессу silkroad
. Остальное тривиально, потому что весь маршрут известен. Последний получившийся пакет с кортежами в потоке помечается как «закрывающий». Это приказ процессам silkroads
стереть этот маршрут из своих таблиц.
Обратите внимание, что серверные и удалённые рабочие процессы остаются «подписанными» на свои потоки, пока они не будут явно закрыты. Таким образом, сервер имеет возможность отправить сообщение о прерывании или уведомить удалённый рабочий процесс о преждевременном закрытии транзакции. Это позволяет отбрасывать устаревшие пакеты данных, возможно оставшиеся от предыдущих прерванных транзакций.
Для просмотра текущего состояния процесса silkroad
мультиплексора используются диагностические представления Silk.
70.2.4. Обработка ошибок и целостность маршрута #
Кроме того, таблица маршрутизации silkroad
отслеживает конечные точки (серверы и сетевые подключения), которые были задействованы в том или ином потоке. Таким образом, когда какое-либо подключение закрывается, все задействованные серверы (и/или рабочие процессы) будут уведомлены об этом событии специальным сообщением об ошибке, а все маршруты/потоки, связанные с этим подключением, будут отклонены. Точно так же, если происходит сбой сервера, его очередь общей памяти отсоединяется, и silkroad
реагирует, отправляя сообщения об ошибках удалённым участникам каждого потока, связанного со сбоем сервера. Таким образом, удалённые рабочие процессы выполняют бесполезную работу, когда инициатор запроса уже неактивен.
70.2.5. Передача/порционирование/разделение данных в сверхбольших кортежах #
Получившиеся кортежи передаются silkworm
в собственном двоичном режиме. Кортежи с атрибутом хранения external
будут удалены из TOAST, но те, которые были сжаты, останутся сжатыми.
Небольшие кортежи будут организованы в порции (примерно по 256 тыс.). Большие кортежи будут разделены на части отправителем и собраны в единое целое принимающим сервером.
70.2.6. Управление потоками #
Может возникнуть ситуация, при которой очередное сообщение, полученное от сервера, не помещается в целевом сетевом буфере. Или сообщение, полученное из сети, не помещается в целевую очередь общей памяти. В таком случае поток, вызвавший эту ситуацию, будет «приостановлен». Это означает, что silkroad
приостанавливает реакцию на события исходной конечной точки (подключение или сервер) до тех пор, пока целевая конечная точка не обработает все свои сообщения. Остальные серверы и подключения, не затронутые этим маршрутом, продолжают работать. Принимающие модули серверов призваны свести к минимуму подобные ситуации. Сервер периодически проверяет и очищает входящую очередь, даже когда исполнитель плана занят обработкой других узлов плана. Полученные кортежи хранятся в хранилищах кортежей сервера в соответствии с узлами плана до тех пор, пока исполнитель не запросит следующий кортеж для выполнения конкретного узла плана.
Когда в целевой очереди освобождается достаточно места, приостановленный поток возобновляется, события конечной точки разблокируются, а процесс приёма и сортировки пакетов продолжается.
70.2.7. Тонкости реализации #
70.2.7.1. Передача состояний и CSN #
Когда postgres_fdw работает через транспорт Silk, используется только одно подключение между демонами маршрутизации silkroad
для передачи пользовательских запросов рабочим процессам silkworm
и получения их ответов. Каждый запрос содержит состояние транзакции, идентификатор группы репликации узла, на котором формируется запрос (координатора), сам запрос и параметры запроса (если они есть). Ответ представляет собой либо сообщение об ошибке с описанием и кодом ошибки, либо группу кортежей, за которыми следует сообщение «end of tuples» (конец кортежей). Это означает, что silkworm
должен переключиться на состояние транзакции, полученное вместе с запросом, перед выполнением запроса.
На данный момент транспорт Silk используется исключительно для запросов SELECT
только для чтения. Все запросы на изменение обрабатываются через обычное подключение libpq и в основном обрабатываются как все остальные DML-запросы в PostgreSQL postgres_fdw. Единственное отличие состоит в том, что когда DML-запрос обрабатывается postgres_fdw, модуль сбрасывает сохранённое состояние транзакции для записи кеша соединений, соответствующей соединению, в котором отправляется этот запрос. Кроме того, для такой записи в кеше соединений устанавливается флаг только для чтения. Когда запрос отправляется через транспорт Silk, расширение Postgres Pro Shardman запрашивает состояние транзакции для пары идентификаторов сервера и пользователя из postgres_fdw. Если такая запись найдена в кеше соединений postgres_fdw, она не является записью кеша только для чтения и в этой записи присутствует состояние транзакции, состояние возвращается. Если его нет, postgres_fdw получает полное состояние транзакции с удалённого сервера, сохраняет его в записи кеша соединений и возвращает в расширениеPostgres Pro Shardman.
Полное состояние транзакции аналогично состоянию параллельной рабочей транзакции и содержит:
информацию, относящуюся к текущему пользователю (uid, имя пользователя)
идентификатор процесса текущего сервера
временную метку начала транзакции
CSN текущего снимка
флаги, указывающие на наличие событий аннулирования
список параметров конфигурации, заданных в текущем сеансе (в том числе имя приложения)
внутреннее состояние сервера:
массив ComboCIDs
внутреннее состояние транзакции (полный идентификатор транзакции, уровень изоляции, текущий идентификатор команды и т. д.)
информацию о переиндексированных индексах
Если подключение не найдено в кеше подключений postgres_fdw (т. е. это новое подключение) или запись в кеше подключения помечается как доступная только для чтения, только эти характеристики формируют состояние транзакции:
информация, относящаяся к текущему пользователю (имя пользователя)
временную метку начала транзакции
CSN текущего снимка
флаги, указывающие на наличие событий аннулирования
список параметров конфигурации, заданных в текущем сеансе (в том числе имя приложения)
Используя такие состояния транзакций, silkworm
может присоединиться к выполняющейся транзакции или начать новую транзакцию только для чтения с предоставленным снимком CSN
и получить результат.
Обратите внимание, что полное состояние транзакции можно импортировать только на тот сервер, который его экспортировал, а также, что из-за этого метода передачи состояния транзакции вы не можете использовать транспорт Silk без включения снимков CSN
.
70.2.7.2. Интеграция с асинхронным механизмом FDW #
В Подразделе 53.2.2 асинхронные узлы плана ForeignScan
были представлены как способ оптимизации извлечения данных с нескольких узлов, если эти узлы плана были расположены под одним узлом Append
. В стандартной архитектуре PostgreSQL выполнение планов узла ForeignScan
реализовано с использованием сетевого протокола на основе libpq. Чтобы повысить производительность системы при передаче данных и снизить потребление ресурсов, Postgres Pro Shardman использует другой метод обмена данными с удалёнными узлами. Механизм выполнения планов узла ForeignScan
реализован с использованием протокола Silk.
Чтобы включить транспорт Silk в асинхронный исполнитель, были внесены изменения в расширение postgres_fdw. Подключаемый транспорт был реализован как набор интерфейсных функций, входящих в состав расширения Postgres Pro Shardman. Во время выполнения обработчиков, которые взаимодействуют с удалёнными хостами, эти функции вызываются расширением postgres_fdw. Подключаемый транспорт Silk активируется, если предварительно загружено расширение Postgres Pro Shardman и у стороннего сервера есть атрибут extended_features
(применим для любого сервера FDW в кластере Postgres Pro Shardman). В остальных случаях расширение postgres_fdw использует стандартный протокол обмена на основе расширения libpq.
Чтобы деактивировать подключаемый транспорт Silk для выполнения запросов, необходимо установить для параметра конфигурации query_engine_mode
значение ENGINE_NONE
.
В текущей реализации подключаемый транспорт Silk используется исключительно в запросах только для чтения, в частности во время выполнения планов узла ForeignScan
. Для модификации запросов используется стандартный протокол обмена на основе расширения libpq.
При получении строк результатов выполнения запроса с использованием транспорта Silk данные сохраняются в хранилище TupleStoreState
в виде полного набора результатов, который имеет тот же размер, что и возвращаемый удалённым узлом. Структура данных хранилища TupleStoreState
позволяет передавать данные на диск в случае нехватки памяти. Если удалённый узел возвращает большой набор результатов, это не приводит к нехватке памяти (OOM). Как только набор результатов получен в TupleStoreState
, данные копируются в буфер исполнителя ForeignScan
в памяти. Размер этого буфера определяется атрибутом fetch_size
стороннего сервера. Значение по умолчанию (50000
строк) можно изменить, чтобы найти баланс между производительностью (количество вызовов узла ForeignScan
) и потреблением памяти.
Использование подключаемого транспорта Silk для асинхронного ядра FDW приводит к повышению производительности сетевого обмена и снижению потребления системных ресурсов за счёт их лучшего использования, включая количество сетевых подключений.
70.2.8. Представления для диагностики мультиплексора #
Представления в данном разделе отображают информацию о процессе мультиплексирования Silk. Более подробная информация о процессе мультиплексирования silkroad
представлена в разделе Подраздел 70.2.3.
70.2.8.1. shardman.silk_routes
#
В представлении shardman.silk_routes
отображается снимок актуального состояния таблицы маршрутов мультиплексора. Столбцы этого представления приведены в разделе Таблица 70.1.
Таблица 70.1. Столбцы shardman.silk_routes
Имя | Тип | Описание |
---|---|---|
hashvalue | integer | Внутренний уникальный идентификатор маршрута. Он может использоваться для соединения с другими диагностическими представлениями Silk. |
origin_ip | inet | IP-адрес узла-источника, сгенерировавшего данный маршрут |
origin_port | int2 | Внешний порт соединения по протоколу TCP узла-источника, сгенерировавшего данный маршрут |
channel_id | integer | Порядковый номер маршрута в пределах узла, который сгенерировал данный маршрут. channel_id уникален для пары origin_ip + origin_port . Данная пара является уникальным идентификатором узла в кластере Postgres Pro Shardman, и, таким образом, кортеж, состоящий из origin_ip + origin_port + channel_id , является уникальным идентификатором маршрута в кластереPostgres Pro Shardman. |
from_cn | integer | Для входящих маршрутов (то есть маршрутов, не сгенерированных данным узлом) содержит индекс соединения в представлении shardman.silk_connects , а для сгенерированных данным узлом маршрутов — -1. |
backend_id | integer | Идентификатор локального процесса, который в данный момент использует этот маршрут: либо идентификатор обслуживающего процесса, сгенерировавшего этот маршрут, либо идентификатор рабочего процесса silkworm , которому назначен маршрут. Для входящих маршрутов в очереди заданий, которые ещё не назначены рабочим процессам, — -1. |
pending_queue_bytes | bigint | Размер очереди отложенных сообщений (ожидающих свободный рабочий процесс) для данного маршрута, в байтах. Это значение применимо только для входящих маршрутов каждого узла, которым ещё не назначен рабочий процесс. |
pending_queue_messages | bigint | Число сообщений в очереди отложенных сообщений в ожидании рабочего процесса для данного маршрута. Это значение применимо только для входящих маршрутов каждого узла, которым ещё не назначен рабочий процесс. |
connects | integer[] | Список индексов соединений, которые сейчас используют данный маршрут. |
70.2.8.2. shardman.silk_connects
#
В представлении shardman.silk_connects
отображается список текущих соединений мультиплексора. Столбцы представления приведены в разделе Таблица 70.2.
Таблица 70.2. Столбцы shardman.silk_connects
Имя | Тип | Описание |
---|---|---|
cn_index | integer | Уникальный индекс соединения |
reg_ip | inet | «Регистрационный» IP-адрес узла, с которым установлено соединение. Более подробное описание представлено в разделе Примечания. |
reg_port | int2 | «Регистрационный» TCP-порт узла, с которым установлено соединение. Более подробное описание представлено в разделе Примечания. |
read_ev_active | boolean | true , если мультиплексор готов к получению данных во входящую очередь. Более подробное описание представлено в разделе Примечания. |
write_ev_active | boolean | true , если мультиплексор заполнил очередь неотправленными сообщениями и ожидает её освобождения. Более подробная информация представлена в разделе Примечания. |
is_outgoing | boolean | true для исходящих соединений (созданных командой connect ), false для входящих соединений (созданных командой accept ). Используется только в процессе начального обмена сообщениями. |
state | text | Текущее состояние соединения: connected — соединение установлено, in progress — клиент уже подключился, но начальное согласование ещё не произошло, и free — клиент отключился, но соединение ещё не было разорвано. |
pending_queue_bytes | bigint | Размер очереди неотправленных сообщений для данного соединения, в байтах |
pending_queue_messages | bigint | Число сообщений в очереди из неотправленных сообщений для данного соединения |
blocked_by_backend | integer | Идентификатор обслуживающего процесса, блокирующего данное соединение |
blocks_backends | integer[] | Список идентификаторов обслуживающих процессов, заблокированных данным соединением |
routes | integer[] | Список уникальных идентификаторов маршрутов, использующих данное соединение |
elapsed_time_write | bigint | Время с последней записи подключения |
elapsed_time_read | bigint | Время с последнего чтения подключения |
70.2.8.3. shardman.silk_backends
#
В представлении shardman.silk_backends
отображается список текущих процессов двух типов: обслуживающие процессы для клиентских соединений и рабочие процессы silkworm
мультиплексора, которые с ним взаимодействуют. Столбцы данного представления описаны в разделе Таблица 70.3.
Таблица 70.3. Столбцы shardman.silk_backends
Имя | Тип | Описание |
---|---|---|
backend_id | integer | Уникальный идентификатор обслуживающего/рабочего процесса |
pid | integer | Идентификатор процесса ОС |
attached | boolean | Приобретает значение true , если процесс привязан к мультиплексору, в противном случае false |
read_ev_active | boolean | true , если обслуживающий/рабочий процесс готов к получению данных во входящую очередь. Более подробное описание представлено в разделе Примечания. |
write_ev_active | boolean | true , если обслуживающий/рабочий процесс заполнил очередь неотправленных сообщений и ожидает её освобождения. Более подробное описание представлено в разделе Примечания. |
is_worker | boolean | true , если данный процесс — это рабочий процесс silkworm мультиплексора; false , если любой другой |
pending_queue_bytes | bigint | Размер очереди сообщений, отправляемых этому обслуживающему/рабочему процессу, в байтах |
pending_queue_messages | bigint | Число сообщений в очереди сообщений, отправляемых этому обслуживающему/рабочему процессу |
blocked_by_connect | integer | Индекс соединения, блокирующего данный обслуживающий/рабочий процесс |
blocks_connects | integer[] | Список индексов соединений, заблокированных данным обслуживающим/рабочим процессом |
routes | integer[] | Список уникальных идентификаторов маршрутов, используемых данным обслуживающим/рабочим процессом |
in_queue_used | bigint | Объём данных входящей очереди в байтах в общей памяти между обслуживающим процессом и мультиплексором |
out_queue_used | bigint | Объём данных (в байтах) исходящей очереди в общей памяти между обслуживающим процессом и мультиплексором |
elapsed_time_write | bigint | Время с последней записи рабочего процесса |
elapsed_time_read | bigint | Время с последнего чтения с рабочего процесса |
70.2.8.4. shardman.silk_routing
#
В представлении shardman.silk_routing
отображается результат работы функции shardman.silk_routing
. Столбцы этого представления приведены в Таблице 70.4.
Таблица 70.4. Столбцы shardman.silk_routing
Имя | Тип | Описание |
---|---|---|
hashvalue | integer | Внутренний уникальный идентификатор маршрута |
origin_ip | inet | IP-адрес узла, сгенерировавшего данный маршрут |
origin_port | int2 | Внешний порт соединения по протоколу TCP узла-источника, сгенерировавшего данный маршрут |
channel_id | integer | Порядковый номер маршрута в пределах узла, сгенерировавшего данный маршрут |
is_outgoing | boolean | true , если маршрут был создан исходящим сетевым соединением, false , если он был создан входящим сетевым соединением. |
pending_queue_bytes | bigint | Размер очереди заданий в байтах |
pending_queue_messages | bigint | Количество сообщений в очереди заданий |
backend_id | integer | Идентификатор локального процесса, который в данный момент использует этот маршрут: либо идентификатор обслуживающего процесса, сгенерировавшего этот маршрут, либо идентификатор рабочего процесса silkworm , которому назначен маршрут. Для входящих маршрутов в очереди заданий, которые ещё не назначены рабочим процессам, — -1. |
backend_pid | integer | Идентификатор серверного процесса, обслуживающего текущий сеанс |
attached | boolean | Приобретает значение true , если процесс привязан к мультиплексору, в противном случае false |
backend_rd_active | boolean | true , если обслуживающий/рабочий процесс готов к получению данных во входящую очередь. Более подробное описание представлено в разделе Примечания. |
backend_wr_active | boolean | true , если обслуживающий/рабочий процесс заполнил очередь неотправленных сообщений и ожидает её освобождения. Более подробное описание представлено в разделе Примечания. |
is_worker | boolean | true , если данный процесс — это рабочий процесс silkworm мультиплексора; false , если любой другой |
backend_blocked_by_cn | integer | Индекс соединения, блокирующего данный обслуживающий/рабочий процесс |
blocks_connects | integer[] | Список индексов соединений, заблокированных данным обслуживающим/рабочим процессом |
in_queue_used | bigint | Объём данных входящей очереди в байтах в общей памяти между обслуживающим процессом и мультиплексором |
out_queue_used | bigint | Объём данных (в байтах) исходящей очереди в общей памяти между обслуживающим процессом и мультиплексором |
connect_id | integer | Уникальный индекс соединения |
reg_ip | inet | «Регистрационный» IP-адрес узла, с которым установлено соединение |
reg_port | int2 | «Регистрационный» TCP-порт узла, с которым установлено соединение |
connect_rd_active | boolean | true , если мультиплексор готов к получению данных во входящую очередь |
connect_wr_active | boolean | true , если мультиплексор заполнил очередь неотправленными сообщениями и ожидает её освобождения |
connect_is_outgoing | boolean | true для исходящих соединений (созданных командой connect ), false для входящих соединений (созданных командой accept ). Используется только в процессе начального обмена сообщениями. |
connect_state | text | Текущее состояние соединения: connected — соединение установлено, in progress — клиент уже подключился, но начальное согласование ещё не произошло, и free — клиент отключился, но соединение ещё не было разорвано |
connect_outgoing_queue_bytes | bigint | Размер очереди неотправленных сообщений для данного соединения, в байтах |
connect_outgoing_queue_messages | bigint | Число сообщений в очереди из неотправленных сообщений для данного соединения |
connect_blocked_by_bk | integer | Идентификатор обслуживающего процесса, блокирующего данное соединение |
blocks_backends | integer[] | Список идентификаторов обслуживающих процессов, заблокированных данным соединением |
connect_elapsed_time_write | bigint | Время с последней записи подключения |
connect_elapsed_time_read | bigint | Время с последнего чтения подключения |
backend_elapsed_time_write | bigint | Время с последней записи рабочего процесса |
backend_elapsed_time_read | bigint | Время с последнего чтения с сервера |
70.2.8.5. shardman.silk_pending_jobs
#
В представлении shardman.silk_pending_jobs
отображается список текущих маршрутов в очереди заданий мультиплексора, которые ещё не назначены рабочим процессам. Столбцы представления приведены в разделе Таблица 70.5.
Таблица 70.5. Столбцы shardman.silk_pending_jobs
Имя | Тип | Описание |
---|---|---|
hashvalue | integer | Внутренний уникальный идентификатор маршрута |
origin_ip | inet | IP-адрес узла, сгенерировавшего данный маршрут |
origin_port | int2 | Порт соединения по протоколу TCP узла, сгенерировавшего данный маршрут |
channel_id | integer | Порядковый номер маршрута в пределах узла, сгенерировавшего данный маршрут |
query | text | Первое сообщение в очереди заданий |
pending_queue_bytes | bigint | Размер очереди заданий в байтах |
pending_queue_messages | bigint | Количество сообщений в очереди заданий |
70.2.8.6. shardman.silk_statinfo
#
В представлении shardman.silk_statinfo
отображается информация о текущем состоянии мультиплексора. Столбцы представления приведены в разделе Таблица 70.6.
Таблица 70.6. Столбцы shardman.silk_statinfo
Имя | Тип | Описание |
---|---|---|
pid | integer | Идентификатор процесса silkroad |
started_at | timestamp with time zone | Время запуска процесса silkroad |
transferred_bytes | json | Объект JSON из пар ключ/значение, в которой ключ — тип сообщения, а значение — общее число байтов, отправленных для такого типа сообщений при условии, что было послано хотя бы одно сообщение такого типа |
transferred_pkts | json | Объект JSON из пар ключ/значение, в которой ключ — тип сообщения, а значение — общее число отправленных сообщений такого типа при условии, что было послано хотя бы одно сообщение такого типа |
transferred_max | json | Объект JSON из пар ключ/значение, в которой ключ — тип сообщения, а значение — максимальный размер сообщения такого типа при условии, что было послано хотя бы одно сообщение такого типа |
memcxt_dpg_allocated | bigint | Значение mem_allocated процесса DPGMemoryContext |
memcxt_top_allocated | bigint | Значение mem_allocated процесса TopMemoryContext |
read_efd_max | bigint | Максимальное время чтения eventfd с момента перезапуска |
write_efd_max | bigint | Максимальное время записи eventfd с момента перезапуска |
read_efd_total | bigint | Общее время чтения eventfd с момента перезапуска |
write_efd_total | bigint | Общее время записи eventfd с момента перезапуска |
read_efd_count | bigint | Общее количество событий чтения eventfd с момента перезапуска |
write_efd_count | bigint | Общее количество событий записи eventfd с момента перезапуска |
sort_time_max | bigint | Максимальное время операций сортировки с включением silk_flow_control (при значении, отличном от none ) |
sort_time_total | bigint | Общее время операций сортировки с включением silk_flow_control (при значении, отличном от none ) |
sort_time_count | bigint | Общее количество операций сортировки с включением silk_flow_control (при значении, отличном от none ) |
Обратите внимание, что значения для read_efd_max
, write_efd_max
, read_efd_total
, write_efd_total
, read_efd_count
, write_efd_count
, sort_time_max
, sort_time_total
и sort_time_count
рассчитываются, только если включён параметр конфигурации shardman.silk_track_time.
70.2.8.7. shardman.silk_state
#
В представлении shardman.silk_state
отображается снимок текущего состояния процесса silkroad
. Столбцы этого представления приведены в разделе Таблица 70.7.
Таблица 70.7. Столбцы shardman.silk_state
Имя | Тип | Описание |
---|---|---|
state | text | Состояние процесса silkroad |
70.2.8.8. Замечания #
reg_ip
и reg_port
являются не фактическими сетевыми адресами, а адресами, через которые мультиплексор подключается к узлу. Они определяются в ходе начального согласования между мультиплексором и узлами и равны параметрам соответствующих серверов из таблицы pg_foreign_server
.
Если мультиплексор находится в состоянии idle
, для параметра read_ev_active
устанавливаются значения true
и для параметра write_ev_active
устанавливаются значения false
.
70.2.8.9. Глобальные представления #
В Shardman есть ряд глобальных представлений, основанных на соответствующих локальных представлениях. Определение столбцов глобального представления совпадает с их определением в соответствующем локальном представлении. Глобальное представление показывает объединение результатов выборки из соответствующих локальных представлений. Строки возвращаются из каждого узла кластера. В глобальных представлениях в столбце rgid
выводятся идентификаторы группы репликации узла, из которого взяты строки.
Ниже представлен список глобальных представлений со ссылками на соответствующие локальные представления:
Таблица 70.8. Глобальные и локальные представления, связанные с Silk
Глобальное представление | Локальное представление | Описание |
---|---|---|
shardman.gv_silk_routes | shardman.silk_routes | По одной строке, отображающей снимок актуального состояния таблицы маршрутов мультиплексора. |
shardman.gv_silk_connects | shardman.silk_connects | По одной строке, отображающей список текущих соединений мультиплексора. |
shardman.gv_silk_backends | shardman.silk_backends | По одной строке, отображающей список текущих процессов двух типов: обслуживающие процессы для клиентских соединений и рабочие процессы silkworm мультиплексора, которые с ним взаимодействуют. |
shardman.gv_silk_pending_jobs | shardman.silk_pending_jobs | По одной строке, отображающей список текущих маршрутов в очереди заданий мультиплексора, которые ещё не назначены рабочим процессам. |
shardman.gv_silk_routing | shardman.silk_routing | По одной строке, отображающей результат работы функции shardman.silk_routing . |
70.2.9. Функции #
-
shardman.silk_statinfo_reset()
# Сбрасывает значение метрик с префиксом
transferred_
и временных метрик (с префиксамиread_efd_
,write_efd_
иsort_time_
) в представленииshardman.silk_statinfo
.-
shardman.silk_routing()
# Выводит результаты функций мультиплексора
silk_connects
,silk_backends
иsilk_routes
.-
shardman.silk_rbc_snap()
# Выводит согласованный снимок всех соединений, процессов и маршрутов, которые могут использоваться функциями
silk_connects
,silk_backends
иsilk_routes
.