pg.
В этом руководстве вы создадите новое приложение Rails, подключите его к ClickHouse Managed Postgres по TLS с проверкой сертификата, выполните миграцию и запустите ресурс Post, сгенерированный с помощью scaffold.
Предварительные требования
- Ruby 3.2 или новее. Это руководство протестировано с Ruby 4.0.7, Rails 8.1.4 и
pg1.6.3. - Аккаунт ClickHouse Cloud.
pg поставляется с предкомпилированными сборками для Linux, macOS и Windows, в которые входит libpq, поэтому устанавливать PostgreSQL локально не нужно.
Создание сервиса ClickHouse Managed Postgres
В консоли ClickHouse Cloud нажмите New service и выберите Postgres. Инстанс будет готов через несколько минут. Пошаговые инструкции см. в кратком руководстве по началу работы.Получение сведений о подключении
Откройте свой сервис и нажмите Connect на левой боковой панели. Оставьте выбранным вариант Directly и включите Use SSL. Скопируйте пароль и имя хоста сервера, затем нажмите Download CA certificate. CA‑сертификат уникален для каждого сервиса. Его также можно скачать позже в разделе Settings → CA Certificate. Прямое подключение или PgBouncer? Сервер Rails — это долгоживущий процесс со своим пулом соединений (max_connections в config/database.yml, по умолчанию пять на процесс), поэтому в этом руководстве используется прямое подключение к Postgres через порт 5432.
Если вы запускаете много процессов и упираетесь в лимит соединений, см. раздел Использование PgBouncer.
Создание приложения Rails
Установите Rails и создайте приложение с PostgreSQL в качестве базы данных:Настройка соединения с базой данных
Переместите загруженный CA‑сертификат в каталогconfig приложения и переименуйте его в ca-certificate.pem.
Имя загруженного файла совпадает с названием вашего сервиса, например your-service-ca-certificate.pem:
config/database.yml замените раздел development следующим содержимым:
sslmode: verify-full заставляет libpq проверять, что сертификат сервера подписан CA вашего сервиса и соответствует имени хоста. Rails.root.join возвращает абсолютный путь, поэтому настройка работает независимо от того, из какого каталога запускается Rails.
Укажите в DATABASE_URL адрес вашего сервиса и новое имя базы данных. В этом руководстве используется guide_rails:
Не указывайте строку запроса в
DATABASE_URL. Параметры в URL переопределяют ключи в database.yml, поэтому скопированный параметр sslrootcert=your-service-ca-certificate.pem заменит вашу настройку путём относительно текущего каталога.db:create создаёт только базу данных, указанную в DATABASE_URL. Для выполнения CREATE DATABASE команда подключается к стандартной базе данных postgres, но не вносит в неё изменений. Если задана переменная DATABASE_URL, Rails также пропускает создание локальной тестовой базы данных.
Создание модели и выполнение миграции
Сгенерируйте каркас (scaffold) для ресурсаPost и примените его миграцию. В уже существующем приложении команда bin/rails db:migrate также создаст в новой базе данных все имеющиеся таблицы приложения. Изначально они будут пустыми, поскольку данные из SQLite не переносятся:
Выполнение запросов к базе данных
Создайте файлscript/posts_demo.rb с несколькими вызовами Active Record:
bin/rails runner:
pg_stat_ssl для текущего соединения и подтверждает, что сеанс зашифрован.
Запуск приложения
Запустите сервер для разработки:guide_rails и выберите таблицу posts.
Rails также создаёт таблицы schema_migrations и ar_internal_metadata для отслеживания миграций.
Таблица posts содержит две строки, созданные скриптом script/posts_demo.rb:
Использование PgBouncer
Каждый процесс Rails открывает доmax_connections прямых соединений. Если в совокупности процессы приближаются к лимиту соединений Postgres, подключайтесь через встроенный PgBouncer: выберите via PgBouncer в модальном окне Connect и укажите порт 6432 в DATABASE_URL.
PgBouncer работает в режиме пулинга транзакций:
-
Подготовленные операторы работают с настройками Rails по умолчанию, если используется gem
pgверсии 1.6 или новее сlibpq17 или новее. Предкомпилированные gem-пакетыpg1.6 поставляются сlibpq18. С этими версиями Rails, вытесняя оператор из своего кэша, освобождает его сообщениемCloseна уровне протокола, и встроенный PgBouncer корректно его обрабатывает. Более старые версииpgилиlibpqвместо этого отправляют SQL-командуDEALLOCATE, которая при работе через PgBouncer завершается ошибкойprepared statement "a1" does not exist. Если это происходит внутри транзакции, транзакция прерывается (PG::InFailedSqlTransaction). Чтобы проверить версии, выполните:Требуются версии не ниже1.6.0и170000соответственно. Если обновиться невозможно, добавьтеprepared_statements: falseв разделdevelopment. ВproductionRails включает подготовленные операторы, а вdevelopmentони по умолчанию отключены, поскольку включён параметрquery_log_tags_enabled. -
Миграции захватывают advisory-блокировку уровня сеанса (
pg_try_advisory_lock), чтобы исключить одновременный запуск. При пулинге транзакций запрос на снятие блокировки может попасть в другое соединение Postgres: он завершается ошибкойFailed to release advisory lock, а блокировка остаётся удерживаемой, поэтому последующие запуски завершаются ошибкойCannot run migrations because another migration process is currently running. Либо запускайтеbin/rails db:migrateс прямымDATABASE_URLна порту5432, либо отключите блокировку:
advisory_locks: false следите за тем, чтобы миграции одновременно запускались только в одном развёртывании.
Устранение неполадок
SSL error: certificate verify failed: параметрsslrootcertне указывает на CA‑сертификат вашего сервиса. Скачайте его заново в разделе Settings → CA Certificate. У каждого сервиса собственный CA, поэтому публичные наборы CA не подойдут.root certificate file "..." does not exist: вsslrootcertуказан неверный путь. Проверьте, что файлconfig/ca-certificate.pemсуществует.
Дальнейшие шаги
- Используйте те же параметры
sslmodeиsslrootcertв конфигурацииproduction. - Подключение: строки подключения, PgBouncer и TLS.
- Настройки: изменение параметров Postgres и PgBouncer, например
max_connections. - Реплики для чтения: масштабирование нагрузки на чтение, например с помощью нескольких баз данных в Rails.
- Sync to ClickHouse: репликация таблиц Rails в ClickHouse для аналитики.