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

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

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

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

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

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

Многие параметры конфигурации в 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, для каждого параметра определен контекст. Это строковое значение, определяющее возможные способы изменения значения параметра.

Вы можете узнать контекст параметра из колонки 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 означает, что значение параметра может изменить обычный пользователь в рамках сессии без перезапуска кластера. Список возможных значений контекста с описаниями доступен в описании представления pg_settings в документации PostgreSQL.

Разделы ниже описывают, как контексты определяют различные аспекты параметров конфигурации.

session и system

Эта классификация определяет, можно ли изменить параметр в рамках сессии на работающем кластере и на каком уровне он применяется:

  • session — параметры этого типа можно изменить в работающем кластере с помощью SQL-команд. Они могут быть заданы на следующих уровнях:

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

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

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

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

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

      ВАЖНО

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

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

      Параметры типа session обычно имеют контекст user или superuser.

  • system — параметры этого типа задаются в конфигурационном файле postgresql.conf. Для изменения такого параметра требуется перезапуск кластера или перезагрузка конфигурации в зависимости от конкретного параметра.

master и local

ПРИМЕЧАНИЕ

Эта классификация применяется только к параметрам, определенным в файле postgresql.conf (параметры типа system или параметры типа session, заданные на системном уровне).

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

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

Классификация master/local не привязана к контексту PostgreSQL. Она введена дополнительно в связи с распределенной архитектурой Greengage DB.

restart и reload

ПРИМЕЧАНИЕ

Эта классификация применяется только к параметрам, заданным в файле postgresql.conf (параметры типа system или параметры типа session, заданные на системном уровне).

Для изменения параметров со значением postmaster требуется перезапуск кластера. Параметры с другими значениями context, кроме internal, можно изменить с помощью перезагрузки конфигурации (контекст sighup) или без дополнительных действий.

superuser

Параметры типа superuser могут быть изменены только суперпользователем базы данных. Обычно они управляют чувствительными или низкоуровневыми аспектами работы системы. Примеры таких параметров — большинство настроек логирования: log_error_verbosity, log_statement и другие.

Контекст параметров типа superuser — superuser.

read-only

Значения параметров типа read-only нельзя изменить ни суперпользователю, ни обычному пользователю. Эти параметры отражают внутренние свойства системы и доступны только для просмотра.

Примеры:

  • gp_contentid — идентификатор контента текущего сегмента.

  • gp_dbid — уникальный идентификатор экземпляра базы данных.

Контекст параметров типа read-only — internal.

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

В этом разделе описываются способы получения и изменения параметров конфигурации в 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)