70.2. Silk #

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 связывает локальный обслуживающий процесс с рабочими процессами удалённого узла следующим образом:

  1. Обслуживающий процесс использует обычный API postgres_fdw для доступа к удалённым данным. Но postgres_fdw, когда включён silk, записывает запрос в очередь общей памяти вместо подключения libpq;

  2. Процесс Silkroad анализирует входящую очередь общей памяти от этого обслуживающего процесса и направляет сообщение соответствующему сетевому подключению с удалённым процессом silkroad.

  3. Удалённый процесс silkroad захватывает входящее сообщение из сети и (если оно новое) перенаправляет его в доступную очередь общей памяти рабочего процесса (или в специальную очередь «неназначенных заданий», если все рабочие процессы заняты) .

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

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

ИмяТипОписание
hashvalueintegerВнутренний уникальный идентификатор маршрута. Он может использоваться для соединения с другими диагностическими представлениями Silk.
origin_ipinetIP-адрес узла-источника, сгенерировавшего данный маршрут
origin_portint2Внешний порт соединения по протоколу TCP узла-источника, сгенерировавшего данный маршрут
channel_idintegerПорядковый номер маршрута в пределах узла, который сгенерировал данный маршрут. channel_id уникален для пары origin_ip + origin_port. Данная пара является уникальным идентификатором узла в кластере Postgres Pro Shardman, и, таким образом, кортеж, состоящий из origin_ip + origin_port + channel_id, является уникальным идентификатором маршрута в кластереPostgres Pro Shardman.
from_cnintegerДля входящих маршрутов (то есть маршрутов, не сгенерированных данным узлом) содержит индекс соединения в представлении shardman.silk_connects, а для сгенерированных данным узлом маршрутов — -1.
backend_idintegerИдентификатор локального процесса, который в данный момент использует этот маршрут: либо идентификатор обслуживающего процесса, сгенерировавшего этот маршрут, либо идентификатор рабочего процесса silkworm, которому назначен маршрут. Для входящих маршрутов в очереди заданий, которые ещё не назначены рабочим процессам, — -1.
pending_queue_bytesbigintРазмер очереди отложенных сообщений (ожидающих свободный рабочий процесс) для данного маршрута, в байтах. Это значение применимо только для входящих маршрутов каждого узла, которым ещё не назначен рабочий процесс.
pending_queue_messagesbigintЧисло сообщений в очереди отложенных сообщений в ожидании рабочего процесса для данного маршрута. Это значение применимо только для входящих маршрутов каждого узла, которым ещё не назначен рабочий процесс.
connectsinteger[]Список индексов соединений, которые сейчас используют данный маршрут.

70.2.8.2. shardman.silk_connects #

В представлении shardman.silk_connects отображается список текущих соединений мультиплексора. Столбцы представления приведены в разделе Таблица 70.2.

Таблица 70.2. Столбцы shardman.silk_connects

ИмяТипОписание
cn_indexintegerУникальный индекс соединения
reg_ipinet«Регистрационный» IP-адрес узла, с которым установлено соединение. Более подробное описание представлено в разделе Примечания.
reg_portint2«Регистрационный» TCP-порт узла, с которым установлено соединение. Более подробное описание представлено в разделе Примечания.
read_ev_activebooleantrue, если мультиплексор готов к получению данных во входящую очередь. Более подробное описание представлено в разделе Примечания.
write_ev_activebooleantrue, если мультиплексор заполнил очередь неотправленными сообщениями и ожидает её освобождения. Более подробная информация представлена в разделе Примечания.
is_outgoingbooleantrue для исходящих соединений (созданных командой connect), false для входящих соединений (созданных командой accept). Используется только в процессе начального обмена сообщениями.
statetextТекущее состояние соединения: connected — соединение установлено, in progress — клиент уже подключился, но начальное согласование ещё не произошло, и free — клиент отключился, но соединение ещё не было разорвано.
pending_queue_bytesbigintРазмер очереди неотправленных сообщений для данного соединения, в байтах
pending_queue_messagesbigintЧисло сообщений в очереди из неотправленных сообщений для данного соединения
blocked_by_backendintegerИдентификатор обслуживающего процесса, блокирующего данное соединение
blocks_backendsinteger[]Список идентификаторов обслуживающих процессов, заблокированных данным соединением
routesinteger[]Список уникальных идентификаторов маршрутов, использующих данное соединение
elapsed_time_writebigintВремя с последней записи подключения
elapsed_time_readbigintВремя с последнего чтения подключения

70.2.8.3. shardman.silk_backends #

В представлении shardman.silk_backends отображается список текущих процессов двух типов: обслуживающие процессы для клиентских соединений и рабочие процессы silkworm мультиплексора, которые с ним взаимодействуют. Столбцы данного представления описаны в разделе Таблица 70.3.

Таблица 70.3. Столбцы shardman.silk_backends

ИмяТипОписание
backend_idintegerУникальный идентификатор обслуживающего/рабочего процесса
pidintegerИдентификатор процесса ОС
attachedbooleanПриобретает значение true, если процесс привязан к мультиплексору, в противном случае false
read_ev_activebooleantrue, если обслуживающий/рабочий процесс готов к получению данных во входящую очередь. Более подробное описание представлено в разделе Примечания.
write_ev_activebooleantrue, если обслуживающий/рабочий процесс заполнил очередь неотправленных сообщений и ожидает её освобождения. Более подробное описание представлено в разделе Примечания.
is_workerbooleantrue, если данный процесс — это рабочий процесс silkworm мультиплексора; false, если любой другой
pending_queue_bytesbigintРазмер очереди сообщений, отправляемых этому обслуживающему/рабочему процессу, в байтах
pending_queue_messagesbigintЧисло сообщений в очереди сообщений, отправляемых этому обслуживающему/рабочему процессу
blocked_by_connectintegerИндекс соединения, блокирующего данный обслуживающий/рабочий процесс
blocks_connectsinteger[]Список индексов соединений, заблокированных данным обслуживающим/рабочим процессом
routesinteger[]Список уникальных идентификаторов маршрутов, используемых данным обслуживающим/рабочим процессом
in_queue_usedbigintОбъём данных входящей очереди в байтах в общей памяти между обслуживающим процессом и мультиплексором
out_queue_usedbigintОбъём данных (в байтах) исходящей очереди в общей памяти между обслуживающим процессом и мультиплексором
elapsed_time_writebigintВремя с последней записи рабочего процесса
elapsed_time_readbigintВремя с последнего чтения с рабочего процесса

70.2.8.4. shardman.silk_routing #

В представлении shardman.silk_routing отображается результат работы функции shardman.silk_routing. Столбцы этого представления приведены в Таблице 70.4.

Таблица 70.4. Столбцы shardman.silk_routing

ИмяТипОписание
hashvalueintegerВнутренний уникальный идентификатор маршрута
origin_ipinetIP-адрес узла, сгенерировавшего данный маршрут
origin_portint2Внешний порт соединения по протоколу TCP узла-источника, сгенерировавшего данный маршрут
channel_idintegerПорядковый номер маршрута в пределах узла, сгенерировавшего данный маршрут
is_outgoingbooleantrue, если маршрут был создан исходящим сетевым соединением, false, если он был создан входящим сетевым соединением.
pending_queue_bytesbigintРазмер очереди заданий в байтах
pending_queue_messagesbigintКоличество сообщений в очереди заданий
backend_idintegerИдентификатор локального процесса, который в данный момент использует этот маршрут: либо идентификатор обслуживающего процесса, сгенерировавшего этот маршрут, либо идентификатор рабочего процесса silkworm, которому назначен маршрут. Для входящих маршрутов в очереди заданий, которые ещё не назначены рабочим процессам, — -1.
backend_pidintegerИдентификатор серверного процесса, обслуживающего текущий сеанс
attachedbooleanПриобретает значение true, если процесс привязан к мультиплексору, в противном случае false
backend_rd_activebooleantrue, если обслуживающий/рабочий процесс готов к получению данных во входящую очередь. Более подробное описание представлено в разделе Примечания.
backend_wr_activebooleantrue, если обслуживающий/рабочий процесс заполнил очередь неотправленных сообщений и ожидает её освобождения. Более подробное описание представлено в разделе Примечания.
is_workerbooleantrue, если данный процесс — это рабочий процесс silkworm мультиплексора; false, если любой другой
backend_blocked_by_cnintegerИндекс соединения, блокирующего данный обслуживающий/рабочий процесс
blocks_connectsinteger[]Список индексов соединений, заблокированных данным обслуживающим/рабочим процессом
in_queue_usedbigintОбъём данных входящей очереди в байтах в общей памяти между обслуживающим процессом и мультиплексором
out_queue_usedbigintОбъём данных (в байтах) исходящей очереди в общей памяти между обслуживающим процессом и мультиплексором
connect_idintegerУникальный индекс соединения
reg_ipinet«Регистрационный» IP-адрес узла, с которым установлено соединение
reg_portint2«Регистрационный» TCP-порт узла, с которым установлено соединение
connect_rd_activebooleantrue, если мультиплексор готов к получению данных во входящую очередь
connect_wr_activebooleantrue, если мультиплексор заполнил очередь неотправленными сообщениями и ожидает её освобождения
connect_is_outgoingbooleantrue для исходящих соединений (созданных командой connect), false для входящих соединений (созданных командой accept). Используется только в процессе начального обмена сообщениями.
connect_statetextТекущее состояние соединения: connected — соединение установлено, in progress — клиент уже подключился, но начальное согласование ещё не произошло, и free — клиент отключился, но соединение ещё не было разорвано
connect_outgoing_queue_bytesbigintРазмер очереди неотправленных сообщений для данного соединения, в байтах
connect_outgoing_queue_messagesbigintЧисло сообщений в очереди из неотправленных сообщений для данного соединения
connect_blocked_by_bkintegerИдентификатор обслуживающего процесса, блокирующего данное соединение
blocks_backendsinteger[]Список идентификаторов обслуживающих процессов, заблокированных данным соединением
connect_elapsed_time_writebigintВремя с последней записи подключения
connect_elapsed_time_readbigintВремя с последнего чтения подключения
backend_elapsed_time_writebigintВремя с последней записи рабочего процесса
backend_elapsed_time_readbigintВремя с последнего чтения с сервера

70.2.8.5. shardman.silk_pending_jobs #

В представлении shardman.silk_pending_jobs отображается список текущих маршрутов в очереди заданий мультиплексора, которые ещё не назначены рабочим процессам. Столбцы представления приведены в разделе Таблица 70.5.

Таблица 70.5. Столбцы shardman.silk_pending_jobs

ИмяТипОписание
hashvalueintegerВнутренний уникальный идентификатор маршрута
origin_ipinetIP-адрес узла, сгенерировавшего данный маршрут
origin_portint2Порт соединения по протоколу TCP узла, сгенерировавшего данный маршрут
channel_idintegerПорядковый номер маршрута в пределах узла, сгенерировавшего данный маршрут
querytextПервое сообщение в очереди заданий
pending_queue_bytesbigintРазмер очереди заданий в байтах
pending_queue_messagesbigintКоличество сообщений в очереди заданий

70.2.8.6. shardman.silk_statinfo #

В представлении shardman.silk_statinfo отображается информация о текущем состоянии мультиплексора. Столбцы представления приведены в разделе Таблица 70.6.

Таблица 70.6. Столбцы shardman.silk_statinfo

ИмяТипОписание
pidintegerИдентификатор процесса silkroad
started_attimestamp with time zoneВремя запуска процесса silkroad
transferred_bytesjsonОбъект JSON из пар ключ/значение, в которой ключ — тип сообщения, а значение — общее число байтов, отправленных для такого типа сообщений при условии, что было послано хотя бы одно сообщение такого типа
transferred_pktsjsonОбъект JSON из пар ключ/значение, в которой ключ — тип сообщения, а значение — общее число отправленных сообщений такого типа при условии, что было послано хотя бы одно сообщение такого типа
transferred_maxjsonОбъект JSON из пар ключ/значение, в которой ключ — тип сообщения, а значение — максимальный размер сообщения такого типа при условии, что было послано хотя бы одно сообщение такого типа
memcxt_dpg_allocatedbigintЗначение mem_allocated процесса DPGMemoryContext
memcxt_top_allocatedbigintЗначение mem_allocated процесса TopMemoryContext
read_efd_maxbigintМаксимальное время чтения eventfd с момента перезапуска
write_efd_maxbigintМаксимальное время записи eventfd с момента перезапуска
read_efd_totalbigintОбщее время чтения eventfd с момента перезапуска
write_efd_totalbigintОбщее время записи eventfd с момента перезапуска
read_efd_countbigintОбщее количество событий чтения eventfd с момента перезапуска
write_efd_countbigintОбщее количество событий записи eventfd с момента перезапуска
sort_time_maxbigintМаксимальное время операций сортировки с включением silk_flow_control (при значении, отличном от none)
sort_time_totalbigintОбщее время операций сортировки с включением silk_flow_control (при значении, отличном от none)
sort_time_countbigintОбщее количество операций сортировки с включением 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

ИмяТипОписание
statetextСостояние процесса 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_routesshardman.silk_routesПо одной строке, отображающей снимок актуального состояния таблицы маршрутов мультиплексора.
shardman.gv_silk_connectsshardman.silk_connectsПо одной строке, отображающей список текущих соединений мультиплексора.
shardman.gv_silk_backendsshardman.silk_backendsПо одной строке, отображающей список текущих процессов двух типов: обслуживающие процессы для клиентских соединений и рабочие процессы silkworm мультиплексора, которые с ним взаимодействуют.
shardman.gv_silk_pending_jobsshardman.silk_pending_jobsПо одной строке, отображающей список текущих маршрутов в очереди заданий мультиплексора, которые ещё не назначены рабочим процессам.
shardman.gv_silk_routingshardman.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.