En esta página, se explica cómo iniciar PGAdapter en Spanner. Para obtener más información sobre PGAdapter, consulta Acerca de PGAdapter. Para obtener el archivo binario de PGAdapter, consulta Obtén PGAdapter.
Puedes iniciar PGAdapter de las siguientes maneras:
- Como proceso independiente
- Dentro de un contenedor de Docker
- En Cloud Run
- Cómo usar PGAdapter como proxy de sidecar (por ejemplo, en un clúster de Kubernetes)
- En proceso con tu aplicación de Java
Antes de comenzar
Antes de iniciar PGAdapter, asegúrate de haberte autenticado con una cuenta de usuario o una cuenta de servicio en la máquina en la que se ejecutará PGAdapter. Si usas una cuenta de servicio,
debes conocer la ubicación del archivo de claves JSON (el archivo de credenciales). Luego, puedes especificar la ruta de acceso de las credenciales con la opción -c
de PGAdapter o configurando la variable de entorno GOOGLE_APPLICATION_CREDENTIALS
.
Para obtener más información, consulte:
Elige un método para ejecutar PGAdapter
Puedes iniciar PGAdapter como un proceso independiente, dentro de un contenedor de Docker, en Cloud Run o en proceso con tu aplicación de Java. Cuando inicias PGAdapter, debes especificar el proyecto, la instancia de Spanner y la base de datos a la que te conectarás. También puedes especificar la ruta de acceso de un archivo de credenciales con formato JSON (archivo de claves).
Independiente
Descarga PGAdapter con el siguiente comando.
wget https://storage.googleapis.com/pgadapter-jar-releases/pgadapter.tar.gz \ && tar -xzvf pgadapter.tar.gz
Inicia PGAdapter con el siguiente comando.
java -jar pgadapter.jar -p PROJECT_NAME -i INSTANCE_NAME -d DATABASE_NAME \ -c CREDENTIALS_FILE_PATH \ ADDITIONAL_OPTIONS
Se requieren las siguientes opciones:
-
-p project_name
- Nombre del proyecto en el que se ejecuta la base de datos de Spanner.
-
-i instance_name
- Nombre de la instancia de Spanner.
-
-d database_name
- Nombre de la base de datos a la que te conectarás.
Las siguientes configuraciones son opcionales:
-r databaseRole=database_role
- Es el rol de la base de datos que se usará para la sesión. Para obtener más información, consulta Autorización con PGAdapter.
-
-c credentials_file_path
- Es la ruta de acceso completa para el archivo de claves que contiene las credenciales de la cuenta de servicio en formato JSON. Si no se configura esta opción, las credenciales se leen desde la ruta de acceso especificada por la variable de entorno
GOOGLE_APPLICATION_CREDENTIALS
.Para aprender a crear una cuenta de servicio y descargar un archivo de claves con formato JSON, consulta Cómo crear una cuenta de servicio.
Asegúrate de otorgar a la cuenta de servicio las credenciales suficientes para acceder a la base de datos.
Puedes omitir esta opción si primero te autenticas con Google Cloud CLI con el siguiente comando:
gcloud auth application-default login
Para obtener más información, consulta Configura la autenticación y la autorización.
-
-s port
- Puerto en el que PGAdapter escucha. El valor predeterminado es 5432 (el puerto predeterminado de PostgreSQL).
-
-v version_number
-
Es el número de versión de PostgreSQL que se expone al cliente durante la conexión. El valor predeterminado es 14.1.
Algunos controladores y aplicaciones de PostgreSQL habilitan funciones adicionales según este número de versión. Es posible que Spanner no sea compatible con estas funciones. Consulta Controladores y clientes para obtener una lista completa de los clientes compatibles.
-
-x
-
Habilita las conexiones desde hosts que no sean localhost. No lo uses cuando inicies PGAdapter en modo independiente. Úsalo solo cuando inicies dentro de un contenedor de Docker.
De forma predeterminada, como medida de seguridad, PGAdapter solo acepta conexiones de localhost.
En el siguiente ejemplo, se inicia PGAdapter en modo independiente en el puerto 5432 con las credenciales predeterminadas de la aplicación.
java -jar pgadapter.jar \ -p my-project \ -i my-instance \ -d my-database \ -s 5432
Docker
Inicia PGAdapter con el siguiente 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
Además de las opciones de PGAdapter para especificar el proyecto, la instancia, la base de datos y las credenciales, se requieren las siguientes opciones:
-
-p 127.0.0.1:HOST-PORT:DOCKER-PORT
-
Con esta opción de Docker, se asigna el puerto
DOCKER-PORT
dentro del contenedor de Docker al puertoHOST-PORT
fuera del contenedor.DOCKER-PORT
debe coincidir con la forma en que se configura PGAdapter dentro del contenedor. El valor predeterminado es 5432.HOST-PORT
es el puerto que Docker debe escuchar fuera del contenedor para las solicitudes de conexión. Siempre debe ser un puerto disponible en localhost.Para obtener más información, consulta Puerto de publicación o exposición (-p, --expose) en la documentación de Docker.
-v CREDENTIALS_FILE_PATH:in_container_mount_point
-
Esta opción de Docker activa un volumen compartido. Asigna la ruta de acceso del host fuera del contenedor a un volumen (punto de activación) dentro del contenedor. Las rutas de acceso de host y de contenedor están separadas por dos puntos (:).
Esta opción permite que PGAdapter acceda al archivo de credenciales JSON que está fuera del contenedor. En el ejemplo anterior, la opción
-c
hace referencia al punto de activación dentro del contenedor. En este ejemplo, se asigna al nombre el punto de activación/acct_credentials.json
en el contenedor. Puedes nombrarlo como desees.Para obtener más información, consulta VOLUMEN (sistemas de archivos compartidos) VOLUMEN (sistemas de archivos compartidos) en la documentación de Docker.
-
-x
-
Habilita las conexiones desde hosts que no sean localhost. Esto es necesario porque el puerto dentro del contenedor que se asigna al puerto host no aparece para PGAdapter como localhost.
Las siguientes configuraciones son opcionales:
-r databaseRole=database_role
- Es el rol de la base de datos que se usará para la sesión. Para obtener más información, consulta Autorización con PGAdapter.
En el siguiente ejemplo, el puerto de Docker y el puerto de host están configurados en el puerto 5432 predeterminado del servicio de base de datos de PostgreSQL.
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
No puedes implementar PGAdapter como un servicio independiente en Cloud Run, pero puedes implementarlo como un proxy de sidecar.
Se recomienda ejecutar PGAdapter en un patrón de sidecar en lugar de ejecutarlo como un servicio independiente por los siguientes motivos:- Evita un punto único de fallo. El acceso de cada aplicación a la base de datos es independiente de las demás, por lo que es más resistente.
- La cantidad de instancias de PGAdapter se escala de forma lineal automáticamente con la cantidad de instancias de la aplicación.
El repositorio de GitHub de PGAdapter contiene varias aplicaciones de ejemplo funcionales que usan Cloud Run y PGAdapter como proxy secundario para varios lenguajes de programación.
En el siguiente archivo de configuración, se muestra cómo agregar PGAdapter como un proxy de sidecar a 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 de Sidecar
Puedes usar PGAdapter como proxy de sidecar en, por ejemplo, un clúster de Kubernetes. Los contenedores de sidecar de Kubernetes se ejecutan en paralelo con el contenedor principal del pod.
Se recomienda ejecutar PGAdapter en un patrón de sidecar en lugar de ejecutarlo como un servicio independiente por los siguientes motivos:
- Evita un punto único de fallo. El acceso de cada aplicación a la base de datos es independiente de las demás, por lo que es más resistente.
- Debido a que PGAdapter consume recursos en una relación lineal con el uso, este patrón te permite definir el alcance y solicitar recursos con mayor precisión para que se ajusten a tus aplicaciones a medida que se escalan.
En el siguiente archivo de configuración, se muestra cómo agregar PGAdapter como proxy de sidecar a tu clúster de 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"
El repositorio de GitHub de PGAdapter contiene una guía paso a paso y una aplicación de ejemplo. Este ejemplo incluye instrucciones para usar la federación de identidades para cargas de trabajo para GKE con PGAdapter.
Java en proceso
Crea e inicia una instancia de PGAdapter con tu código de Java. Esta es la configuración recomendada para las aplicaciones de Java.
Si usas una cuenta de servicio para la autenticación, asegúrate de que la variable de entorno GOOGLE_APPLICATION_CREDENTIALS
esté configurada en la ruta de acceso del archivo de credenciales.
-
Agrega
google-cloud-spanner-pgadapter
como dependencia a tu proyecto. Para obtener más información, consulta Cómo obtener PGAdapter. - Compila un servidor con la clase
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);
}
El repositorio de GitHub de PGAdapter contiene una aplicación de ejemplo completa.
¿Qué sigue?
- Conecta
psql
a una base de datos de PostgreSQL. - Conecta
JDBC
a una base de datos de PostgreSQL. - Conecta
pgx
a una base de datos de PostgreSQL. - Conecta
psycopg2
a una base de datos de PostgreSQL. - Conecta
psycopg3
a una base de datos de PostgreSQL. - Conecta
node-postgres
a una base de datos de PostgreSQL.