Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

Настройка СУБД с помощью GUC

Павел Семёнов

Этот раздел описывает настройку кластера Greengage DB (на основе Greenplum) с помощью параметров конфигурации.

Общая информация о конфигурации

СУБД Greengage DB предоставляет гибкий механизм настройки кластера с помощью параметров конфигурации. Каждый параметр определяет конкретный аспект поведения кластера, например, лимит ресурса, параметр выполнения запросов или логирования. Доступные параметры описаны в справочнике Конфигурационные параметры сервера (GUC).

Многие параметры конфигурации в Greengage DB унаследованы из PostgreSQL, другие — специфичны для ее распределенной архитектуры. В PostgreSQL этот механизм настройки называется Grand Unified Configuration (GUC). Общую информацию о GUC можно найти в документации по конфигурации PostgreSQL.

ПРИМЕЧАНИЕ

Аббревиатура GUC также иногда расшифровывается как Global User Configuration.

Параметры GUC должны быть согласованы на всех сегментах кластера Greengage DB. Различия в конфигурациях сегментов могут привести к непредсказуемому поведению или ошибкам. При этом конфигурация мастера может отличаться. Она автоматически синхронизируется с резервным мастером.

Конфигурация хранится в файлах postgresql.conf, расположенных в каталогах данных экземпляров кластера. Внутри базы данных конфигурация доступна через представление системного каталога pg_catalog.pg_settings. Также Greengage DB включает утилиту gpconfig для управления конфигурацией через командную строку.

Типы и значения параметров

Параметры конфигурации в Greengage DB имеют следующие типы:

  • логический (boolean)

  • целочисленный (integer)

  • вещественный (с плавающей точкой, floating point)

  • строка (string)

  • перечисление (enumeration)

Типы параметров можно узнать в столбце vartype представления pg_settings. Соответствующие им значения: bool, integer, real, string и enum.

Ниже приведены подробные описания каждого типа.

Логические

Логические параметры принимают значения, соответствующие true и false:

  • true: TRUE, ON, YES, 1

  • false: FALSE, OFF, NO, 0

Значения регистронезависимы. Также можно использовать однозначные префиксы этих значений. Например, y и n означают true и false соответственно.

Примеры:

optimizer = on
ssl = TRUE
track_activities = y

Числа и единицы измерения

Числовые параметры могут быть целыми или вещественными:

  • Целые значения записываются привычным образом: 0, 1, -10.

  • Вещественные значения используют точку (.) в качестве десятичного разделителя: 0.05.

  • Разделители тысячных разрядов не используются: 10000, а не 10 000 или 10,000.

  • Некоторые числовые параметры имеют ограниченные диапазоны значений. Их можно узнать в столбцах min_val и max_val представления pg_settings.

Примеры:

max_connections = 250
extra_float_digits = -5
max_appendonly_tables = 10000
cpu_tuple_cost = 0.02
memory_spill_ratio = 10 # allowed range 0-100

Допустимые значения можно узнать так:

  • Из представления pg_settings:

    SELECT name, min_val, max_val FROM pg_settings WHERE name = 'memory_spill_ratio';

    Результат:

            name        | min_val | max_val
    --------------------+---------+---------
     memory_spill_ratio | 0       | 100
    (1 row)
  • С помощью утилиты gpconfig:

    $ gpconfig -l | grep memory_spill_ratio

    Результат:

[name: memory_spill_ratio] [unit: ] [context: user] [vartype: integer] [min_val: 0] [max_val: 100]

Некоторые числовые параметры задают объем памяти или количество времени. Для них можно явно указать единицу измерения. Для этого введите значение с единицей измерения в одинарных кавычках без пробела, например, '100MB'.

Если единица не указана, используется единица по умолчанию. Единицы по умолчанию различаются для разных параметров. Обычно это килобайты, блоки (восемь килобайт) или мегабайты для памяти, и миллисекунды, секунды или минуты для времени. Узнать единицу измерения по умолчанию для определенного параметра можно в столбце unit представления pg_settings.

Поддерживаются следующие единицы:

  • Объем памяти: kB (килобайты), MB (мегабайты), GB (гигабайты), TB (терабайты).

    ПРИМЕЧАНИЕ

    Для единиц измерения памяти используется множитель 1024, а не 1000.

  • Время: ms (миллисекунды), s (секунды), min (минуты), h (часы), d (дни).

Названия единиц регистрозависимы.

Примеры:

statement_mem = '256MB'
authentication_timeout = '2min'

Единицу измерения, используемую для параметра по умолчанию, можно узнать так:

  • Из представления pg_settings:

    SELECT name, unit FROM pg_settings WHERE name = 'statement_mem';

    Результат:

         name      | unit
    ---------------+------
     statement_mem | kB
    (1 row)
  • С помощью утилиты gpconfig:

    $ gpconfig -l | grep statement_mem

    Результат:

[name: statement_mem] [unit: kB] [context: user] [vartype: integer] [min_val: 1000] [max_val: 2147483647]

Строки и перечисления

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

application_name = 'My cluster'
search_path = public

Параметры-перечисления (enum) — это строковые значения, ограниченные заданным набором допустимых значений, например:

log_error_verbosity = 'VERBOSE' # enum: one of allowed values

Допустимые значения enum-параметров можно узнать из столбца enumvals представления pg_settings:

SELECT name, enumvals FROM pg_settings WHERE name = 'log_error_verbosity';

Результат:

        name         |        enumvals
---------------------+-------------------------
 log_error_verbosity | {terse,default,verbose}
(1 row)

Классификация параметров

В этом разделе описаны ключевые характеристики параметров GUC в Greengage DB, например, когда и где они могут быть заданы, требуют ли перезапуска кластера или прав суперпользователя для изменения.

Контекст

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

В следующей таблице перечислены доступные способы изменения значений параметров в зависимости от их контекста. Порядок строк отражает возрастание доступности изменения.

Контекст Перезапуск кластера Перезагрузка конфигурации Запуск сессии В сессии (суперпользователь) В сессии (пользователь)

internal

нет

нет

нет

нет

нет

postmaster

да

нет

нет

нет

нет

sighup

да

да

нет

нет

нет

backend

да

да

да

нет

нет

superuser

да

да

да

да

нет

user

да

да

да

да

да

Оригинальные описания возможных значений контекста доступны в описании представления pg_settings в документации PostgreSQL.

В Greengage DB значения контекста применяются следующим образом:

  • internal — параметры доступны только для чтения и не могут быть изменены. Эти параметры отражают внутренние свойства системы и предназначены только для просмотра. Примеры: gp_contentid — идентификатор контента текущего сегмента и gp_dbid — уникальный идентификатор экземпляра базы данных.

  • postmaster — для изменения значений параметров требуется перезапуск кластера:

    $ gpstop -r
  • sighup — параметры можно изменить без перезапуска кластера, с помощью перезагрузки конфигурации:

    $ gpstop -u
    ПРИМЕЧАНИЕ

    Параметры с контекстами internal, postmaster и sighup также называются параметрами типа system.

  • backend — параметры могут быть заданы в PG_OPTIONS при запуске сессии:

    $ PGOPTIONS='-c gp_session_role=utility' psql postgres
  • superuser и user — параметры могут быть изменены в работающем кластере с помощью SQL-команд суперпользователями и обычными пользователями соответственно. Параметры с контекстом superuser обычно управляют чувствительными или низкоуровневыми аспектами работы системы.

    ПРИМЕЧАНИЕ

    Параметры с контекстами superuser и user также называются параметрами типа session.

    Они могут быть заданы на следующих уровнях:

    • Уровень сессии применяется только к текущей сессии.

    • Уровень базы данных и роли применяется к сессиям определенной роли в конкретной базе данных.

    • Уровень роли применяется ко всем сессиям определенной роли.

    • Уровень базы данных применяется ко всем сессиям в заданной базе данных.

    • Системный уровень — он используется для всех сессий, ролей и баз данных, если параметр не задан на других уровнях. Значения системного уровня задаются в файле postgresql.conf.

      ВАЖНО

      Если параметр задан только на системном уровне, то его изменение требует перезапуска кластера или перезагрузки конфигурации.

    Если параметр задан на нескольких уровнях, приоритет имеет самый детализированный уровень. Например, значение на уровне роли перекрывает значение на уровне базы данных. Значения, установленные для текущей сессии, имеют наивысший приоритет.

Вы можете узнать контекст параметра из столбца context системного представления pg_settings или из вывода gpconfig -l:

SELECT name, setting, unit, context
FROM pg_settings WHERE name ='statement_mem';

Результат:

     name      | setting | unit | context
---------------+---------+------+---------
 statement_mem | 524288  | kB   | user
(1 row)

Контекст user означает, что значение параметра может изменить обычный пользователь в рамках сессии без перезапуска кластера.

master и local

Эта классификация введена дополнительно к контекстам PostgreSQL для поддержки распределенной архитектуры Greengage DB. Поскольку кластер состоит из нескольких экземпляров PostgreSQL различного назначения (мастер и сегменты), их конфигурации могут намеренно отличаться. Поэтому параметры конфигурации делятся на две категории в зависимости от того, где применяется их значение:

  • master — параметры этого типа задаются только на мастере. Они используются только на мастере или при необходимости передаются сегментам во время выполнения. Если параметр не используется на сегментах, его значение игнорируется на них.

    Пример — параметр log_min_messages, который контролирует уровень логирования в кластере. При установке на мастере его значение применяется ко всем экземплярам кластера — уровни логирования на сегментах также изменяются.

  • local — параметры этого типа должны быть заданы на всех сегментах и на мастере. Каждый сегмент использует свое локальное значение, поэтому критически важно, чтобы эти параметры были согласованы на всех сегментах во избежание ошибок в кластере.

    Пример — параметр max_connections — максимально допустимое число активных подключений. Его значение на сегментах обычно больше, чем на мастере. Для согласованности параметров типа local на экземплярах кластера рекомендуется изменять их с помощью утилиты gpconfig. Информация по ее использованию доступна в справочнике gpconfig и в примере ниже.

Управление параметрами

В этом разделе описываются способы получения и изменения параметров конфигурации в Greengage DB. Методы перечислены в порядке возрастания приоритета: каждый следующий метод переопределяет настройки, заданные предыдущими.

postgresql.conf

Каждый экземпляр кластера — мастер или сегмент — имеет собственный конфигурационный файл postgresql.conf. Он находится в каталоге данных экземпляра и читается процессом PostgreSQL при запуске или перезагрузке конфигурации. postgresql.conf — базовый источник значений параметров конфигурации.

Каждая строка файла описывает один параметр в следующем формате:

parameter_name=value

Знак равенства между именем параметра и значением необязателен. Вокруг знака равенства также можно добавить пробелы. Символ # комментирует оставшуюся часть строки.

ВАЖНО

Из-за распределенной архитектуры Greengage DB редактирование вручную не рекомендуется для параметров типа local. Вместо этого следует использовать утилиту gpconfig, которая обеспечивает согласованность значений на всех сегментах.

Чтобы просмотреть значение параметра GUC в postgresql.conf, найдите его по названию:

$ cat $MASTER_DATA_DIRECTORY/postgresql.conf | grep max_connections

Если параметр указан в файле несколько раз, приоритет имеет последнее вхождение. Такая ситуация обычно случается при использовании утилиты gpconfig, которая комментирует строку с предыдущим значением и добавляет новую.

Чтобы изменить значение параметра в postgresql.conf на мастер-хосте, добавьте строку с новым значением в конец файла:

$ echo "max_connections=300" >> $MASTER_DATA_DIRECTORY/postgresql.conf

Эта строка переопределит все предыдущие значения того же параметра.

Затем перезапустите кластер или выполните перезагрузку конфигурации в зависимости от контекста параметра:

$ gpstop -r

или

$ gpstop -u

Для параметра max_connections требуется перезапуск.

Утилита gpconfig

Утилита gpconfig обеспечивает согласованное управление параметрами конфигурации в файлах postgresql.conf на всех экземплярах кластера Greengage DB. В отличие от ручного редактирования, gpconfig гарантирует согласованное обновление всех соответствующих файлов и подходит для настройки параметров обоих типов — master и local. Обратите внимание, что gpconfig только редактирует файлы конфигурации; чтобы применить новые значения, требуется перезагрузка конфигурации или перезапуск кластера.

Чтобы узнать текущее значение параметра, укажите его имя в опции -s (--show):

$ gpconfig -s max_connections

Вывод показывает значения параметра, установленные на мастере и на сегментах кластера:

Values on all segments are consistent
GUC          : max_connections
Master  value: 250
Segment value: 750

Чтобы получить список всех параметров, доступных для настройки через утилиту, используйте опцию -l (--list):

$ gpconfig -l

Каждая строка вывода содержит метаданные одного параметра:

[name: max_connections] [unit: ] [context: postmaster] [vartype: integer] [min_val: 10] [max_val: 8388607]

Чтобы изменить значение параметра во всем кластере, используйте опции -c (--change) и -v (--value):

$ gpconfig -c statement_mem -v '256MB'

Результат:

[INFO]:-completed successfully with parameters '-c statement_mem -v 256MB'

Вы можете отследить изменение значения в postgresql.conf по его последней строке:

$ tail $MASTER_DATA_DIRECTORY/postgresql.conf -n 1

Будет выведено:

statement_mem=256MB

Для применения нового значения необходимо выполнить перезагрузку конфигурации с помощью gpstop:

$ gpstop -u
ПРИМЕЧАНИЕ

В примере используется параметр statement_mem типа reload. Для параметров типа restart потребуется перезапуск кластера:

$ gpstop -r

Чтобы задать разные значения для мастера и сегментов, добавьте опцию -m (--mastervalue) с отдельным значением для мастера:

$ gpconfig -c statement_mem -v '256MB' -m '512MB'

Чтобы изменить значение на мастере и оставить прежнее на сегментах, используйте опции -v и --masteronly:

$ gpconfig -c statement_mem -v '512MB' --masteronly
ПРИМЕЧАНИЕ

Значение для мастера также применяется к резервному мастеру, если он есть в кластере.

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

ВНИМАНИЕ

Используйте gpconfig с опцией --skipvalidation крайне осторожно. Это может привести к несогласованности кластера.

--skipvalidation также позволяет менять значения ограниченных и скрытых параметров, которые нельзя поменять, используя gpconfig в обычном режиме. Например, чтобы изменить значение gp_add_column_inherits_table_setting, выполните:

$ gpconfig -c gp_add_column_inherits_table_setting -v on --skipvalidation

Результат:

20250606:08:06:29:003703 gpconfig:mdw:gpadmin-[INFO]:-completed successfully with parameters '-c gp_add_column_inherits_table_setting -v on --skipvalidation'

Аналогичный вызов без опции --skipvalidation приводит к ошибке.

SQL-команды

Предварительные требования

Для выполнения команд, описанных в этом разделе, подключитесь к мастер-хосту Greengage DB с помощью psql, как описано в разделе Подключение к Greengage DB с использованием psql.

Для просмотра параметров конфигурации используйте команду SHOW:

  • Просмотр текущего значения указанного параметра:

    SHOW max_connections;

    Результат:

     max_connections
    -----------------
     250
    (1 row)
  • Просмотр всех параметров с текущими значениями и описаниями:

    SHOW ALL;

Значения параметров типа session можно задавать из SQL-консоли на различных уровнях конфигурации. Каждый уровень определяет значение по умолчанию, которое может быть переопределено более специфичным уровнем.

Доступные уровни и соответствующие им SQL-команды:

  • Уровень базы данных применяется ко всем сессиям, подключающимся к определенной базе:

    ALTER DATABASE books_store SET optimizer TO off;
  • Уровень роли применяется ко всем сессиям конкретной роли:

    ALTER ROLE alice SET optimizer TO off;
  • Уровень базы данных и роли применяется к сессиям конкретного пользователя в конкретной базе:

    ALTER ROLE alice IN DATABASE books_store SET optimizer TO off;
  • Уровень сессии применяется только к текущей сессии:

    SET optimizer = off;

    Чтобы сбросить параметр уровня сессии до ближайшего менее специфичного уровня, используйте команду RESET:

    RESET optimizer;

Системное представление pg_settings

Системное представление pg_settings позволяет получать подробную информацию о параметрах GUC с помощью SQL-запросов. Оно содержит столбцы с именем параметра, его типом, описанием, текущим значением и другими свойствами.

Чтобы получить значение параметра из pg_settings:

SELECT setting FROM pg_settings WHERE name = 'max_connections';
setting
---------
 250
(1 row)

Чтобы получить больше информации, добавьте в запрос другие столбцы:

SELECT name, setting, unit, context, vartype, min_val, max_val
FROM pg_settings
WHERE name like '%size%';

Результат:

                 name                 | setting | unit |  context   | vartype | min_val |  max_val
--------------------------------------+---------+------+------------+---------+---------+------------
 block_size                           | 32768   |      | internal   | integer | 32768   | 32768
 effective_cache_size                 | 524288  | 32kB | user       | integer | 1       | 2147483647
 gp_enable_relsize_collection         | off     |      | user       | bool    |         |
 gp_instrument_shmem_size             | 5120    | kB   | postmaster | integer | 0       | 131072
 gp_interconnect_cursor_ic_table_size | 128     |      | user       | integer | 128     | 102400
 gp_max_packet_size                   | 8192    |      | backend    | integer | 512     | 65507
 gp_max_plan_size                     | 0       | kB   | superuser  | integer | 0       | 2147483647
 gp_safefswritesize                   | 0       |      | backend    | integer | 0       | 2147483647
 gp_udp_bufsize_k                     | 0       |      | backend    | integer | 0       | 32768
 log_rotation_size                    | 1048576 | kB   | sighup     | integer | 0       | 2097151
 max_slot_wal_keep_size               | -1      | MB   | sighup     | integer | -1      | 2147483647
 optimizer_mdcache_size               | 16384   | kB   | user       | integer | 0       | 2147483647
 pljava_statement_cache_size          | 0       |      | superuser  | integer | 0       | 512
 segment_size                         | 32768   | 32kB | internal   | integer | 32768   | 32768
 track_activity_query_size            | 1024    |      | postmaster | integer | 100     | 102400
 wal_block_size                       | 32768   |      | internal   | integer | 32768   | 32768
 wal_segment_size                     | 2048    | 32kB | internal   | integer | 2048    | 2048
 writable_external_table_bufsize      | 1024    | kB   | user       | integer | 32      | 131072
(18 rows)

Чтобы вывести описание параметра, используйте столбец short_desc:

SELECT name, short_desc FROM pg_settings WHERE name = 'block_size';

Результат:

    name    |           short_desc
------------+---------------------------------
 block_size | Shows the size of a disk block.
(1 row)

Для некоторых параметров также доступна дополнительная информация об использовании в столбце extra_desc.

Столбец source отображает уровень, на котором задано значение параметра, используемое в данный момент. Это особенно полезно для параметров типа session, которые могут быть заданы на нескольких уровнях. Пример:

SELECT name, setting, source
FROM pg_settings WHERE name like '%statement_mem';

Результат:

       name        | setting |       source
-------------------+---------+--------------------
 max_statement_mem | 2048000 | default
 statement_mem     | 524288  | configuration file
(2 rows)

source показывает, что max_statement_mem использует значение по умолчанию, а значение statement_mem переопределено в postgresql.conf.

Измените значение statement_mem для текущей сессии командой SET:

SET statement_mem = '256MB';

Затем выполните тот же запрос. Вывод покажет новое значение и уровень, на котором оно задано — session:

       name        | setting | source
-------------------+---------+---------
 max_statement_mem | 2048000 | default
 statement_mem     | 262144  | session
(2 rows)