Esta página explica como iniciar o PGAdapter no Spanner. Para saber mais acerca do PGAdapter, consulte o artigo Acerca do PGAdapter. Para obter o ficheiro binário PGAdapter, consulte o artigo Obtenha o PGAdapter.
Pode iniciar o PGAdapter das seguintes formas:
- Como um processo autónomo
- Num contentor Docker
- No Cloud Run
- Usar o PGAdapter como um proxy sidecar (por exemplo, num cluster do Kubernetes)
- No processo com a sua aplicação Java
Antes de começar
Antes de iniciar o PGAdapter, certifique-se de que fez a autenticação com uma conta de utilizador ou uma conta de serviço na máquina onde o PGAdapter vai ser executado. Se estiver a usar uma conta de serviço,
tem de saber a localização do ficheiro de chave JSON (o ficheiro de credenciais). Em seguida, pode especificar o caminho das credenciais com a opção -c
do PGAdapter ou definindo a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS
.
Para mais informações, consulte:
Escolha um método para executar o PGAdapter
Pode iniciar o PGAdapter como um processo autónomo, num contentor do Docker, no Cloud Run ou no processo com a sua aplicação Java. Quando inicia o PGAdapter, especifica o projeto, a instância do Spanner e a base de dados aos quais se ligar. Também pode especificar o caminho de um ficheiro de credenciais (ficheiro de chave) no formato JSON.
Autónomo
Transfira o PGAdapter com o seguinte comando.
wget https://storage.googleapis.com/pgadapter-jar-releases/pgadapter.tar.gz \ && tar -xzvf pgadapter.tar.gz
Inicie o PGAdapter com o seguinte comando.
java -jar pgadapter.jar -p PROJECT_NAME -i INSTANCE_NAME -d DATABASE_NAME \ -c CREDENTIALS_FILE_PATH \ ADDITIONAL_OPTIONS
As seguintes opções são obrigatórias:
-
-p project_name
- Nome do projeto no qual a base de dados do Spanner está a ser executada.
-
-i instance_name
- Nome da instância do Spanner.
-
-d database_name
- Nome da base de dados à qual estabelecer ligação.
As seguintes opções são opcionais:
-r databaseRole=database_role
- Função da base de dados a usar para a sessão. Para mais informações, consulte o artigo Autorização com o PGAdapter.
-
-c credentials_file_path
- Caminho completo do ficheiro de chaves que contém as credenciais da conta de serviço no formato JSON. Se esta opção não estiver definida, as credenciais
são lidas a partir do caminho especificado pela
variável de ambiente
GOOGLE_APPLICATION_CREDENTIALS
.Para saber como criar uma conta de serviço e transferir um ficheiro de chave formatado em JSON, consulte o artigo Criar uma conta de serviço.
Certifique-se de que concede à conta de serviço credenciais suficientes para aceder à base de dados.
Pode omitir esta opção se se autenticar primeiro com a CLI do Google Cloud com o seguinte comando:
gcloud auth application-default login
Para mais informações, consulte o artigo Configure a autenticação e a autorização.
-
-s port
- Porta em que o PGAdapter está a ouvir. A predefinição é 5432 (a porta PostgreSQL predefinida).
-
-v version_number
-
Número da versão do PostgreSQL a expor ao cliente durante a ligação. O valor predefinido é 14,1
Algumas aplicações e controladores PostgreSQL ativam funcionalidades adicionais consoante este número de versão. O Spanner pode não suportar estas funcionalidades. Consulte Controladores e clientes para ver uma lista completa dos clientes suportados.
-
-x
-
Ative as ligações de anfitriões que não sejam o anfitrião local. Não use quando iniciar o PGAdapter no modo autónomo. Use apenas quando iniciar num contentor do Docker.
Por predefinição, como medida de segurança, o PGAdapter aceita ligações apenas do anfitrião local.
O exemplo seguinte inicia o PGAdapter no modo autónomo na porta 5432 com as credenciais da aplicação predefinidas.
java -jar pgadapter.jar \ -p my-project \ -i my-instance \ -d my-database \ -s 5432
Docker
Inicie o PGAdapter com o seguinte comando.
docker run -d -p HOST-PORT:DOCKER-PORT \ -v CREDENTIALS_FILE_PATH:/acct_credentials.json \ gcr.io/cloud-spanner-pg-adapter/pgadapter:latest \ -p PROJECT_NAME -i INSTANCE_NAME -d DATABASE_NAME \ -c /acct_credentials.json -x OTHER_PGAdapter_OPTIONS
Além das opções do PGAdapter para especificar o projeto, a instância, a base de dados e as credenciais, as seguintes opções são obrigatórias:
-
-p 127.0.0.1:HOST-PORT:DOCKER-PORT
-
Esta opção do Docker mapeia a porta
DOCKER-PORT
no contentor do Docker para a portaHOST-PORT
fora do contentor.DOCKER-PORT
tem de corresponder à forma como o PGAdapter está configurado no contentor. A predefinição é 5432.HOST-PORT
é a porta na qual o Docker deve ouvir fora do contentor para pedidos de ligação. Tem de ser sempre uma porta disponível no anfitrião local.Para mais informações, consulte Publicar ou expor porta (-p, --expose) na documentação do Docker.
-v CREDENTIALS_FILE_PATH:in_container_mount_point
-
Esta opção do Docker associa um volume partilhado. Mapeia o caminho do anfitrião fora do contentor para um volume (ponto de montagem) dentro do contentor. Os caminhos do anfitrião e do contentor estão separados por dois pontos (:).
Esta opção permite que o PGAdapter aceda ao ficheiro de credenciais JSON que está fora do contentor. No exemplo anterior, a opção
-c
faz referência ao ponto de montagem no contentor. Este exemplo atribui o nome ao ponto de montagem no contentor/acct_credentials.json
. Pode atribuir-lhe o nome que quiser.Para mais informações, consulte VOLUME (sistemas de ficheiros partilhados) na documentação do Docker.
-
-x
-
Ative as ligações de anfitriões que não sejam o anfitrião local. Isto é necessário porque a porta no contentor mapeada para a porta do anfitrião não aparece no PGAdapter como localhost.
As seguintes opções são opcionais:
-r databaseRole=database_role
- Função da base de dados a usar para a sessão. Para mais informações, consulte o artigo Autorização com o PGAdapter.
No exemplo seguinte, a porta do Docker e a porta do anfitrião estão ambas definidas para a porta predefinida do serviço de base de dados PostgreSQL 5432.
docker run -d -p 127.0.0.1:5432:5432 \ -v /tmp/credentials.json:/acct_credentials.json \ gcr.io/cloud-spanner-pg-adapter/pgadapter:latest \ -p my_project -i my_instance -d my_database \ -c /acct_credentials.json -x
Cloud Run
Não pode implementar o PGAdapter como um serviço autónomo no Cloud Run, mas pode implementá-lo como um proxy sidecar.
Recomendamos a execução do PGAdapter num padrão sidecar em vez de o executar como um serviço separado pelos seguintes motivos:- Evita um ponto único de falha. O acesso de cada aplicação à sua base de dados é independente das outras, o que as torna mais resilientes.
- O número de instâncias do PGAdapter é dimensionado automaticamente de forma linear com o número de instâncias da aplicação.
O repositório do GitHub do PGAdapter contém várias aplicações de exemplo funcionais que usam o Cloud Run e o PGAdapter como um proxy sidecar para várias linguagens de programação.
O ficheiro de configuração seguinte mostra como adicionar o PGAdapter como um proxy sidecar ao Cloud Run:
apiVersion: serving.knative.dev/v1 kind: Service metadata: annotations: # This example uses an in-memory volume for Unix domain sockets. # This is a Cloud Run beta feature. run.googleapis.com/launch-stage: BETA name: pgadapter-sidecar-example spec: template: metadata: annotations: run.googleapis.com/execution-environment: gen1 # This registers 'pgadapter' as a dependency of 'app' and ensures that pgadapter starts # before the app container. run.googleapis.com/container-dependencies: '{"app":["pgadapter"]}' spec: # Create an in-memory volume that can be used for Unix domain sockets. volumes: - name: sockets-dir emptyDir: # This directory contains the virtual socket files that are used to # communicate between your application and PGAdapter. sizeLimit: 50Mi medium: Memory containers: # This is the main application container. - name: app # Example: europe-north1-docker.pkg.dev/my-test-project/cloud-run-source-deploy/pgadapter-sidecar-example image: MY-REGION.pkg.dev/MY-PROJECT/cloud-run-source-deploy/pgadapter-sidecar-example # The PGADAPTER_HOST variable is set to point to /sockets, which is the shared in-memory # volume that is used for Unix domain sockets. env: - name: SPANNER_PROJECT value: my-project - name: SPANNER_INSTANCE value: my-instance - name: SPANNER_DATABASE value: my-database - name: PGADAPTER_HOST value: /sockets - name: PGADAPTER_PORT value: "5432" ports: - containerPort: 8080 volumeMounts: - mountPath: /sockets name: sockets-dir # This is the PGAdapter sidecar container. - name: pgadapter image: gcr.io/cloud-spanner-pg-adapter/pgadapter volumeMounts: - mountPath: /sockets name: sockets-dir args: - -dir /sockets - -x # Add a startup probe that checks that PGAdapter is listening on port 5432. startupProbe: initialDelaySeconds: 10 timeoutSeconds: 10 periodSeconds: 10 failureThreshold: 3 tcpSocket: port: 5432
Proxy complementar
Pode usar o PGAdapter como um proxy sidecar, por exemplo, num cluster do Kubernetes. Os contentores secundários do Kubernetes são executados em paralelo com o contentor principal no pod.
Recomendamos a execução do PGAdapter num padrão sidecar em vez de o executar como um serviço separado pelos seguintes motivos:
- Evita um ponto único de falha. O acesso de cada aplicação à sua base de dados é independente das outras, o que as torna mais resilientes.
- Uma vez que o PGAdapter consome recursos numa relação linear com a utilização, este padrão permite-lhe definir e pedir recursos com maior precisão para corresponder às suas aplicações à medida que são dimensionadas.
O ficheiro de configuração seguinte mostra como adicionar o PGAdapter como um proxy sidecar ao seu cluster do Kubernetes:
containers: - name: pgadapter image: gcr.io/cloud-spanner-pg-adapter/pgadapter ports: - containerPort: 5432 args: - "-p my-project" - "-i my-instance" - "-d my-database" - "-x" resources: requests: # PGAdapter's memory use scales linearly with the number of active # connections. Fewer open connections will use less memory. Adjust # this value based on your application's requirements. memory: "512Mi" # PGAdapter's CPU use scales linearly with the amount of IO between # the database and the application. Adjust this value based on your # application's requirements. cpu: "1"
O repositório do GitHub do PGAdapter contém um guia passo a passo e uma aplicação de exemplo. Este exemplo inclui instruções para usar a Workload Identity Federation para o GKE com o PGAdapter.
Java In-process
Crie e inicie uma instância do PGAdapter com o seu código Java. Esta é a configuração recomendada para aplicações Java.
Se estiver a usar uma conta de serviço para autenticação, certifique-se de que a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS
está definida para o caminho do ficheiro de credenciais.
-
Adicione
google-cloud-spanner-pgadapter
como uma dependência ao seu projeto. Para obter detalhes, consulte o artigo Obtenha o PGAdapter. - Crie um servidor através da classe
com.google.cloud.spanner.pgadapter.ProxyServer
.
/**
* Starts PGAdapter in-process and returns a reference to the server. Use this reference to
* gracefully shut down the server when your application shuts down.
*
* @param project the Google Cloud project that PGAdapter should connect to
* @param instance the Spanner instance that PGAdapter should connect to
* @param credentialsFile the full path of a credentials file that PGAdapter should use, or
* null
if PGAdapter should use the application default credentials
*/
static Server startPGAdapter(String project, String instance, String credentialsFile) {
OptionsMetadata.Builder builder =
OptionsMetadata.newBuilder()
.setProject(project)
.setInstance(instance)
// Start PGAdapter on any available port.
.setPort(0);
if (credentialsFile != null) {
builder.setCredentialsFile(credentialsFile);
}
ProxyServer server = new ProxyServer(builder.build());
server.startServer();
server.awaitRunning();
return new PGAdapter(server);
}
O repositório do GitHub do PGAdapter contém uma aplicação de exemplo completa.
Orientações de atribuição de recursos para o proxy complementar PGAdapter
As diretrizes seguintes podem ajudar a configurar os recursos de CPU e memória para o proxy sidecar do PGAdapter. Os valores ideais variam consoante a sua carga de trabalho específica.
Memória
Uma vez que o PGAdapter não armazena em cache muitos dados, requer memória para converter os resultados das consultas do formato gRPC do Spanner para o formato do protocolo de rede do PostgreSQL. Isto é especialmente relevante para cargas de trabalho com grandes colunas binárias, porque o Spanner e o PostgreSQL processam estes tipos de dados de forma diferente.
Para determinar a quantidade de memória a atribuir, use a seguinte fórmula para a atribuição de memória, em que <var>number of concurrent connections</var>
é o número de ligações simultâneas processadas pela sua aplicação:
384 MB + (2 MB * number of concurrent connections)
Por exemplo, se a sua aplicação processar 200 ligações simultâneas, atribua aproximadamente 784 MB de memória:
384 MB + (2 MB * 200) = 784 MB
Comece com esta atribuição de memória de base. Monitorize a respetiva utilização sob uma carga realista para ajustar o valor às suas necessidades específicas.
CPU
O PGAdapter não consome muitos recursos da CPU. Isto deve-se ao facto de a sua função principal ser a de atuar como um proxy de passagem. No entanto, a utilização da CPU aumenta com a quantidade de dados enviados e recebidos.
Considere os seguintes fatores ao atribuir CPU:
- Carga de trabalho: as aplicações que executam consultas que devolvem grandes quantidades de dados requerem mais capacidade de processamento da CPU por ligação do que as que devolvem apenas algumas linhas e colunas.
- Padrão de acesso à aplicação: se a sua aplicação aceder ao Spanner de forma síncrona, fica inativa enquanto aguarda dados do proxy. Neste caso, é menos provável que a aplicação e o proxy compitam por recursos da CPU.
Comece com uma atribuição de CPU base. Monitorize a respetiva utilização sob uma carga realista para ajustar o valor às suas necessidades específicas.
O que se segue?
- Associe o
psql
a uma base de dados PostgreSQL - Associe o
JDBC
a uma base de dados PostgreSQL - Associe o
pgx
a uma base de dados PostgreSQL - Associe o
psycopg2
a uma base de dados PostgreSQL - Associe o
psycopg3
a uma base de dados PostgreSQL - Associe o
node-postgres
a uma base de dados PostgreSQL