pg.
En esta guía, creará una nueva aplicación Rails, la conectará a ClickHouse Managed Postgres mediante TLS con verificación, ejecutará una migración y publicará un recurso Post generado mediante scaffolding.
Requisitos previos
- Ruby 3.2 o posterior. Esta guía se probó con Ruby 4.0.7, Rails 8.1.4 y
pg1.6.3. - Una cuenta de ClickHouse Cloud.
pg incluye builds precompilados para Linux, macOS y Windows que ya integran libpq, por lo que no es necesario tener PostgreSQL instalado localmente.
Crear un servicio de ClickHouse Managed Postgres
En la consola de ClickHouse Cloud, haga clic en New service y seleccione Postgres. La instancia estará lista en unos minutos. Para ver un recorrido paso a paso, consulte la guía de inicio rápido.Obtenga los detalles de conexión
Abra su servicio y haga clic en Conectar en la barra lateral izquierda. Deje seleccionada la opción Directly y active Use SSL. Copie la contraseña y el nombre del host del servidor y, a continuación, haga clic en Download CA certificate. El certificado de CA es exclusivo de su servicio. También puede descargarlo más adelante desde configuración → CA Certificate. ¿Conexión directa o PgBouncer? Un servidor Rails es un proceso de larga duración que mantiene su propio grupo de conexiones (max_connections en config/database.yml, cinco por proceso de forma predeterminada), por lo que en esta guía se conecta directamente a Postgres a través del puerto 5432.
Si ejecuta muchos procesos y llega al límite de conexiones, consulte Uso de PgBouncer.
Crear una aplicación de Rails
Instale Rails y cree una aplicación que use PostgreSQL:Configurar la conexión a la base de datos
Mueva el certificado de CA que descargó al directorioconfig de la aplicación y cámbiele el nombre a ca-certificate.pem.
El nombre del archivo descargado corresponde al de su servicio, por ejemplo, your-service-ca-certificate.pem:
config/database.yml, reemplace la sección development por:
sslmode: verify-full hace que libpq compruebe que el certificado del servidor está firmado por la CA de su servicio y que coincide con el nombre del host. Rails.root.join devuelve una ruta absoluta, por lo que la configuración funciona sin importar desde qué directorio inicie Rails.
Configure DATABASE_URL para que apunte a su servicio, con un nombre de base de datos nuevo. Esta guía utiliza guide_rails:
No incluya la cadena de consulta en
DATABASE_URL. Los parámetros de la URL sobrescriben las claves de database.yml, por lo que, si copia sslrootcert=your-service-ca-certificate.pem, su configuración se reemplazaría por una ruta relativa al directorio actual.db:create solo crea la base de datos indicada en DATABASE_URL. Se conecta a la base de datos predeterminada postgres para ejecutar CREATE DATABASE, pero no la modifica. Cuando DATABASE_URL está definida, Rails tampoco crea la base de datos de prueba local.
Generar un modelo y ejecutar la migración
Genere un scaffold para un recursoPost y aplique su migración. En una aplicación existente, bin/rails db:migrate también crea en la nueva base de datos las tablas que ya tiene su aplicación. Estas se crean vacías, ya que los datos de SQLite no se copian:
Consultar la base de datos
Creescript/posts_demo.rb con algunas llamadas de Active Record:
bin/rails runner:
pg_stat_ssl para la conexión actual, lo que confirma que la sesión está cifrada.
Ejecutar la aplicación
Inicie el servidor de desarrollo:guide_rails y seleccione la tabla posts.
Rails también crea schema_migrations y ar_internal_metadata para llevar el control de las migraciones.
La tabla posts contiene las dos filas de script/posts_demo.rb:
Uso de PgBouncer
Cada proceso de Rails abre hastamax_connections conexiones directas. Si, en conjunto, muchos procesos se acercan al límite de conexiones de Postgres, conéctese a través del PgBouncer incluido: seleccione via PgBouncer en el modal Conectar y use el puerto 6432 en DATABASE_URL.
PgBouncer se ejecuta en modo de agrupación por transacción (transaction pooling):
-
Las sentencias preparadas funcionan con la configuración predeterminada de Rails si la gema
pges 1.6 o posterior y utilizalibpq17 o posterior. Las gemas precompiladas depg1.6 incluyenlibpq18. Con estas versiones, cuando Rails elimina una sentencia de su caché, la libera mediante un mensajeClosea nivel de protocolo, que el PgBouncer incluido sabe gestionar. Las versiones anteriores depgolibpqenvían en su lugar la sentencia SQLDEALLOCATE, que falla a través de PgBouncer con el errorprepared statement "a1" does not exist. Si esto ocurre dentro de una transacción, esta se aborta (PG::InFailedSqlTransaction). Para comprobar sus versiones, ejecute:Necesita1.6.0o posterior y170000o posterior. Si no puede actualizar, agregueprepared_statements: falsea la seccióndevelopment. Rails activa las sentencias preparadas enproduction, pero endevelopmentestán desactivadas de forma predeterminada porquequery_log_tags_enabledestá activado. -
Las migraciones adquieren un bloqueo consultivo a nivel de sesión (
pg_try_advisory_lock) para evitar ejecuciones concurrentes. Con la agrupación por transacción, la liberación del bloqueo puede llegar a otra conexión de Postgres, por lo que falla conFailed to release advisory locky el bloqueo queda retenido; en consecuencia, las ejecuciones posteriores fallan conCannot run migrations because another migration process is currently running. Ejecutebin/rails db:migratecon unDATABASE_URLdirecto en el puerto5432o bien desactive el bloqueo:
advisory_locks: false, asegúrese de que solo un despliegue ejecute migraciones a la vez.
Solución de problemas
SSL error: certificate verify failed:sslrootcertno apunta al certificado de CA de su servicio. Vuelva a descargarlo desde configuración → CA Certificate. Cada servicio tiene su propia CA, por lo que los paquetes de CA públicos no funcionan.root certificate file "..." does not exist: la ruta indicada ensslrootcertes incorrecta. Compruebe queconfig/ca-certificate.pemexista.
Próximos pasos
- Use los mismos ajustes de
sslmodeysslrootcerten su configuración deproduction. - Conexión: cadenas de conexión, PgBouncer y TLS.
- Configuración: modifique parámetros de Postgres y PgBouncer como
max_connections. - Réplicas de lectura: escale las lecturas, por ejemplo, con las bases de datos múltiples de Rails.
- Sincronizar con ClickHouse: replique sus tablas de Rails en ClickHouse para analítica.