Настройка СУБД с помощью 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-команды
Для просмотра параметров конфигурации используйте команду 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)