Обслуживание

Внутренние представления управления

  • mx_stream хранит базовую информацию о потоках.
  • mx_stream_slot поддерживает сопоставление между потоками и слотами, а также другие метаданные.
  • В pg_class добавлены два поля:
    • relisstream указывает, является ли таблица потоком.
    • relhasdownstream указывает, существуют ли потоки downstream.

Управление конфигурацией

  • mx_max_number_streams ограничивает максимальное количество потоков значением 8. Изменение этого параметра требует перезапуска базы данных.
  • max_replication_slots управляет количеством репликационных слотов на каждом сегментном узле. Каждый поток использует один репликационный слот.
  • log_min_messages для логов, связанных с потоками, по умолчанию установлен в DEBUG4. Это значение можно изменить на уровне сессии. При отладке проблем установите в LOG.
  • mx_stream_print_plan и mx_stream_print_parsed_plan: при включении выводятся дополнительные детали плана выполнения при создании потока. Полезно для диагностики производительности. Можно включать или отключать на уровне сессии.
  • Установите client_min_messages в notice, чтобы включить более подробные логи выполнения при создании потоков.
  • mx_stream_debug_print отключен по умолчанию. При включении генерирует обширные отладочные логи. Используйте только временно для разработки или анализа сбоев.
  • mx_stream_allow_any_provider отключен по умолчанию. При включении позволяет создавать потоки любого типа. Только для использования разработчиками.
  • mx_stream_allow_dml позволяет выполнять прямые DML-операции над данными потока. Это опасная настройка; изменяйте с осторожностью.
  • mx_stream_allow_noindex_join позволяет создавать соединения двойных потоков без индексов.
  • mx_stream_xlog_prefetch_bytes и mx_stream_xlog_prefetch_records:
    • mx_stream_xlog_prefetch_bytes управляет объемом XLOG, сканируемым каждым процессом для каждой таблицы потока (не размером действительных записей лога).
    • mx_stream_xlog_prefetch_records ограничивает количество действительных записей, обрабатываемых за одну партию.
  • Рекомендуется установить mx_stream_xlog_prefetch_bytes в 0 и настраивать mx_stream_xlog_prefetch_records в соответствии с реальными требованиями нагрузки.

Частые операции управления

  • Список существующих потоков
=# select /*streamoid,*/streamrelid::regclass,dbid,provider,plugin,querytext from mx_stream;
 streamoid | streamrelid | dbid  | provider |   plugin   | querytext 
-----------+-------------+-------+----------+------------+-----------
     23184 | s8          | 19789 | mxstream | simple_one | 
     23195 | s1          | 19789 | mxstream | domino_agg | 
     23222 | s61         | 19789 | mxstream | simple_one | 
     23230 | s62         | 19789 | mxstream | simple_one | 
     23244 | s51         | 19789 | mxstream | simple_one | 
     23252 | s52         | 19789 | mxstream | simple_one | 
     23266 | s3          | 19789 | mxstream | simple_one | 
     23280 | s4          | 19789 | mxstream | simple_one | 
(8 rows)
  • Удаление потока
=# drop stream s8;
DROP STREAM
  • Настройка максимального количества потоков в базе данных
gpconfig -c max_replication_slots -v 100
gpconfig -c mx_max_number_streams -v 100

Note: A database restart is required after these changes.
Note: Increasing the limit causes the postgres process to allocate additional shared memory; therefore, setting it too high is not recommended.
  • Проверка объектов, имеющих таблицы потоков downstream
=# select relname,relkind,relisstream,relhasdownstream  from pg_class where relname ='t8';
 relname | relkind | relisstream | relhasdownstream 
---------+---------+-------------+------------------
 t8      | r       | f           | t
(1 row)

=# select relname,relkind,relisstream,relhasdownstream  from pg_class where relname ='s8';
 relname | relkind | relisstream | relhasdownstream 
---------+---------+-------------+------------------
 s8      | r       | t           | f
(1 row)
  • Просмотр определения потока

    • С использованием клиента psql:
\dS+ s8
                                TABLE "public.s1"
 Column |  Type   | Collation | Nullable | Default | Storage | Stats target | Description
--------+---------+-----------+----------+---------+---------+--------------+-------------
 id     | integer |           |          |         | plain   |              |
 v1     | integer |           |          |         | plain   |              |
 v2     | integer |           |          |         | plain   |              |
STREAM definition:
 SELECT t1.id,
    t1.v1,
    t2.v2
   FROM STREAMING t1
     JOIN STREAMING t2 ON t1.id = t2.id;
DISTRIBUTED BY: (id)
Access method: heap
- С использованием других SQL-клиентов:
SELECT pg_catalog.pg_get_viewdef('s1');

                pg_get_viewdef
-----------------------------------------------
  SELECT t1.id,                               +
     t1.v1,                                   +
     t2.v2                                    +
    FROM (STREAMING t1                        +
      JOIN STREAMING t2 ON ((t1.id = t2.id)));
  • Проверка эффективности обработки данных каждого потока через лог мастера
cat gpdb-2024-08-26_121305.csv | grep -iE "77748" | grep -iE -A1 "process" | awk -F',' '{print $1"-"$19}' | grep -v '^-' | sed -n '{N;s/\n/\t/p}' | sed 's/processed.*execution took//g' > /tmp/stream1_77748.log
  • Проверка прогресса репликационных слотов для каждого потока на сегментных узлах
select slot_name,restart_lsn,pg_wal_lsn_diff(pg_current_wal_lsn(),confirmed_flush_lsn)/8/1024 as currentlsn_diff from pg_replication_slots; \watch 1
  • Проверка согласованности таблиц потоков между сегментами
for i in {20000..20010};  
do
   PGOPTIONS='-c gp_role=utility' psql -d yonyou_ap -U ap_test -h 127.0.0.1 -p $i -c "select count(*) from pg_replication_slots;";
done

for i in {20000..20010}; 
do  
  PGOPTIONS='-c gp_role=utility' psql -d yonyou_ap -U ap_test -h 127.0.0.1 -p $i -c "select pg_drop_replication_slot('stream_slot_27534');"; 
done

for i in {20000..20010};  
do
   PGOPTIONS='-c gp_role=utility' psql -d yonyou_ap -U ap_test -h 127.0.0.1 -p $i -c "select count(*) from pg_class where relisstream is true;";
done