pg.
Neste guia, você vai criar uma nova aplicação Rails, conectá-la ao ClickHouse Managed Postgres via TLS com verificação, executar uma migração e disponibilizar um recurso Post gerado com scaffold.
Pré-requisitos
- Ruby 3.2 ou posterior. Este guia foi testado com Ruby 4.0.7, Rails 8.1.4 e
pg1.6.3. - Uma conta no ClickHouse Cloud.
pg é distribuída com binários pré-compilados para Linux, macOS e Windows que já incluem a libpq, então você não precisa ter o PostgreSQL instalado localmente.
Crie um serviço ClickHouse Managed Postgres
No console do ClickHouse Cloud, clique em New service e selecione Postgres. A instância fica pronta em poucos minutos. Para um passo a passo completo, consulte o guia de início rápido.Obtenha os detalhes de conexão
Abra o seu serviço e clique em Connect na barra lateral esquerda. Mantenha Directly selecionado e ative Use SSL. Copie a senha e o hostname do servidor e, em seguida, clique em Download CA certificate. O certificado da CA é único para o seu serviço. Você também pode baixá-lo mais tarde em Settings → CA Certificate. Conexão direta ou PgBouncer? Um servidor Rails é um processo de longa duração que mantém o próprio pool de conexões (max_connections em config/database.yml, cinco por processo por padrão). Por isso, este guia se conecta diretamente ao Postgres na porta 5432.
Se você executar muitos processos e atingir o limite de conexões, consulte Usando o PgBouncer.
Crie um aplicativo Rails
Instale o Rails e crie um aplicativo que use o PostgreSQL:Configure a conexão com o banco de dados
Mova o certificado de CA que você baixou para o diretórioconfig do aplicativo e renomeie-o para ca-certificate.pem.
O arquivo baixado tem o nome do seu serviço, por exemplo, your-service-ca-certificate.pem:
config/database.yml, substitua a seção development por:
sslmode: verify-full faz com que o libpq verifique se o certificado do servidor foi assinado pela CA do seu serviço e se corresponde ao hostname. Rails.root.join retorna um caminho absoluto, então a configuração funciona independentemente do diretório em que você inicia o Rails.
Defina DATABASE_URL apontando para o seu serviço, com um novo nome de banco de dados. Este guia usa guide_rails:
Não inclua a string de consulta em
DATABASE_URL. Os parâmetros na URL sobrescrevem as chaves em database.yml; assim, um sslrootcert=your-service-ca-certificate.pem copiado substituiria sua configuração por um caminho relativo ao diretório atual.db:create cria apenas o banco de dados indicado em DATABASE_URL. Ele se conecta ao banco de dados padrão postgres para executar CREATE DATABASE, mas não o modifica. Quando DATABASE_URL está definida, o Rails também não cria o banco de dados de teste local.
Gerar um model e executar a migração
Gere um scaffold para um recursoPost e aplique a migração correspondente. Em uma aplicação existente, bin/rails db:migrate também cria no novo banco de dados as tabelas que sua aplicação já tem. Elas começam vazias, pois os dados do SQLite não são copiados:
Consultar o banco de dados
Criescript/posts_demo.rb com algumas chamadas do Active Record:
bin/rails runner:
pg_stat_ssl para a conexão atual, confirmando que a sessão está criptografada.
Execute o aplicativo
Inicie o servidor de desenvolvimento:guide_rails e selecione a tabela posts.
O Rails também cria schema_migrations e ar_internal_metadata para controlar as migrações.
A tabela posts contém as duas linhas criadas por script/posts_demo.rb:
Usando o PgBouncer
Cada processo Rails abre atémax_connections conexões diretas. Se muitos processos, somados, se aproximarem do limite de conexões do Postgres, conecte-se pelo PgBouncer incluído: selecione via PgBouncer no modal Connect e use a porta 6432 em DATABASE_URL.
O PgBouncer é executado no modo de pooling de transações:
-
Prepared statements funcionam com as configurações padrão do Rails se a gem
pgestiver na versão 1.6 ou posterior e usar alibpq17 ou posterior. As gems pré-compiladaspg1.6 já incluem alibpq18. Com essas versões, quando o Rails remove uma instrução do cache, ele a libera com uma mensagemCloseno nível do protocolo, que o PgBouncer incluído consegue tratar. Versões mais antigas depgoulibpqenviam umDEALLOCATEem SQL, que falha ao passar pelo PgBouncer comprepared statement "a1" does not exist. Se isso acontecer dentro de uma transação, a transação é abortada (PG::InFailedSqlTransaction). Para verificar suas versões, execute:Você precisa de1.6.0ou posterior e de170000ou posterior. Se não for possível fazer o upgrade, adicioneprepared_statements: falseà seçãodevelopment. O Rails habilita prepared statements emproduction, mas emdevelopmenteles ficam desabilitados por padrão porquequery_log_tags_enabledestá habilitado. -
Migrações adquirem um advisory lock no nível da sessão (
pg_try_advisory_lock) para impedir execuções simultâneas. No pooling de transações, a liberação do bloqueio pode ir para outra conexão do Postgres, o que falha comFailed to release advisory locke mantém o bloqueio ativo; com isso, as execuções seguintes falham comCannot run migrations because another migration process is currently running. Executebin/rails db:migratecom umDATABASE_URLdireto na porta5432ou desative o bloqueio:
advisory_locks: false, garanta que apenas uma implantação execute as migrações por vez.
Solução de problemas
SSL error: certificate verify failed:sslrootcertnão aponta para o certificado de CA do seu serviço. Baixe-o novamente em Settings → CA Certificate. Cada serviço tem sua própria CA, e bundles de CA públicos não funcionam.root certificate file "..." does not exist: o caminho emsslrootcertestá incorreto. Verifique se o arquivoconfig/ca-certificate.pemexiste.
Próximos passos
- Use as mesmas configurações de
sslmodeesslrootcertno seu ambienteproduction. - Conexão: strings de conexão, PgBouncer e TLS.
- Configurações: altere parâmetros do Postgres e do PgBouncer, como
max_connections. - Réplicas de leitura: escale as leituras, por exemplo, com o recurso de múltiplos bancos de dados do Rails.
- Sincronizar com o ClickHouse: replique suas tabelas do Rails para o ClickHouse para fins de analytics.