Создание кластера PostgreSQL
Кластер PostgreSQL — это один или несколько хостов базы данных, между которыми можно настроить репликацию. Репликация работает по умолчанию в любом кластере из более чем одного хоста: хост-мастер принимает запросы на запись и дублирует изменения в репликах. Транзакция подтверждается, если данные записаны на диск и на хосте-мастере, и на определенном числе реплик, достаточном для формирования кворума.
Примечание
- Количество хостов, которые можно создать вместе с кластером PostgreSQL, зависит от выбранного типа диска и класса хостов.
- Доступные типы диска зависят от выбранного класса хостов.
- Если хранилище БД заполнится на 97%, кластер перейдет в режим только чтения. Рассчитывайте и увеличивайте необходимый размер хранилища заранее или настройте автоматическое увеличение его размера.
По умолчанию Managed Service for PostgreSQL выставляет максимально возможное количество подключений к каждому хосту кластера PostgreSQL. Этот максимум не может быть больше значения настройки Max connections.
Важно
Managed Service for PostgreSQL резервирует 15 подключений для служебных пользователей на каждом PostgreSQL-хосте. Например, если для кластера выставлено значение настройки Max connections 100, то вы можете зарезервировать не больше 85 подключений для пользователей кластера.
Создать кластер
Для создания кластера Managed Service for PostgreSQL нужна роль vpc.user и роль managed-postgresql.editor или выше. О том, как назначить роль, см. документацию Identity and Access Management.
Подключениями к БД кластера управляет сервис Connection Manager. Вместе с кластером автоматически создаются:
-
Подключение Connection Manager с информацией о соединении с БД.
-
Секрет Yandex Lockbox, в котором хранится пароль пользователя — владельца БД. Хранение паролей в сервисе Yandex Lockbox обеспечивает их безопасность.
Подключение и секрет создаются для каждого нового пользователя БД. Чтобы увидеть все подключения, на странице кластера выберите вкладку Подключения.
Для просмотра информации о подключении требуется роль connection-manager.viewer. Вы можете настраивать доступ к подключениям в Connection Manager.
Использование сервиса Connection Manager и секретов, созданных с его помощью, не тарифицируется.
Чтобы создать кластер Managed Service for PostgreSQL:
-
В консоли управления
выберите каталог, в котором нужно создать кластер БД. -
Перейдите в сервис Managed Service for PostgreSQL.
-
Нажмите кнопку Создать кластер.
-
Введите имя кластера в поле Имя кластера. Имя кластера должно быть уникальным в рамках каталога.
-
Выберите окружение, в котором нужно создать кластер (после создания кластера окружение изменить невозможно):
PRODUCTION— для стабильных версий ваших приложений.PRESTABLE— для тестирования. Prestable-окружение аналогично Production-окружению и на него также распространяется SLA, но при этом на нем раньше появляются новые функциональные возможности, улучшения и исправления ошибок. В Prestable-окружении вы можете протестировать совместимость новых версий с вашим приложением.
-
Выберите версию СУБД.
-
Выберите класс хостов — он определяет технические характеристики виртуальных машин, на которых будут развернуты хосты БД. Все доступные варианты перечислены в разделе Классы хостов. При изменении класса хостов для кластера меняются характеристики всех уже созданных хостов.
-
В блоке Размер хранилища:
-
Выберите тип диска.
От выбранного типа зависит, с каким шагом можно будет изменить размер диска:
- Сетевые HDD- и SSD-диски — с шагом 1 ГБ.
- Локальные SSD-диски:
- для платформ Intel Broadwell и Intel Cascade Lake — с шагом 100 ГБ;
- для платформы Intel Ice Lake — с шагом 368 ГБ.
- Нереплицируемые SSD-диски и cверхбыстрые сетевые SSD-диски с тремя репликами — с шагом 93 ГБ.
-
Выберите размер хранилища, который будет использоваться для данных и резервных копий. Подробнее о том, как занимают пространство резервные копии, см. раздел Резервные копии.
-
(Опционально) Выберите опцию Зашифрованный диск, чтобы зашифровать диск пользовательским ключом KMS.
-
Чтобы создать новый ключ, нажмите кнопку Создать.
-
Чтобы использовать созданный ранее ключ, выберите его в поле Ключ KMS.
Подробнее о шифровании дисков см. в разделе Хранилище.
-
-
-
(Опционально) В блоке Автоматическое увеличение размера хранилища укажите желаемые настройки:
-
В поле Увеличивать размер задайте соответствующие условия, чтобы:
- Размер хранилища увеличился в следующее окно обслуживания, когда хранилище окажется заполнено более чем на указанную долю (%).
- Размер хранилища увеличился незамедлительно, когда хранилище окажется заполнено более чем на указанную долю (%).
Можно задать оба условия, но порог для незамедлительного увеличения должен быть выше порога для увеличения в окно обслуживания.
Подробнее об условиях для увеличения хранилища см. в соответствующем разделе.
-
В поле Максимальный размер хранилища укажите максимальный размер хранилища, который может быть установлен при автоматическом увеличении размера хранилища.
Если заданный порог достигнут, размер хранилища увеличивается по-разному в зависимости от типа диска:
-
Для сетевых HDD- и SSD-дисков — на большее из двух значений: 20 ГБ или 20% от текущего размера диска.
-
Для нереплицируемых SSD-дисков и сверхбыстрых сетевых SSD-дисков с тремя репликами — на 93 ГБ.
-
Для локальных SSD-дисков:
- В кластере на платформе Intel Broadwell или Intel Cascade Lake — на 100 ГБ.
- В кластере на платформе Intel Ice Lake — на 368 ГБ.
Если порог срабатывания достигнут повторно, размер хранилища будет автоматически увеличиваться, пока не достигнет заданного максимума. После этого вы можете задать новый максимальный размер хранилища вручную.
Важно
- Размер хранилища нельзя уменьшить.
- Во время изменения размера хранилища хосты кластера будут недоступны.
Примечание
Некоторые настройки PostgreSQL зависят от размера хранилища.
Если настроено увеличение хранилища в окно обслуживания, настройте расписание окна обслуживания.
-
-
В блоке База данных укажите атрибуты БД:
-
Имя БД. Это имя должно быть уникальным в рамках каталога.
Имя базы может содержать латинские буквы, цифры, подчеркивание и дефис. Максимальная длина имени 63 символа. Имена
postgres,template0,template1зарезервированы для собственных нужд Managed Service for PostgreSQL. Создавать базы с этими именами нельзя. -
Имя пользователя — владельца БД. По умолчанию новому пользователю выделяется 50 подключений к каждому хосту кластера. Изменить допустимое количество подключений можно с помощью настройки Conn limit.
Имя пользователя может содержать латинские буквы, цифры, дефис и подчеркивание, но должно начинаться с буквы (кроме сочетания
pg_), цифры или подчеркивания. Максимальная длина имени 63 символа.Имена
admin,repl,monitor,postgres,mdb_admin,mdb_monitor,mdb_replicationзарезервированы для собственных нужд Managed Service for PostgreSQL. Создавать пользователей с этими именами нельзя. -
Пароль:
-
Ввести вручную — выберите, чтобы ввести свой пароль. Длина пароля — от 8 до 128 символов.
-
Сгенерировать — выберите, чтобы сгенерировать пароль с помощью сервиса Connection Manager.
Чтобы увидеть пароль, после создания кластера выберите вкладку Пользователи и нажмите Посмотреть пароль в строке нужного пользователя. Откроется страница секрета Yandex Lockbox, в котором хранится пароль. Для просмотра паролей требуется роль
lockbox.payloadViewer. -
-
Локаль сортировки и локаль набора символов. Эти настройки определяют правила, по которым производится сортировка строк (
LC_COLLATE) и классификация символов (LC_CTYPE). В Managed Service for PostgreSQL настройки локали действуют на уровне отдельно взятой БД.PostgreSQL использует локали для поддержки различных языковых стандартов. Выбор локали влияет на:
- Порядок сортировки в запросах с использованием оператора
ORDER BYили стандартных операторов сравнения текстовых данных. - Функции
upper,lower,initcap, а также семейство функцийto_char. - Операторы поиска по шаблону (
LIKE,ILIKE,SIMILAR TO, регулярные выражения). - Возможность использовать индексы с оператором
LIKE.
По умолчанию используется локаль
C. При использовании кодировкиCдля текстовых данных с нелатинскими (например, кириллическими) символами возможны ошибки в порядке сортировки данных и отображении данных при поиске по шаблону. Если эта локаль не подходит для корректной обработки таблиц в базе данных, выберите другую из списка. Однако учитывайте, что использование нестандартной локали может снизить скорость выполнения запросов к базе данных.Подробнее о настройках локали см. в документации PostgreSQL
.Настройки локали нельзя изменить после создания базы данных. Но вы можете задать локаль сортировки для столбцов при создании и изменении отдельных таблиц. Подробнее читайте в документации PostgreSQL
. - Порядок сортировки в запросах с использованием оператора
-
-
В блоке Сетевые настройки выберите:
-
Облачную сеть для размещения кластера. Если сети нет, нажмите Создать сеть и создайте ее:
- В открывшемся окне укажите имя сети и выберите каталог, в котором она будет создана.
- (Опционально) Выберите опцию Создать подсети, чтобы автоматически создать подсети во всех зонах доступности.
- Нажмите кнопку Создать сеть.
Важно
Выбранную для размещения кластера облачную сеть нельзя будет изменить. Если в дальнейшем вам потребуется переместить кластер в другую облачную сеть, воспользуйтесь функцией восстановления из резервной копии и укажите необходимую сеть для копии кластера.
-
Группы безопасности для сетевого трафика кластера. Может потребоваться дополнительная настройка групп безопасности для того, чтобы можно было подключаться к кластеру.
-
-
В блоке Хосты выберите параметры хостов БД, создаваемых вместе с кластером. По умолчанию каждый хост создается в отдельной подсети. Чтобы выбрать для хоста конкретную подсеть, в строке этого хоста нажмите значок
.Минимальное количество хостов в кластере зависит от выбранного типа диска. Конфигурация кластера по умолчанию, предлагаемая в консоли управления, включает:
- два хоста, если выбран тип диска
network-ssd,network-hddилиnetwork-ssd-io-m3. - три хоста, если выбран тип диска
local-ssdилиnetwork-ssd-nonreplicated.
Важно
Не рекомендуется создавать кластер из одного хоста. Такой кластер обходится дешевле, но не обеспечивает высокую доступность.
После создания кластера Managed Service for PostgreSQL в него можно добавить дополнительные хосты, если для этого достаточно ресурсов каталога.
Чтобы к хосту можно было подключаться из интернета, включите настройку Публичный доступ.
- два хоста, если выбран тип диска
-
При необходимости задайте дополнительные настройки кластера:
-
Начало резервного копирования (UTC) — промежуток времени, в течение которого начинается резервное копирование кластера. Время указывается по UTC в 24-часовом формате. По умолчанию —
22:00 - 23:00UTC. -
Срок хранения автоматических резервных копий, дней — время, в течение которого нужно хранить созданные автоматически резервные копии. Если для такой копии истекает срок хранения, то она удаляется. Значение по умолчанию — 7 дней. Подробнее см. в разделе Резервные копии.
Изменение срока хранения затрагивает как новые автоматические резервные копии, так и уже существующие. Например, изначальный срок хранения был 7 дней. Оставшееся время жизни отдельной автоматической резервной копии при таком сроке — 1 день. При увеличении срока хранения до 9 дней оставшееся время жизни этой резервной копии будет уже 3 дня.
Автоматические резервные копии кластера хранятся заданное количество дней, а созданные вручную — бессрочно. После удаления кластера все копии хранятся 7 дней.
-
Окно обслуживания — настройки времени технического обслуживания:
- Чтобы разрешить проведение технического обслуживания в любое время, выберите пункт произвольное (по умолчанию).
- Чтобы указать предпочтительное время начала обслуживания, выберите пункт по расписанию и укажите нужные день недели и час дня по UTC. Например, можно выбрать время, когда кластер наименее загружен.
Операции по техническому обслуживанию проводятся для включенных и выключенных кластеров. Они могут включать в себя: обновление СУБД, применение патчей и так далее.
-
Доступ из DataLens — опция разрешает анализировать данные из кластера в сервисе Yandex DataLens.
-
Доступ из WebSQL — опция разрешает выполнять SQL-запросы к базам данных кластера из консоли управления Yandex Cloud с помощью сервиса Yandex WebSQL.
-
Доступ из Yandex Query — опция разрешает выполнять YQL-запросы к базам данных кластера из сервиса Yandex Query.
-
Доступ из Serverless — включите эту опцию, чтобы разрешить доступ к кластеру из сервиса Yandex Cloud Functions. Подробнее о настройке доступа см. в документации Cloud Functions.
-
Сбор статистики — опция разрешает использовать в кластере инструмент Диагностика производительности. Если опция включена, настройте также Интервал сбора сессий и Интервал сбора запросов при помощи ползунков. Единицы измерения обеих настроек — секунды.
-
Автоматическое переключение мастера — если эта опция включена, при смене мастера источник репликации для всех хостов-реплик автоматически переключится на новый хост-мастер. Подробнее см. в разделе Репликация.
При удалении хоста-мастера новый мастер будет выбран автоматически независимо от значения этой опции.
Внимание
Если опция Автоматическое переключение мастера выключена, при выходе хоста-мастера из строя запустить выборы нового мастера или назначить эту роль одной из реплик придется вручную.
-
Режим работы менеджера подключений — выберите один из режимов работы менеджера подключений.
-
Защита от удаления — защита от удаления кластера, его баз данных и пользователей.
По умолчанию при создании пользователей и БД значение параметра наследуется от кластера. Значение также можно задать вручную, подробнее см. в разделах Управление пользователями и Управление БД.
Если параметр изменен на работающем кластере, новое значение унаследуют только пользователи и БД с защитой Как у кластера.
Включенная защита кластера от удаления не помешает подключиться к нему вручную и удалить данные.
-
-
При необходимости задайте настройки СУБД уровня кластера.
Примечание
Некоторые настройки PostgreSQL зависят от выбранного класса хостов или от размера хранилища.
-
Нажмите кнопку Создать кластер.
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id.
Чтобы создать кластер Managed Service for PostgreSQL:
-
Проверьте, есть ли в каталоге подсети для хостов кластера:
yc vpc subnet listЕсли ни одной подсети в каталоге нет, создайте нужные подсети в сервисе Yandex Virtual Private Cloud.
-
Посмотрите описание команды CLI для создания кластера:
yc managed-postgresql cluster create --help -
Укажите параметры кластера в команде создания (в примере приведены не все доступные параметры):
yc managed-postgresql cluster create \ --name <имя_кластера> \ --environment <окружение> \ --network-name <имя_сети> \ --host zone-id=<зона_доступности>,` `subnet-id=<идентификатор_подсети>,` `assign-public-ip=<разрешить_публичный_доступ_к_хосту> \ --resource-preset <класс_хоста> \ --user name=<имя_пользователя>,password=<пароль_пользователя> \ --database name=<имя_БД>,owner=<имя_владельца_БД> \ --disk-size <размер_хранилища_ГБ> \ --disk-type <network-hdd|network-ssd|network-ssd-nonreplicated|local-ssd> \ --security-group-ids <список_идентификаторов_групп_безопасности> \ --connection-pooling-mode=<режим_работы_менеджера_подключений> \ --deletion-protectionГде:
-
environment— окружение:prestableилиproduction. -
disk-type— тип диска. -
assign-public-ip— доступ к хосту из интернета:trueилиfalse. -
deletion-protection— защита от удаления кластера, его баз данных и пользователей.По умолчанию при создании пользователей и БД значение параметра наследуется от кластера. Значение также можно задать вручную, подробнее см. в разделах Управление пользователями и Управление БД.
Если параметр изменен на работающем кластере, новое значение унаследуют только пользователи и БД с защитой Как у кластера.
Включенная защита кластера от удаления не помешает подключиться к нему вручную и удалить данные.
Идентификатор подсети
subnet-idнеобходимо указывать, если в выбранной зоне доступности создано две и больше подсетей.Важно
Выбранную для размещения кластера облачную сеть нельзя будет изменить. Если в дальнейшем вам потребуется переместить кластер в другую облачную сеть, воспользуйтесь функцией восстановления из резервной копии и укажите необходимую сеть для копии кластера.
Имя базы может содержать латинские буквы, цифры, подчеркивание и дефис. Максимальная длина имени 63 символа. Имена
postgres,template0,template1зарезервированы для собственных нужд Managed Service for PostgreSQL. Создавать базы с этими именами нельзя.Длина пароля — от 8 до 128 символов.
Примечание
Пароль также можно сгенерировать с помощью сервиса Connection Manager. Для этого измените команду и задайте параметры пользователя таким образом:
--user name=<имя_пользователя>,generate-password=trueЧтобы увидеть пароль, в консоли управления
выберите созданный кластер, перейдите на вкладку Пользователи и нажмите Посмотреть пароль в строке нужного пользователя. Откроется страница секрета Yandex Lockbox, в котором хранится пароль. Для просмотра паролей требуется рольlockbox.payloadViewer.Доступные режимы работы менеджера подключений:
SESSION,TRANSACTIONилиSTATEMENT.Также вы можете указать дополнительную опцию
replication-sourceв параметре--hostдля того, чтобы вручную управлять потоками репликации.Чтобы зашифровать диск пользовательским ключом KMS, передайте параметр
--disk-encryption-key-id <идентификатор_ключа_KMS>. Подробнее о шифровании дисков см. в разделе Хранилище.Чтобы разрешить доступ к кластеру из сервиса Yandex Cloud Functions, передайте параметр
--serverless-access. Подробнее о настройке доступа см. в документации Cloud Functions.Чтобы разрешить доступ к кластеру из сервиса Yandex Query, передайте параметр
--yandexquery-access=true. Функциональность находится на стадии Preview и предоставляется по запросу.Примечание
По умолчанию при создании кластера устанавливается режим технического обслуживания
anytime— в любое время. Вы можете установить конкретное время обслуживания при изменении настроек кластера. -
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
Чтобы создать кластер Managed Service for PostgreSQL:
-
Опишите в конфигурационном файле параметры ресурсов, которые необходимо создать:
-
Кластер БД — описание кластера и его хостов.
-
База данных — описание БД кластера.
-
Пользователь — описание пользователя кластера.
-
Сеть — описание облачной сети, в которой будет расположен кластер. Если подходящая сеть у вас уже есть, описывать ее повторно не нужно.
-
Подсети — описание подсетей, к которым будут подключены хосты кластера. Если подходящие подсети у вас уже есть, описывать их повторно не нужно.
Важно
Выбранную для размещения кластера облачную сеть нельзя будет изменить. Если в дальнейшем вам потребуется переместить кластер в другую облачную сеть, воспользуйтесь функцией восстановления из резервной копии и укажите необходимую сеть для копии кластера.
Пример структуры конфигурационного файла:
resource "yandex_mdb_postgresql_cluster" "<имя_кластера>" { name = "<имя_кластера>" environment = "<окружение>" network_id = "<идентификатор_сети>" security_group_ids = [ "<список_идентификаторов_групп_безопасности>" ] deletion_protection = <защитить_кластер_от_удаления> config { version = "<версия_PostgreSQL>" resources { resource_preset_id = "<класс_хоста>" disk_type_id = "<тип_диска>" disk_size = <размер_хранилища_ГБ> } pooler_config { pool_discard = <параметр_Odyssey> pooling_mode = "<режим_работы>" } ... } host { zone = "<зона_доступности>" name = "<имя_хоста>" subnet_id = "<идентификатор_подсети>" assign_public_ip = <разрешить_публичный_доступ_к_хосту> } } resource "yandex_mdb_postgresql_database" "<имя_БД>" { cluster_id = "<идентификатор_кластера>" name = "<имя_БД>" owner = "<имя_владельца_БД>" depends_on = [ yandex_mdb_postgresql_user.<имя_пользователя> ] } resource "yandex_mdb_postgresql_user" "<имя_пользователя>" { cluster_id = "<идентификатор_кластера>" name = "<имя_пользователя>" password = "<пароль_пользователя>" } resource "yandex_vpc_network" "<имя_сети>" { name = "<имя_сети>" } resource "yandex_vpc_subnet" "<имя_подсети>" { name = "<имя_подсети>" zone = "<зона_доступности>" network_id = "<идентификатор_сети>" v4_cidr_blocks = ["<диапазон>"] }Где:
-
environment— окружение:PRESTABLEилиPRODUCTION. -
assign_public_ip— доступ к хосту из интернета:trueилиfalse. -
deletion_protection— защита от удаления кластера, его баз данных и пользователей:trueилиfalse.По умолчанию при создании пользователей и БД значение параметра наследуется от кластера. Значение также можно задать вручную, подробнее см. в разделах Управление пользователями и Управление БД.
Если параметр изменен на работающем кластере, новое значение унаследуют только пользователи и БД с защитой Как у кластера.
Включенная защита кластера от удаления не помешает подключиться к нему вручную и удалить данные.
-
version— версия PostgreSQL: 13, 13-1c, 14, 14-1c, 15, 15-1c, 16, 16-1c, 17 и 17-1c. -
pool_discard— параметр Odysseypool_discard:trueилиfalse. -
pooling_mode— режим работы:SESSION,TRANSACTIONилиSTATEMENT.
Имя базы может содержать латинские буквы, цифры, подчеркивание и дефис. Максимальная длина имени 63 символа. Имена
postgres,template0,template1зарезервированы для собственных нужд Managed Service for PostgreSQL. Создавать базы с этими именами нельзя.Длина пароля — от 8 до 128 символов.
Примечание
Пароль также можно сгенерировать с помощью сервиса Connection Manager. Для этого вместо
password = "<пароль_пользователя>"укажитеgenerate_password = true.Чтобы увидеть пароль, в консоли управления
выберите созданный кластер, перейдите на вкладку Пользователи и нажмите Посмотреть пароль в строке нужного пользователя. Откроется страница секрета Yandex Lockbox, в котором хранится пароль. Для просмотра паролей требуется рольlockbox.payloadViewer.Чтобы настроить автоматическое увеличение размера хранилища, добавьте в блок
configблокdisk_size_autoscaling:resource "yandex_mdb_postgresql_cluster" "<имя_кластера>" { ... config { ... disk_size_autoscaling { disk_size_limit = <максимальный_размер_хранилища_ГиБ> emergency_usage_threshold = <порог_для_незамедлительного_увеличения_в_процентах> planned_usage_threshold = <порог_для_планового_увеличения_в_процентах> } ... } ... }Где:
-
disk_size_limit— максимальный размер хранилища после увеличения, в гибибайтах. -
emergency_usage_threshold(опционально) — порог заполнения хранилища в процентах, при достижении которого оно будет увеличено незамедлительно. По умолчанию —0(автоматическое расширение отключено).Допустимые значения: от
0до100. -
planned_usage_threshold(опционально) — порог заполнения хранилища в процентах, при достижении которого оно будет увеличено в следующее окно обслуживания. По умолчанию —0(автоматическое расширение отключено).Допустимые значения: от
0до100.
Подробнее об условиях для увеличения хранилища см. в соответствующем разделе.
Важно
-
При использовании параметра
planned_usage_thresholdнеобходимо настроить окно технического обслуживания в блокеmaintenance_window. -
Если заданы оба порога, значение
emergency_usage_thresholdдолжно быть не меньшеplanned_usage_threshold.
Чтобы настроить время технического обслуживания (в т. ч. для выключенных кластеров), добавьте к описанию кластера блок
maintenance_window:resource "yandex_mdb_postgresql_cluster" "<имя_кластера>" { ... maintenance_window { type = <тип_технического_обслуживания> day = <день_недели> hour = <час_дня> } ... }Где:
type— тип технического обслуживания. Принимает значения:ANYTIME— в любое время.WEEKLY— по расписанию.
day— день недели для типаWEEKLY:MON,TUE,WED,THU,FRI,SATилиSUN.hour— час дня по UTC для типаWEEKLY: от1до24.
Чтобы зашифровать диск пользовательским ключом KMS, добавьте параметр
disk_encryption_key_id:resource "yandex_mdb_postgresql_cluster" "<имя_кластера>" { ... disk_encryption_key_id = <идентификатор_ключа_KMS> ... }Подробнее о шифровании дисков см. в разделе Хранилище.
Чтобы настроить сбор статистики, добавьте в блок
configблокperformance_diagnostics:resource "yandex_mdb_postgresql_cluster" "<имя_кластера>" { ... config { ... performance_diagnostics { enabled = <активация_сбора_статистики> sessions_sampling_interval = <интервал_сбора_сессий> statements_sampling_interval = <интервала_сбора_запросов> } ... } ... }Где:
enabled— активация сбора статистики:trueилиfalse.sessions_sampling_interval— интервал сбора сессий от1до86400секунд.statements_sampling_interval— интервала сбора запросов от60до86400секунд.
Полный список доступных для изменения полей конфигурации кластера Managed Service for PostgreSQL см. в документации провайдера Terraform.
-
-
Проверьте корректность настроек.
-
В командной строке перейдите в каталог, в котором расположены актуальные конфигурационные файлы Terraform с планом инфраструктуры.
-
Выполните команду:
terraform validateЕсли в файлах конфигурации есть ошибки, Terraform на них укажет.
-
-
Создайте кластер.
-
Выполните команду для просмотра планируемых изменений:
terraform planЕсли конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply -
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
Ограничения по времени
Провайдер Terraform ограничивает время на выполнение операций с кластером Managed Service for PostgreSQL:
- создание, в том числе путем восстановления из резервной копии, — 30 минут;
- изменение — 60 минут;
- удаление — 15 минут.
Операции, длящиеся дольше указанного времени, прерываются.
Как изменить эти ограничения?
Добавьте к описанию кластера блок
timeouts, например:resource "yandex_mdb_postgresql_cluster" "<имя_кластера>" { ... timeouts { create = "1h30m" # Полтора часа update = "2h" # 2 часа delete = "30m" # 30 минут } } -
-
Получите IAM-токен для аутентификации в API и поместите токен в переменную среды окружения:
export IAM_TOKEN="<IAM-токен>" -
Создайте файл
body.jsonи добавьте в него следующее содержимое:{ "folderId": "<идентификатор_каталога>", "name": "<имя_кластера>", "environment": "<окружение>", "networkId": "<идентификатор_сети>", "securityGroupIds": [ "<идентификатор_группы_безопасности_1>", "<идентификатор_группы_безопасности_2>", ... "<идентификатор_группы_безопасности_N>" ], "deletionProtection": <защитить_кластер_от_удаления>, "configSpec": { "version": "<версия_PostgreSQL>", "resources": { "resourcePresetId": "<класс_хостов>", "diskSize": "<размер_хранилища_в_байтах>", "diskTypeId": "<тип_диска>" }, "access": { "dataLens": <разрешить_доступ_из_DataLens>, "webSql": <разрешить_доступ_из_WebSQL>, "serverless": <разрешить_доступ_из_Cloud_Functions>, "dataTransfer": <разрешить_доступ_из_Data_Transfer>, "yandexQuery": <разрешить_доступ_из_Query> }, "performanceDiagnostics": { "enabled": <активировать_сбор_статистики>, "sessionsSamplingInterval": "<интервал_сбора_сессий>", "statementsSamplingInterval": "<интервал_сбора_запросов>" }, "diskSizeAutoscaling": { "plannedUsageThreshold": "<порог_для_планового_увеличения_в_процентах>", "emergencyUsageThreshold": "<порог_для_незамедлительного_увеличения_в_процентах>", "diskSizeLimit": "<максимальный_размер_хранилища_в_байтах>" } }, "databaseSpecs": [ { "name": "<имя_БД>", "owner": "<имя_владельца_БД>" }, { <аналогичный_набор_настроек_для_БД_2> }, { ... }, { <аналогичный_набор_настроек_для_БД_N> } ], "userSpecs": [ { "name": "<имя_пользователя>", "password": "<пароль_пользователя>", "permissions": [ { "databaseName": "<имя_БД>" } ], "login": <разрешить_пользователю_подключение_к_БД> }, { <аналогичный_набор_настроек_для_пользователя_2> }, { ... }, { <аналогичный_набор_настроек_для_пользователя_N> } ], "hostSpecs": [ { "zoneId": "<зона_доступности>", "subnetId": "<идентификатор_подсети>", "assignPublicIp": <разрешить_публичный_доступ_к_хосту> }, { <аналогичный_набор_настроек_для_хоста_2> }, { ... }, { <аналогичный_набор_настроек_для_хоста_N> } ], "maintenanceWindow": { "weeklyMaintenanceWindow": { "day": "<день_недели>", "hour": "<час_дня>" } } }Где:
-
folderId— идентификатор каталога. Его можно запросить со списком каталогов в облаке. -
name— имя кластера. -
environment— окружение кластера:PRODUCTIONилиPRESTABLE. -
networkId— идентификатор сети, в которой будет размещен кластер.Важно
Выбранную для размещения кластера облачную сеть нельзя будет изменить. Если в дальнейшем вам потребуется переместить кластер в другую облачную сеть, воспользуйтесь функцией восстановления из резервной копии и укажите необходимую сеть для копии кластера.
-
securityGroupIds— идентификаторы групп безопасности. -
deletionProtection— защита от удаления кластера, его баз данных и пользователей:trueилиfalse.По умолчанию при создании пользователей и БД значение параметра наследуется от кластера. Значение также можно задать вручную, подробнее см. в разделах Управление пользователями и Управление БД.
Если параметр изменен на работающем кластере, новое значение унаследуют только пользователи и БД с защитой Как у кластера.
Включенная защита кластера от удаления не помешает подключиться к нему вручную и удалить данные.
-
configSpec— настройки кластера:-
version— версия PostgreSQL. -
resources— ресурсы кластера:resourcePresetId— класс хостов;diskSize— размер диска в байтах;diskTypeId— тип диска.
-
access— настройки доступа кластера к следующим сервисам Yandex Cloud:dataLens— Yandex DataLens;webSql— Yandex WebSQL;serverless— Yandex Cloud Functions;dataTransfer— Yandex Data Transfer;yandexQuery— Yandex Query.
Возможные значения настроек:
trueилиfalse. -
performanceDiagnostics— настройки для сбора статистики:enabled— активация сбора статистики:trueилиfalse.sessionsSamplingInterval— интервал сбора сессий. Возможные значения: от1до86400секунд.statementsSamplingInterval— интервал сбора запросов. Возможные значения: от60до86400секунд.
-
diskSizeAutoscaling— настройки автоматического увеличения размера хранилища:-
plannedUsageThreshold(опционально) — порог заполнения хранилища в процентах, при достижении которого оно будет увеличено в следующее окно обслуживания. По умолчанию —0(автоматическое расширение отключено).Допустимые значения: от
0до100. -
emergencyUsageThreshold(опционально) — порог заполнения хранилища в процентах, при достижении которого оно будет увеличено незамедлительно. По умолчанию —0(автоматическое расширение отключено).Допустимые значения: от
0до100. -
diskSizeLimit— максимальный размер хранилища после увеличения, в байтах.
Важно
-
При использовании параметра
plannedUsageThresholdнеобходимо задать окно технического обслуживания в настройкеmaintenanceWindow. -
Если заданы оба порога, значение
emergencyUsageThresholdдолжно быть не меньшеplannedUsageThreshold.
Подробнее об условиях для увеличения хранилища см. в соответствующем разделе.
-
-
-
databaseSpecs— настройки баз данных в виде массива элементов. Каждый элемент соответствует отдельной БД и имеет следующую структуру:name— имя БД.owner— имя владельца БД. Должно совпадать с именем одного из пользователей, указанных в запросе.
-
userSpecs— настройки пользователей в виде массива элементов. Каждый элемент соответствует отдельному пользователю и имеет следующую структуру:-
name— имя пользователя. -
password— пароль пользователя. Длина пароля — от 8 до 128 символов.Пароль также можно сгенерировать с помощью сервиса Connection Manager. Для этого вместо
"password": "<пароль_пользователя>"укажите"generatePassword": true.Чтобы увидеть пароль, в консоли управления
выберите созданный кластер, перейдите на вкладку Пользователи и нажмите Посмотреть пароль в строке нужного пользователя. Откроется страница секрета Yandex Lockbox, в котором хранится пароль. Для просмотра паролей требуется рольlockbox.payloadViewer. -
permissions.databaseName— имя базы данных, к которой пользователь получает доступ. -
login— разрешение для пользователя на подключение к БД:trueилиfalse.
-
-
hostSpecs— настройки хостов кластера в виде массива элементов. Каждый элемент соответствует отдельному хосту и имеет следующую структуру:zoneId— зона доступности;subnetId— идентификатор подсети;assignPublicIp— разрешение на подключение к хосту из интернета:trueилиfalse.
-
maintenanceWindow— настройки расписания окна технического обслуживания:day— день недели в форматеDDD, когда должно проходить обслуживание.hour— час дня в форматеHH, когда должно проходить обслуживание. Допустимые значения: от1до24.
-
-
Воспользуйтесь методом Cluster.Create и выполните запрос, например, с помощью cURL
:curl \ --request POST \ --header "Authorization: Bearer $IAM_TOKEN" \ --header "Content-Type: application/json" \ --url 'https://mdb.api.cloud.yandex.net/managed-postgresql/v1/clusters' \ --data "@body.json" -
Убедитесь, что запрос был выполнен успешно, изучив ответ сервера.
-
Получите IAM-токен для аутентификации в API и поместите токен в переменную среды окружения:
export IAM_TOKEN="<IAM-токен>" -
Клонируйте репозиторий cloudapi
:cd ~/ && git clone --depth=1 https://github.com/yandex-cloud/cloudapiДалее предполагается, что содержимое репозитория находится в директории
~/cloudapi/. -
Создайте файл
body.jsonи добавьте в него следующее содержимое:{ "folder_id": "<идентификатор_каталога>", "name": "<имя_кластера>", "environment": "<окружение>", "network_id": "<идентификатор_сети>", "security_group_ids": [ "<идентификатор_группы_безопасности_1>", "<идентификатор_группы_безопасности_2>", ... "<идентификатор_группы_безопасности_N>" ], "deletion_protection": <защитить_кластер_от_удаления>, "config_spec": { "version": "<версия_PostgreSQL>", "resources": { "resource_preset_id": "<класс_хостов>", "disk_size": "<размер_хранилища_в_байтах>", "disk_type_id": "<тип_диска>" }, "access": { "data_lens": <разрешить_доступ_из_DataLens>, "web_sql": <разрешить_доступ_из_WebSQL>, "serverless": <разрешить_доступ_из_Cloud_Functions>, "data_transfer": <разрешить_доступ_из_Data_Transfer>, "yandex_query": <разрешить_доступ_из_Query> }, "performance_diagnostics": { "enabled": <активировать_сбор_статистики>, "sessions_sampling_interval": "<интервал_сбора_сессий>", "statements_sampling_interval": "<интервал_сбора_запросов>" }, "disk_size_autoscaling": { "planned_usage_threshold": "<порог_для_планового_увеличения_в_процентах>", "emergency_usage_threshold": "<порог_для_незамедлительного_увеличения_в_процентах>", "disk_size_limit": "<максимальный_размер_хранилища_в_байтах>" } }, "database_specs": [ { "name": "<имя_БД>", "owner": "<имя_владельца_БД>" }, { <аналогичный_набор_настроек_для_БД_2> }, { ... }, { <аналогичный_набор_настроек_для_БД_N> } ], "user_specs": [ { "name": "<имя_пользователя>", "password": "<пароль_пользователя>", "permissions": [ { "database_name": "<имя_БД>" } ], "login": <разрешить_пользователю_подключение_к_БД> }, { <аналогичный_набор_настроек_для_пользователя_2> }, { ... }, { <аналогичный_набор_настроек_для_пользователя_N> } ], "host_specs": [ { "zone_id": "<зона_доступности>", "subnet_id": "<идентификатор_подсети>", "assign_public_ip": <разрешить_публичный_доступ_к_хосту> }, { <аналогичный_набор_настроек_для_хоста_2> }, { ... }, { <аналогичный_набор_настроек_для_хоста_N> } ], "maintenance_window": { "weekly_maintenance_window": { "day": "<день_недели>", "hour": "<час_дня>" } } }Где:
-
folder_id— идентификатор каталога. Его можно запросить со списком каталогов в облаке. -
name— имя кластера. -
environment— окружение кластера:PRODUCTIONилиPRESTABLE. -
network_id— идентификатор сети, в которой будет размещен кластер.Важно
Выбранную для размещения кластера облачную сеть нельзя будет изменить. Если в дальнейшем вам потребуется переместить кластер в другую облачную сеть, воспользуйтесь функцией восстановления из резервной копии и укажите необходимую сеть для копии кластера.
-
security_group_ids— идентификаторы групп безопасности. -
deletion_protection— защита от удаления кластера, его баз данных и пользователей:trueилиfalse.По умолчанию при создании пользователей и БД значение параметра наследуется от кластера. Значение также можно задать вручную, подробнее см. в разделах Управление пользователями и Управление БД.
Если параметр изменен на работающем кластере, новое значение унаследуют только пользователи и БД с защитой Как у кластера.
Включенная защита кластера от удаления не помешает подключиться к нему вручную и удалить данные.
-
config_spec— настройки кластера:-
version— версия PostgreSQL. -
resources— ресурсы кластера:resource_preset_id— класс хостов;disk_size— размер диска в байтах;disk_type_id— тип диска.
-
access— настройки доступа кластера к следующим сервисам Yandex Cloud:data_lens— Yandex DataLens;web_sql— Yandex WebSQL;serverless— Yandex Cloud Functions;data_transfer— Yandex Data Transfer;yandex_query— Yandex Query.
Возможные значения настроек:
trueилиfalse. -
performance_diagnostics— настройки для сбора статистики:enabled— активация сбора статистики:trueилиfalse.sessions_sampling_interval— интервал сбора сессий. Возможные значения: от1до86400секунд.statements_sampling_interval— интервал сбора запросов. Возможные значения: от60до86400секунд.
-
disk_size_autoscaling— настройки автоматического увеличения размера хранилища:-
planned_usage_threshold(опционально) — порог заполнения хранилища в процентах, при достижении которого оно будет увеличено в следующее окно обслуживания. По умолчанию —0(автоматическое расширение отключено).Допустимые значения: от
0до100. -
emergency_usage_threshold(опционально) — порог заполнения хранилища в процентах, при достижении которого оно будет увеличено незамедлительно. По умолчанию —0(автоматическое расширение отключено).Допустимые значения: от
0до100. -
disk_size_limit— максимальный размер хранилища после увеличения, в байтах.
Важно
-
При использовании параметра
planned_usage_thresholdнеобходимо задать окно технического обслуживания в настройкеmaintenance_window. -
Если заданы оба порога, значение
emergency_usage_thresholdдолжно быть не меньшеplanned_usage_threshold.
Подробнее об условиях для увеличения хранилища см. в соответствующем разделе.
-
-
-
database_specs— настройки баз данных в виде массива элементов. Каждый элемент соответствует отдельной БД и имеет следующую структуру:name— имя БД.owner— имя владельца БД. Должно совпадать с именем одного из пользователей, указанных в запросе.
-
user_specs— настройки пользователей в виде массива элементов. Каждый элемент соответствует отдельному пользователю и имеет следующую структуру:-
name— имя пользователя. -
password— пароль пользователя. Длина пароля — от 8 до 128 символов.Пароль также можно сгенерировать с помощью сервиса Connection Manager. Для этого вместо
"password": "<пароль_пользователя>"укажите"generate_password": true.Чтобы увидеть пароль, в консоли управления
выберите созданный кластер, перейдите на вкладку Пользователи и нажмите Посмотреть пароль в строке нужного пользователя. Откроется страница секрета Yandex Lockbox, в котором хранится пароль. Для просмотра паролей требуется рольlockbox.payloadViewer. -
permissions.database_name— имя базы данных, к которой пользователь получает доступ. -
login— разрешение для пользователя на подключение к БД:trueилиfalse.
-
-
host_specs— настройки хостов кластера в виде массива элементов. Каждый элемент соответствует отдельному хосту и имеет следующую структуру:zone_id— зона доступности;subnet_id— идентификатор подсети;assign_public_ip— разрешение на подключение к хосту из интернета.
-
maintenance_window— настройки расписания окна технического обслуживания:day— день недели в форматеDDD, когда должно проходить обслуживание.hour— час дня в форматеHH, когда должно проходить обслуживание. Допустимые значения: от1до24.
-
-
Воспользуйтесь вызовом ClusterService.Create и выполните запрос, например, с помощью gRPCurl
:grpcurl \ -format json \ -import-path ~/cloudapi/ \ -import-path ~/cloudapi/third_party/googleapis/ \ -proto ~/cloudapi/yandex/cloud/mdb/postgresql/v1/cluster_service.proto \ -rpc-header "Authorization: Bearer $IAM_TOKEN" \ -d @ \ mdb.api.cloud.yandex.net:443 \ yandex.cloud.mdb.postgresql.v1.ClusterService.Create \ < body.json -
Убедитесь, что запрос был выполнен успешно, изучив ответ сервера.
Важно
Если вы указали идентификаторы групп безопасности при создании кластера, для подключения к нему может потребоваться дополнительная настройка групп безопасности.
Создать копию кластера
Вы можете создать кластер PostgreSQL, который будет обладать настройками созданного ранее кластера. Для этого конфигурация исходного кластера PostgreSQL импортируется в Terraform. В результате вы можете либо создать идентичную копию, либо взять за основу импортированную конфигурацию и внести в нее изменения. Использовать импорт удобно, если исходный кластер PostgreSQL обладает множеством настроек и нужно создать похожий на него кластер.
Чтобы создать копию кластера PostgreSQL:
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
В той же рабочей директории разместите файл с расширением
.tfи содержимым:resource "yandex_mdb_postgresql_cluster" "old" { } -
Запишите идентификатор первоначального кластера PostgreSQL в переменную окружения:
export POSTGRESQL_CLUSTER_ID=<идентификатор_кластера>Идентификатор можно запросить вместе со списком кластеров в каталоге.
-
Импортируйте настройки первоначального кластера PostgreSQL в конфигурацию Terraform:
terraform import yandex_mdb_postgresql_cluster.old ${POSTGRESQL_CLUSTER_ID} -
Получите импортированную конфигурацию:
terraform show -
Скопируйте ее из терминала и вставьте в файл с расширением
.tf. -
Расположите файл в новой директории
imported-cluster. -
Измените скопированную конфигурацию так, чтобы из нее можно было создать новый кластер:
- Укажите новое имя кластера в строке
resourceи параметреname. - Удалите параметры
created_at,health,idиstatus. - В блоках
hostудалите параметрыfqdnиrole. - Если в блоке
disk_size_autoscalingуказано значение параметраdisk_size_limit = 0, удалите этот блок. - Если в блоке
maintenance_windowуказано значение параметраtype = "ANYTIME", удалите параметрhour. - (Опционально) Внесите дополнительные изменения, если вам нужна не идентичная, а кастомизированная копия.
- Укажите новое имя кластера в строке
-
В директории
imported-clusterполучите данные для аутентификации. -
В этой же директории настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в директорию
imported-clusterи укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле. -
Проверьте корректность файлов конфигурации Terraform:
terraform validateЕсли в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform planЕсли конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply -
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Ограничения по времени
Провайдер Terraform ограничивает время на выполнение операций с кластером Managed Service for PostgreSQL:
- создание, в том числе путем восстановления из резервной копии, — 30 минут;
- изменение — 60 минут;
- удаление — 15 минут.
Операции, длящиеся дольше указанного времени, прерываются.
Как изменить эти ограничения?
Добавьте к описанию кластера блок timeouts, например:
resource "yandex_mdb_postgresql_cluster" "<имя_кластера>" {
...
timeouts {
create = "1h30m" # Полтора часа
update = "2h" # 2 часа
delete = "30m" # 30 минут
}
}
Примеры
Создание кластера с одним хостом
Чтобы создать кластер с одним хостом, передайте один параметр --host.
Создайте кластер Managed Service for PostgreSQL с тестовыми характеристиками:
- С именем
mypg. - В окружении
production. - В сети
default. - В группе безопасности
enp6saqnq4ie********. - С одним хостом класса
s2.microв подсетиb0rcctk2rvtr********, в зоне доступностиru-central1-a. - С хранилищем на сетевых SSD-дисках (
network-ssd) размером 20 ГБ. - С одним пользователем (
user1), с паролемuser1user1. - С одной БД
db1, принадлежащей пользователюuser1. - С защитой от случайного удаления кластера, его баз данных и пользователей.
Выполните следующую команду:
yc managed-postgresql cluster create \
--name mypg \
--environment production \
--network-name default \
--resource-preset s2.micro \
--host zone-id=ru-central1-a,subnet-id=b0rcctk2rvtr******** \
--disk-type network-ssd \
--disk-size 20 \
--user name=user1,password=user1user1 \
--database name=db1,owner=user1 \
--security-group-ids enp6saqnq4ie******** \
--deletion-protection
Создайте кластер Managed Service for PostgreSQL и сеть для него с тестовыми характеристиками:
-
С именем
mypg. -
Версии
17. -
В окружении
PRESTABLE. -
В облаке с идентификатором
b1gq90dgh25********. -
В каталоге с идентификатором
b1gia87mbaom********. -
В новой сети
mynet. -
В новой группе безопасности
pgsql-sg, разрешающей подключение к кластеру из интернета через порт6432. -
С одним хостом класса
s2.microв новой подсетиmysubnet, в зоне доступностиru-central1-a. Подсетьmysubnetбудет иметь диапазон10.5.0.0/24. -
С хранилищем на сетевых SSD-дисках (
network-ssd) размером 20 ГБ. -
С одним пользователем (
user1), с паролемuser1user1. -
С одной БД
db1, принадлежащей пользователюuser1. -
С защитой от случайного удаления кластера, его баз данных и пользователей.
Конфигурационный файл для такого кластера выглядит так:
resource "yandex_mdb_postgresql_cluster" "mypg" {
name = "mypg"
environment = "PRESTABLE"
network_id = yandex_vpc_network.mynet.id
security_group_ids = [ yandex_vpc_security_group.pgsql-sg.id ]
deletion_protection = true
config {
version = 17
resources {
resource_preset_id = "s2.micro"
disk_type_id = "network-ssd"
disk_size = "20"
}
}
host {
zone = "ru-central1-a"
name = "mypg-host-a"
subnet_id = yandex_vpc_subnet.mysubnet.id
}
}
resource "yandex_mdb_postgresql_database" "db1" {
cluster_id = yandex_mdb_postgresql_cluster.mypg.id
name = "db1"
owner = "user1"
}
resource "yandex_mdb_postgresql_user" "user1" {
cluster_id = yandex_mdb_postgresql_cluster.mypg.id
name = "user1"
password = "user1user1"
}
resource "yandex_vpc_network" "mynet" {
name = "mynet"
}
resource "yandex_vpc_subnet" "mysubnet" {
name = "mysubnet"
zone = "ru-central1-a"
network_id = yandex_vpc_network.mynet.id
v4_cidr_blocks = ["10.5.0.0/24"]
}
resource "yandex_vpc_security_group" "pgsql-sg" {
name = "pgsql-sg"
network_id = yandex_vpc_network.mynet.id
ingress {
description = "PostgreSQL"
port = 6432
protocol = "TCP"
v4_cidr_blocks = [ "0.0.0.0/0" ]
}
}