Мониторинг и метрики
Как получить доступ к метрикам моего экземпляра ClickHouse Managed Postgres?
Вы можете отслеживать использование CPU, памяти, IOPS и хранилища напрямую в консоли ClickHouse Cloud на вкладке Мониторинг вашего экземпляра ClickHouse Managed Postgres. Кроме того, вы можете ознакомиться с Query Performance Insights для подробного анализа ваших запросов на вкладке Query Insights.Резервное копирование и восстановление
Какие варианты резервного копирования доступны?
ClickHouse Managed Postgres включает автоматическое ежедневное резервное копирование с непрерывным архивированием WAL, что позволяет выполнять восстановление на определённый момент времени на любой момент в пределах 7-дневного периода хранения. Резервные копии хранятся в объектном хранилище. Подробные сведения о частоте резервного копирования, сроках хранения и выполнении восстановления на определённый момент времени см. в документации Backup and restore.Инфраструктура и автоматизация
Какие облачные провайдеры поддерживаются?
ClickHouse Managed Postgres доступен на AWS в статусе публичной беты. Для GCP доступна закрытая предварительная версия. Записаться в лист ожидания закрытой предварительной версии для GCP можно здесь, а узнать больше — из анонса. Подробности см. в разделе Поддерживаемые облачные провайдеры.Доступна ли поддержка Terraform для ClickHouse Managed Postgres?
Да. Вы можете создавать сервисы ClickHouse Managed Postgres и управлять ими с помощью Terraform-провайдера ClickHouse, используя ресурсclickhouse_postgres_service. Подробности см. в справочнике по Terraform. Также вы можете использовать консоль ClickHouse Cloud или OpenAPI для создания экземпляров и управления ими.
Расширения и конфигурация
Какие расширения поддерживаются?
ClickHouse Managed Postgres включает более 90 расширений PostgreSQL, в том числе популярные PostGIS, pgvector, pg_cron и многие другие. Полный список доступных расширений и инструкции по установке см. в документации Расширения.Можно ли настраивать параметры конфигурации PostgreSQL?
Да, параметры конфигурации PostgreSQL и PgBouncer можно изменять на вкладке Настройки в консоли. Подробнее о доступных параметрах и о том, как их изменять, см. в документации Настройки.Пул соединений
Почему через PgBouncer возникают ошибки prepared statement does not exist?
ClickHouse Managed Postgres запускает PgBouncer в режиме пулинга транзакций. В этом режиме backend-соединение Postgres закрепляется за вашим клиентом только на время одной транзакции, после чего возвращается в пул, поэтому следующая транзакция того же клиента может попасть на другое backend-соединение.
PgBouncer отслеживает подготовленные операторы на уровне протокола, которые большинство драйверов отправляют по расширенному протоколу запросов (сообщения Parse, Bind и Execute). Если оператор выполняется на backend-соединении, которое ещё не встречало его, PgBouncer сначала подготавливает его там. Каждое backend-соединение хранит до max_prepared_statements таких операторов (по умолчанию — 200). Поэтому большинство драйверов работают через PgBouncer с настройками по умолчанию.
Через PgBouncer не работает следующее:
- Подготовленные операторы на уровне SQL. PgBouncer не отслеживает команды
PREPAREиEXECUTE, отправленные в виде SQL, поэтомуEXECUTEможет попасть на backend-соединение, на которомPREPAREне выполнялся. - Освобождение операторов через SQL-команду
DEALLOCATE. PgBouncer переименовывает операторы на backend-соединении, поэтомуDEALLOCATEс именем оператора, заданным клиентом, завершается ошибкой. Если это происходит внутри транзакции, она прерывается, и все последующие операторы завершаются ошибкойcurrent transaction is aborted. Драйверы на основе libpq 17 и новее освобождают операторы с помощью сообщенияCloseна уровне протокола, которое PgBouncer обрабатывает корректно. - Безымянные операторы, разнесённые на несколько обменов с сервером. В некоторых режимах драйверы отправляют
Parseбезымянного оператора в одном обмене, а егоBind— в следующем. PgBouncer может выполнить второй обмен на другом backend-соединении: в результате либо возникает ошибкаunnamed prepared statement does not exist, либо молча выполняется оператор другого клиента и возвращаются его результаты.
- Всплески ошибок
prepared statement does not exist, особенно во время дозагрузки или при записи с высоким параллелизмом - Вставки, которые словно «молча не выполняются»: оператор завершается ошибкой, драйвер повторяет попытку, и в итоге батч может быть применён лишь частично или вовсе потерян
- Транзакции, завершающиеся ошибкой
current transaction is abortedпосле освобождения оператора - Строки, относящиеся к другому запросу
Если ваша рабочая нагрузка зависит от
PREPARE на уровне SQL, подключайтесь напрямую к PostgreSQL (порт 5432), а не через пулер PgBouncer. Подробнее о выборе между конечной точкой с пулом соединений и прямой конечной точкой см. в разделе Подключение.
Почему после миграции запросы завершаются ошибкой cached plan must not change result type?
PgBouncer хранит подготовленные операторы в своих соединениях с Postgres и повторно использует их для одного и того же текста SQL. Если после изменения схемы меняется тип столбца, возвращаемого запросом (например, с integer на bigint), такой запрос через PgBouncer продолжает завершаться ошибкой cached plan must not change result type. Ошибка возникает даже в новых клиентских соединениях — до тех пор, пока PgBouncer не заменит свои соединения с Postgres. Некоторые драйверы вместо ошибки декодируют результат по устаревшим типам и молча возвращают неверные значения. При прямом соединении каждое соединение завершается ошибкой не более одного раза, после чего работает нормально.
Чтобы устранить проблему, закройте соединения PgBouncer с Postgres для этой базы данных — PgBouncer откроет новые. PgBouncer подключается к Postgres локально, поэтому у его соединений нет client_addr. Выполните следующий запрос через прямое соединение (порт 5432) от имени того же пользователя, под которым подключается ваше приложение. Запрос завершает только соединения PgBouncer для пользователя вашего приложения: транзакции, выполняющиеся через PgBouncer в этот момент, завершатся ошибкой, а прямые соединения затронуты не будут:
prepare: :unnamed и pgx с cache_describe, эта проблема не затрагивает.
Почему при подключении через PgBouncer возникает ошибка unsupported startup parameter?
PgBouncer отклоняет параметры, задаваемые при подключении, если не может единообразно применить их ко всем соединениям Postgres в своем пуле, и завершается с ошибкой FATAL: unsupported startup parameter: ... или unsupported startup parameter in options: .... Чаще всего это происходит в следующих случаях:
extra_float_digits— этот параметр при каждом подключении передают pgjdbc версии 42.7.4 и более ранних (например, в составе Spring Boot 3), а также sqlx. Обновите pgjdbc до версии 42.7.5 или новее. В sqlx задайтеextra_float_digits(None)вPgConnectOptions.search_pathи другие параметры в строке подключения, напримерcurrentSchemaв JDBC URL,Search Pathв строке подключения Npgsql,options=-c ...илиOPTIONS["options"]в Django. Вместо этого задайте значение по умолчанию с помощьюALTER ROLE ... SETилиALTER DATABASE ... SET, используйтеSET LOCALвнутри транзакции либо подключайтесь напрямую.
application_name и TimeZone поддерживаются.
Почему команды SET не сохраняются при работе через PgBouncer?
В режиме пулинга транзакций (transaction pooling) команда SET уровня сеанса действует для того соединения Postgres, в котором она была выполнена, а не для вашего клиента. Последующие транзакции вашего клиента могут выполняться в других соединениях, где этот параметр не задан, а другие клиенты, наоборот, могут попасть в соединение, где он задан. Это относится и к SET ROLE: роль, которую вы приняли, может применяться к запросам другого клиента. Используйте SET LOCAL внутри транзакции, задавайте значения по умолчанию с помощью ALTER ROLE ... SET или ALTER DATABASE ... SET либо подключайтесь напрямую, если рабочая нагрузка зависит от состояния сеанса.
Почему миграции зависают или не могут снять advisory-блокировку при работе через PgBouncer?
Многие инструменты миграции захватывают advisory-блокировку на уровне сеанса, чтобы в каждый момент выполнялась только одна миграция, а снимают её отдельным оператором. При работе через PgBouncer оператор снятия блокировки может выполниться в другом соединении Postgres, и блокировка так и остаётся на одном из соединений пула. В результате последующие миграции зависают в ожидании или завершаются с ошибками видаfailed to release advisory lock — даже при работе через прямое соединение. Сеансовые advisory-блокировки используют, в частности, golang-migrate, sqlx, Migrator из Kysely, Rails, Flyway с transactional-lock=false и Ecto с migration_lock: :pg_advisory_lock.
Выполняйте миграции через прямое соединение (порт 5432). Зависшую блокировку удерживает бездействующий сеанс, а блокировку ещё выполняющейся миграции — активный. Чтобы снять зависшие блокировки, завершите только бездействующие сеансы, удерживающие advisory-блокировки в вашей базе данных, — также через прямое соединение:
Что означает параметр max_client_conn в PgBouncer и как он соотносится с max_connections в Postgres?
Они отвечают за разные вещи:
max_connectionsв Postgres ограничивает число backend-соединений с самим PostgreSQL. Это затратный показатель — каждое backend-соединение потребляет память и занимает слот процесса.max_client_connв PgBouncer ограничивает число клиентских соединений, которые могут быть одновременно открыты в пулере. PgBouncer мультиплексирует множество таких клиентских соединений на значительно меньшее число backend-соединений.
max_connections равен 500, принимает на пулере 2500 клиентских соединений. Если вы видите ошибки соединения на стороне пулера, гораздо вероятнее, что вы упираетесь в лимит backend-соединений для конкретного пула (default_pool_size или max_db_connections для каждой базы данных), а не в основной лимит клиентских соединений.
Чтобы посмотреть значения для вашего инстанса, подключитесь к специальной базе данных pgbouncer через PgBouncer (порт 6432) и выполните SHOW CONFIG:
Возможности базы данных
Могу ли я создать несколько баз данных и схем?
Да. ClickHouse Managed Postgres предоставляет всю нативную функциональность PostgreSQL, включая поддержку нескольких баз данных и схем в рамках одного экземпляра. Вы можете создавать базы данных и схемы и управлять ими с помощью стандартных команд PostgreSQL.Поддерживается ли ролевое управление доступом (RBAC)?
У вас есть полный доступ с правами superuser к вашему экземпляру ClickHouse Managed Postgres, что позволяет создавать роли и управлять разрешениями с помощью стандартных команд PostgreSQL.Расширенные возможности RBAC с интеграцией в консоль планируются в этом году.
Обновления
Как выполняются обновления версий PostgreSQL?
Обновления как минорных, так и мажорных версий выполняются через переключение при отказе и обычно приводят лишь к нескольким секундам простоя. Вы можете настроить запланированные обновления, чтобы контролировать дни и двухчасовое окно UTC, в течение которого применяются обновления. Подробную информацию см. в документации Обновления.Миграция
Какие инструменты доступны при миграции в ClickHouse Managed Postgres?
ClickHouse Managed Postgres поддерживает несколько подходов к миграции:- pg_dump and pg_restore: Для небольших баз данных или разовых миграций. См. руководство pg_dump and pg_restore.
- Logical replication: Для более крупных баз данных, где требуется минимальное время простоя. См. руководство Логическая репликация.
- PeerDB: Для репликации на основе CDC из других экземпляров Postgres. См. руководство Миграция с PeerDB.
Полностью управляемый процесс миграции скоро станет доступен.