In diesem Dokument wird beschrieben, wie Sie mit PGAdapter eine Verbindung zu Spanner Omni herstellen. Sie konfigurieren PGAdapter, um sichere Verbindungen herzustellen. PGAdapter unterstützt Verbindungen mit Nur-Text, Transport Layer Security (TLS), TLS mit Anmeldedaten, und gegenseitigem TLS (mTLS). Diese Sicherheitskonfigurationen schützen Ihre Daten bei der Übertragung durch unterschiedliche Verschlüsselungs- und Authentifizierungsebenen. Jede Konfiguration erfordert bestimmte Clienteinstellungen, um Datenintegrität und Vertraulichkeit zu gewährleisten.
Sie können PGAdapter als eigenständigen Prozess ausführen oder direkt in Ihre Anwendung einbinden. Für die interaktive Verwaltung und die manuelle Ausführung von Abfragen stellen Sie mit Standard-PostgreSQL-Tools wie psql eine Verbindung zu Ihrer Datenbank her. Verwenden Sie zum Erstellen automatisierter Anwendungen PostgreSQL-kompatible Treiber wie die folgenden:
pgxfür Gopsycopg3für Pythonnode-postgresfür Node.js
Codebeispiele, in denen einige dieser Treiber verwendet werden, finden Sie im Beispielcode in diesem Dokument.
Hinweis
Wenn Sie PGAdapter mit Spanner Omni verwenden möchten, verwenden Sie PGAdapter Version 0.55.2 oder höher.
Wenn Sie Maven ohne Bill of Materials (BOM) verwenden, fügen Sie den Abhängigkeiten der Datei pom.xml Folgendes hinzu:
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-spanner-pgadapter</artifactId>
<version>0.55.2</version>
</dependency>
Sicherheitskonfigurationen
Spanner Omni PGAdapter unterstützt vier Sicherheitskonfigurationen, die definieren, wie die Kommunikation zwischen PGAdapter und der Datenbank verschlüsselt und authentifiziert wird. Wenn Sie diese Konfigurationen verwenden möchten, legen Sie die in der folgenden Tabelle beschriebenen Clientoptionen fest:
| Sicherheitskonfiguration | Beschreibung |
|---|---|
| Nur-Text | Die Kommunikation ist nicht verschlüsselt. |
| TLS | Die Kommunikation wird mit Transport Layer Security (TLS) verschlüsselt. Für diese Konfiguration müssen Sie das Spanner Omni-CA Zertifikat dem Java-Truststore hinzufügen, wie unter Java-Truststore konfigurieren beschrieben. |
| TLS mit Anmeldedaten | Die Kommunikation wird mit TLS verschlüsselt und die Authentifizierung erfolgt mit einem Nutzernamen und einem Passwort. |
| mTLS | Die Kommunikation wird mit gegenseitigem TLS (mTLS) verschlüsselt. Für diese Konfiguration müssen Sie sowohl ein Clientzertifikat als auch einen privaten Clientschlüssel angeben. |
Als eigenständigen Prozess ausführen
Führen Sie PGAdapter als eigenständigen Prozess für Nicht-Java-Anwendungen und für Standard-PostgreSQL-Tools wie psql aus, wenn Sie manuell mit der Datenbank interagieren müssen. Bei diesem Ansatz wird der Proxy vom Lebenszyklus Ihrer Anwendung entkoppelt, sodass Sie ihn unabhängig verwalten und aktualisieren können. Verwenden Sie die folgenden Konfigurationsmethoden, um PGAdapter als eigenständigen Prozess zu starten, je nach ausgewählter Sicherheitskonfiguration:
Nur-Text
Führen Sie den folgenden Befehl aus, um PGAdapter mit Nur-Text-Kommunikation zu starten:
java -jar pgadapter.jar \
-d DATABASE_ID \
-e ENDPOINT \
-r "type=omni;usePlainText=true"
Ersetzen Sie Folgendes:
DATABASE_ID: die ID Ihrer Spanner Omni-Datenbank, z. B.test-db.ENDPOINT: der Endpunkt Ihrer Spanner Omni-Instanz, z. B.localhost:15000.
TLS
Wenn Sie eine PGAdapter-Verbindung mit TLS konfigurieren möchten, müssen Sie das Spanner Omni-CA-Zertifikat dem Java-Truststore hinzufügen, wie unter Java-Truststore konfigurieren beschrieben.
Führen Sie den folgenden Befehl aus, um PGAdapter mit TLS zu starten:
java -Djavax.net.ssl.trustStore=$JAVA_HOME/lib/security/cacerts \
-Djavax.net.ssl.trustStoreType=JKS \
-jar pgadapter.jar \
-d DATABASE_ID \
-e ENDPOINT \
-r "type=omni"
TLS mit Anmeldedaten
Verwenden Sie den Parameter -r, um username und password anzugeben, um eine TLS-Verbindung mit Authentifizierung per Nutzername und Passwort herzustellen:
java -Djavax.net.ssl.trustStore=$JAVA_HOME/lib/security/cacerts \
-Djavax.net.ssl.trustStoreType=JKS \
-jar pgadapter.jar \
-d DATABASE_ID \
-e ENDPOINT \
-r "type=omni;username=USERNAME;password=PASSWORD"
Ersetzen Sie Folgendes:
USERNAME: der Nutzername für Ihren Spanner Omni-Nutzer.PASSWORD: das Passwort für Ihren Spanner Omni-Nutzer.
mTLS
Bevor Sie PGAdapter mit mTLS starten können, muss Ihr Clientschlüssel im PKCS#8-Format vorliegen. Führen Sie den folgenden Befehl aus, um einen vorhandenen Schlüssel in das PKCS#8-Format zu konvertieren:
openssl pkcs8 -topk8 -in ~/.spanner/certs/client.key -out ~/.spanner/certs/java-client.key -nocrypt
Alternativ können Sie beim Erstellen des Clientzertifikats und ‑schlüssels mit der Spanner Omni-CLI den Parameter --generate-pkcs8-key angeben, um den Schlüssel im PKCS#8-Format zu generieren.
Führen Sie den folgenden Befehl aus, um PGAdapter mit mTLS zu starten:
java -Djavax.net.ssl.trustStore=$JAVA_HOME/lib/security/cacerts \
-Djavax.net.ssl.trustStoreType=JKS \
-jar pgadapter.jar \
-d DATABASE_ID \
-e ENDPOINT \
-r "type=omni;clientCertificate=PATH_TO_CLIENT_CERT;clientKey=PATH_TO_CLIENT_KEY"
Ersetzen Sie Folgendes:
PATH_TO_CLIENT_CERT: der Pfad zu Ihrer Clientzertifikatsdatei.PATH_TO_CLIENT_KEY: der Pfad zu Ihrer Clientschlüsseldatei.
Mit psql verbinden
Nachdem Sie mit einer der oben genannten Methoden eine Verbindung hergestellt haben, führen Sie psql aus, um Ihre Datenbank zu verwalten und Abfragen auszuführen. Verwenden Sie den folgenden Befehl, um eine Verbindung zu psql herzustellen:
psql -h PG_HOST -p PG_PORT -U USERNAME -d DATABASE_ID
Ersetzen Sie Folgendes:
PG_HOST: der Hostname oder die IP-Adresse des Computers, auf dem PGAdapter ausgeführt wird. Wenn Sie lokal arbeiten, verwenden Sielocalhost.PG_PORT: die Portnummer, auf der PGAdapter ausgeführt wird. Wenn Sie keinen benutzerdefinierten Port angegeben haben, verwendet PGAdapter standardmäßig Port5432.USERNAME: Ihr PostgreSQL-Nutzername.
Als Verarbeitungsprozess mit Ihrer Anwendung ausführen
Sie können PGAdapter auch als Verarbeitungsprozess mit Ihrer Anwendung starten. Konfigurieren Sie das Objekt OptionsMetadata für jede unterstützte Sicherheitskonfiguration, um die Sicherheit zu gewährleisten:
Nur-Text
Verwenden Sie die folgende Konfiguration für die Nur-Text-Kommunikation in Umgebungen wie der lokalen Entwicklung oder beim Testen:
OptionsMetadata.Builder builder =
OptionsMetadata.newBuilder()
.setEndpoint("ENDPOINT")
.setType("omni")
.setUsePlainText();
ProxyServer server = new ProxyServer(builder.build());
server.startServer();
server.awaitRunning();
TLS
Wenn Sie eine TLS-Verbindung herstellen möchten, fügen Sie das CA-Zertifikat Ihrem Java Truststore hinzu, wie unter Java-Truststore konfigurieren beschrieben, und verwenden Sie die folgende Konfiguration:
OptionsMetadata.Builder builder =
OptionsMetadata.newBuilder()
.setEndpoint("ENDPOINT")
.setType("omni");
ProxyServer server = new ProxyServer(builder.build());
server.startServer();
server.awaitRunning();
TLS mit Anmeldedaten
Verwenden Sie setProperties(), um den Nutzernamen und das Passwort anzugeben, um eine TLS-Verbindung mit Authentifizierung per Nutzername und Passwort herzustellen:
OptionsMetadata.Builder builder =
OptionsMetadata.newBuilder()
.setEndpoint("ENDPOINT")
.setType("omni")
.setProperties(
Map.of(
"username", "USERNAME",
"password", "PASSWORD"));
ProxyServer server = new ProxyServer(builder.build());
server.startServer();
server.awaitRunning();
mTLS
Wenn Sie PGAdapter als Verarbeitungsprozess mit Ihrer Java-Anwendung mit mTLS starten möchten, muss Ihr Clientschlüssel das PKCS#8-Format verwenden.
Verwenden Sie diese Konfiguration, um eine mTLS-Verbindung als Verarbeitungsprozess herzustellen:
OptionsMetadata.Builder builder =
OptionsMetadata.newBuilder()
.setEndpoint("ENDPOINT")
.setType("omni")
.useClientCert(
"PATH_TO_CLIENT_CERT",
"PATH_TO_CLIENT_KEY");
ProxyServer server = new ProxyServer(builder.build());
server.startServer();
server.awaitRunning();
Beispielcode
In diesem Abschnitt finden Sie Beispielcode für die Verbindung zu einer Spanner Omni-Datenbank mit den folgenden PostgreSQL-kompatiblen Treibern:
Ersetzen Sie den folgenden Platzhalter in Ihren Verbindungsstrings:
- PASSWORD: das Passwort für Ihren PostgreSQL-Nutzer.
JDBC
Sie können mit dem PostgreSQL-JDBC-Treiber eine Verbindung zu PGAdapter herstellen, so als würden Sie eine Verbindung zu einer PostgreSQL-Datenbank herstellen. Verwenden Sie den folgenden Beispielcode, um eine Verbindung zu einer Tabelle in einer Spanner Omni-Datenbank herzustellen und eine Abfrage auszuführen:
String jdbcUrl =
"jdbc:postgresql://PG_HOST:PG_PORT/DATABASE_ID";
try (Connection connection = DriverManager.getConnection(jdbcUrl)) {
// Example: Query data
try (Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM Singers")) {
System.out.println("Query Results:");
while (resultSet.next()) {
long id = resultSet.getLong("id");
String name = resultSet.getString("name");
System.out.printf("ID: %d, Name: %s\n", id, name);
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
Go (pgx)
Sie können mit pgx eine Verbindung zu PGAdapter herstellen, so als würden Sie eine Verbindung zu einer PostgreSQL-Datenbank herstellen. Verwenden Sie den folgenden Beispielcode:
// Database connection string
connString := "postgres://USERNAME:PASSWORD@PG_HOST:PG_PORT/DATABASE_ID?sslmode=disable"
ctx := context.Background()
// Connect to PGAdapter
conn, err := pgx.Connect(ctx, connString)
if err != nil {
log.Fatalf("Connection error: %s", err.Error())
}
defer conn.Close(ctx)
// Query all rows from the Singers table
rows, err := conn.Query(ctx, "SELECT id, name FROM Singers")
if err != nil {
log.Fatalf("Query error: %s", err.Error())
}
defer rows.Close()
// Iterate over the result set
fmt.Println("Singers Table Data:")
for rows.Next() {
var id int
var name string
if err := rows.Scan(&id, &name); err != nil {
log.Fatalf("Scan error: %s", err.Error())
}
fmt.Printf("ID: %d, Name: %s\n", id, name)
}
Python (psycopg2 oder psycopg3)
Sie können mit psycopg2 oder psycopg3 eine Verbindung zu PGAdapter herstellen, so als würden Sie eine Verbindung zu einer PostgreSQL-Datenbank herstellen. Verwenden Sie den folgenden Beispielcode, um eine Verbindung zu einer Tabelle in einer Spanner Omni-Datenbank herzustellen und eine Abfrage auszuführen:
# psycopg2
import psycopg2
connection = psycopg2.connect(database="DATABASE_ID",
host="PG_HOST",
port=PG_PORT)
cursor = connection.cursor()
cursor.execute('SELECT * FROM Singers')
for row in cursor:
print(row)
cursor.close()
connection.close()
# psycopg3
import psycopg
with psycopg.connect("host=PG_HOST port=PG_PORT dbname=DATABASE_ID sslmode=disable") as conn:
conn.autocommit = True
with conn.cursor() as cur:
cur.execute("SELECT * FROM Singers")
for row in cur:
print(row)
Node.js (node-postgres)
Sie können mit
node-postgres eine Verbindung zu PGAdapter herstellen, so als würden Sie
eine Verbindung zu einer PostgreSQL-Datenbank herstellen. Verwenden Sie den folgenden Beispielcode, um eine Verbindung zu einer Tabelle in einer Spanner Omni-Datenbank herzustellen und eine Abfrage auszuführen:
const { Client } = require('pg');
const client = new Client({
host: 'PG_HOST',
port: PG_PORT,
database: 'DATABASE_ID',
});
await client.connect();
const res = await client.query("SELECT * FROM Singers");
console.log(res.rows);
await client.end();