Einstellung des Snowflake Connector for MySQL Agent Container

Bemerkung

Der Snowflake Connector for MySQL unterliegt den Nutzungsbedingungen für Konnektoren.

In diesem Thema wird die Prozedur zur Einstellung des Snowflake Connector for MySQL Agent Container beschrieben. Ein Konnektor-Agent für Datenbanken ist eine containerisierte Anwendung, die innerhalb Ihrer Infrastruktur läuft und eine direkte Verbindung zu Ihren Datenbanken und zu Snowflake herstellt.

Die Konfiguration des Snowflake Connector for MySQL-Agenten umfasst die folgenden Aufgaben:

  1. Prüfen Sie die Voraussetzungen, und wählen Sie ein Orchestrierungssystem aus

  2. Konfiguration und Ausführung des Agenten

  3. [Optional] Konfigurieren Sie die Orchestrierung mit Kubernetes

  4. Überwachen des Agenten

Prüfen Sie die Voraussetzungen, und wählen Sie ein Orchestrierungssystem aus

Überprüfen und vervollständigen Sie alle Voraussetzungen, und fahren Sie mit fort. Konfigurieren Sie den Agenten, und führen Sie ihn aus.

Wählen Sie ein Container-Orchestrierungssystem

Der Agent ist als standardmäßiges Docker Container-Image gepackt und kann auf jedem Orchestrierungssystem ausgeführt werden, das diesen Standard unterstützt. Dabei kann es sich um eine eigenständige Docker Instanz, Kubernetes, RedHat OpenShift, eine in der Cloud verwaltete Lösung, wie AWS Fargate, und andere handeln. Ihr Unternehmen hat oft ein bevorzugtes, bereits vorhandenes System, das Sie verwenden können.

Achten Sie auf den Abschnitt zur Konfiguration der Agenten in diesem Dokument, denn verschiedene Orchestrierungssysteme bringen unterschiedliche Einschränkungen mit sich. Ihr System oder Ihre spezielle Konfiguration erlaubt es Ihnen möglicherweise nicht, beschreibbare Volumes einzubinden (wie es die primäre Konfigurationsoption des Agenten verlangt).

Spätere Beispiele werden sich auf Kubernetes als das beliebteste Orchestrierungssystem konzentrieren. Die Vorgehensweise wird in anderen Systemen oft ähnlich sein, und Sie müssen die Beispiele für Ihr System anpassen.

Bestätigen Sie die erforderlichen Ressourcen des Systems

  • Der Agent ist eine speicherintensive Anwendung und benötigt ein Minimum an 6GB von RAM, um korrekt zu funktionieren.

  • Die optimale Anzahl von CPUs ist 4. Weniger CPUs kann die Leistung verringern. Mehr CPUs wird die Leistung nicht verbessern.

Einrichten der Konnektivität

Der Agent muss eine Verbindung zu jeder Quelldatenbank herstellen, aus der Sie Daten lesen möchten. Konfigurieren Sie Ihr Netzwerk und Ihre Firewalls so, dass direkte Verbindungen möglich sind und der klassische Client-Port von MySQL erreichbar ist. Normalerweise ist das der Port 3306. Weitere Informationen finden Sie unter MySQL-Port-Referenztabellen.

Wenn sich Ihre Quelldatenbanken in isolierten Netzwerken befinden und eine Verbindung von einem einzigen Agenten aus nicht möglich ist, müssen Sie zusätzliche Instanzen der nativen Anwendung des Konnektors installieren, jede mit ihrem eigenen Agenten. Dieses Feature befindet sich derzeit in der privaten Vorschau. Bitte wenden Sie sich an den Snowflake-Support, um den Zugang anzufordern.

Der Agent stellt auch eine direkte Verbindung zu Ihrer Snowflake-Bereitstellung her. Informationen darüber, welche Hostnamen verfügbar sein müssen, finden Sie unter Zulassen von Hostnamen.

Wenn eine der Verbindungen des Agenten über einen Proxy läuft, müssen Sie zusätzliche Konfigurationen an den Agenten weitergeben. Siehe Überprüfung der optionalen Variablen für die Konfiguration der Umgebung.

Konfiguration und Ausführung des Agenten

Die Konfiguration und Ausführung des Agenten besteht aus den folgenden Schritten:

  1. Laden Sie den MariaDB JDBC-Treiber herunter

  2. [Optional] Beziehen Sie SSL-Zertifikate für Quelldatenbanken, und bereiten Sie diese vor

  3. Vorbereiten der Konfigurations-Dateien des Agenten oder Umgebungsvariablen für den Agenten und Starten des Agenten

  4. Überprüfung der optionalen Variablen für die Konfiguration der Umgebung

  5. Einstellung der PrivateLink-Konnektivität wo gefordert

Laden Sie den MariaDB JDBC-Treiber herunter

Der Agent verwendet diesen Treiber, um eine Verbindung zu MySQL-Datenbanken herzustellen und mit diesen zu interagieren. Obwohl es nominell ein Treiber für MariaDB ist, sind sie kompatibel.

Aufgrund lizenzrechtlicher Beschränkungen kann der JDBC-Treiber nicht zusammen mit dem Agenten vertrieben werden, sondern muss von Ihnen bereitgestellt werden. Laden Sie den MariaDB JDBC Connector 3.4.1 herunter, und speichern Sie ihn in einem Verzeichnis, von dem aus Sie ihn in den Container des Agenten einbinden können.

[Optional] Beziehen Sie SSL-Zertifikate für Quelldatenbanken, und bereiten Sie diese vor

Wenn der Agent über SSL eine Verbindung zu Quelldatenbanken herstellt, benötigt er deren Zertifikate, um die Verbindungen zu validieren. Diese Zertifikate müssen im Java Truststore innerhalb des Containers des Agenten verfügbar sein, und zwar unter dem Pfad /opt/java/openjdk/lib/security/cacerts.

Der einfachste Weg, den Agenten mit Zertifikaten zu versorgen, besteht darin, sie der bestehenden Datei cacerts des Hostrechners hinzuzufügen und diese Datei dann in den laufenden Container einzubinden.

openssl x509 -outform der -in ca-root.pem -out ca-root.der
keytool -import -alias server-root \
    -keystore $JAVA_HOME/jre/lib/security/cacerrts -file ca-root.der
Copy

Konfiguration des Agenten vorbereiten

Der Agent kann über in den Container eingebundene JSON-Dateien oder über Umgebungsvariablen oder eine Mischung aus beidem konfiguriert werden. Die für die Verbindung mit Snowflake erforderlichen Schlüssel können vom Dateisystem des Hosts eingebunden, als Container-Geheimnisse oder als Umgebungsvariablen bereitgestellt werden.

In den folgenden Abschnitten werden verschiedene Konfigurationsmöglichkeiten beschrieben, von den einfachsten bis hin zu den umfassendsten. Wählen Sie einen Ansatz, der auf die Besonderheiten Ihrer Infrastruktur abgestimmt ist.

Die einfachste Art, den Agenten zu konfigurieren, besteht darin, zwei JSON-Dateien zur Laufzeit in den Container einzubinden:

  • snowflake.json enthält die Konfiguration für den Agenten zur Verbindung mit Ihrem Snowflake-Konto.

    Laden Sie diese Datei am Ende des Einrichtungsprozesses des Konnektors über den Assistenten in Snowsight herunter.

  • datasources.json enthält die Liste der Quelldatenbanken, mit denen sich der Agent verbinden kann.

    Sie müssen diese Datei selbst vorbereiten.

Direkt nach dem Herunterladen enthält snowflake.json einen temporären privaten Schlüssel für das Snowflake-Dienstkonto, das den Agenten repräsentiert. Wenn Sie den Agenten zum ersten Mal starten, ersetzt der Agent diesen temporären Schlüssel automatisch durch einen neuen, permanenten Satz von Schlüsseln und gibt diese in den Pfad /home/agent/.ssh/ innerhalb des Containers aus. Sowohl snowflake.json als auch der Pfad unter /home/agent/.ssh/ müssen als beschreibbar eingebunden sein, damit der Agent starten kann.

Alternativ können Sie auch Ihren eigenen privaten Schlüssel für das Dienstkonto des Agenten bereitstellen. Siehe Überprüfung der optionalen Variablen für die Konfiguration der Umgebung für die zu übergebenden Umgebungsvariablen.

Vorsicht

Wenn der Agent einen vorhandenen privaten Schlüssel findet, entweder als eingebundene Datei oder als Umgebungsvariable, ignoriert er jeden temporären Schlüssel, der möglicherweise noch in snowflake.json vorhanden ist.

Bereiten Sie die datasources.json-Datei mithilfe der folgenden Vorlage vor:

{
    "<data_source_name_1>": {
        "url": "jdbc:mariadb://<host>:<port>/[?<key1>=<value1>[&<key2>=<value2>]]",
        "username": "<mysql_db_username>",
        "password": "<mysql_db_password>"
    },
    "<data_source_name_2>": {
        "url": "jdbc:mariadb://<host>:<port>/[?<key1>=<value1>[&<key2>=<value2>]]",
        "username": "<mysql_db_username>",
        "password": "<mysql_db_password>"
    }
}
Copy

Beim Erstellen der Datei:

  • Sie müssen mindestens eine Datenquelle mit einer URL hinzufügen, sonst wird der Agent nicht gestartet.

  • Sie können so viele Datenquellen hinzufügen, wie Sie benötigen, solange der Agent eine direkte Verbindung zu all diesen Quellen herstellen kann.

  • Die von Ihnen eingegebenen Namen werden zu den Bezeichnern, die Sie später benötigen, um die Native App des Konnektors aufzurufen und die Replikation zu aktivieren. Sie müssen für jede Datenquelle eindeutig sein.

  • Die Namen von Datenquellen dürfen nur Buchstaben und Zahlen enthalten. Alle Kleinbuchstaben werden vom Agenten automatisch in Großbuchstaben geschrieben.

Sobald Sie beide JSON-Dateien, die JAR-Datei mit den JDBC-Treibern und ein Verzeichnis für die Ausgabe des neuen Schlüsselsatzes haben, können Sie den Container starten:

docker run -d \
   --restart unless-stopped \
   --name database-connector-agent \
   --volume </path/to/ssh/keys/directory>:/home/agent/.ssh \
   --volume </path/to/mariadb/jdbc/jar>:/home/agent/libs/mariadb-jdbc-driver \
   --volume </path/to/snowflake/json/file>:/home/agent/snowflake.json \
   --volume </path/to/datasources/json/file>:/home/agent/datasources.json \
   -m 6g \
   snowflakedb/database-connector-agent:latest
Copy

Überprüfung der optionalen Variablen für die Konfiguration der Umgebung

Der Agent unterstützt die folgenden, optionalen Einstellungen, die durch die Einstellung zusätzlicher Umgebungsvariablen auf dem Container verfügbar sind:

SNOWFLAKE_PRIVATEKEYPATH

Gibt den absoluten Pfad zu der Datei mit dem privaten Schlüssel des Benutzers des Agenten an. Dies wird verwendet, wenn Sie Ihren eigenen privaten Schlüssel in den Container einbinden, normalerweise über das Geheimnis eines Orchestrierungssystems.

SNOWFLAKE_PRIVATEKEYPASSWORD

Gibt das Kennwort für den privaten Schlüssel des Benutzers des Agenten an. Wenn Sie den Agenten die Schlüssel generieren lassen, wird dieses Kennwort auf den privaten Schlüssel gesetzt. Wenn Sie vorhandene Schlüssel wiederverwenden, wird dieses Kennwort für den Zugriff auf den vorhandenen privaten Schlüssel verwendet.

SNOWFLAKE_PRIVATEKEY

Gibt den Inhalt des privaten Schlüssels des Benutzers des Agenten an. Dies kann eingestellt werden, wenn das Einbinden des privaten Schlüssels als Datei im Container keine Option ist.

SNOWFLAKE_ENFORCEDURL

Gibt die URL an, um eine Verbindung zu Snowflake herzustellen, wobei der eigene Erkennungsmechanismus des Agenten außer Kraft gesetzt wird. Dies wird hauptsächlich zur Verbindung mit PrivateLink verwendet.

JAVA_OPTS

Gibt zusätzliche Java-Einstellungen oder Eigenschaften an, die an den Prozess des Agenten weitergegeben werden.

Die am häufigsten verwendeten sind:

  • Die Option -Xmx, um die maximale Java-Heap-Größe einzustellen. Snowflake empfiehlt, diesen Wert auf den dem Container zur Verfügung stehenden Speicher einzustellen, abzüglich 1GB.

    Wenn der Container beispielsweise über 6GB von RAM verfügt, stellen Sie Folgendes ein:

    JAVA_OPTS=-Xmx5g
    
    Copy
  • Wenn die Verbindung vom Agenten zu Snowflake einen Proxy erfordert, stellen Sie Folgendes ein:

    JAVA_OPTS=-Dhttp.useProxy=true -Dhttp.proxyHost=<proxy-host> -Dhttp.proxyPort=<proxy-port>
    
    Copy
  • Um den Proxy für einige Hosts oder IP-Adressen zu umgehen, zum Beispiel für Quelldatenbanken, stellen Sie die zusätzliche Eigenschaft http.nonProxyHosts ein. Verwenden Sie ein Pipe-Symbol (|), um mehrere Hostnamen zu trennen. Verwenden Sie ein Sternchen (*) als Platzhalterzeichen.

    JAVA_OPTS=-Dhttp.useProxy=true -Dhttp.proxyHost=<proxy-host> -Dhttp.proxyPort=<proxy-port>
      -Dhttp.nonProxyHosts='*.my_company.com|localhost|myorganization-myaccount.snowflakecomputing.com|192.168.91.*'
    
    Copy
  • Um Anmeldeinformationen für den Proxy zu übergeben, stellen Sie die Systemeigenschaften http.proxyUser und http.proxyPassword ein.

    JAVA_OPTS=-Dhttp.useProxy=true -Dhttp.proxyHost=<proxy-host> -Dhttp.proxyPort=<proxy-port>
      -Dhttp.proxyUser=<proxy-user> -Dhttp.proxyPassword=<proxy-pass>
    
    Copy

Snowflake-Zugriffsschlüssel verstehen

Der Agent authentifiziert sich bei Snowflake als ein Dienstkonto, das durch den Einrichtungsassistenten des Konnektors in Snowsight erstellt wurde, unter Verwendung einer Reihe von Zugangsschlüsseln. Der Assistent erstellt temporäre Zugangsschlüssel und fügt den privaten Schlüssel in die Datei snowflake.json in einem Feld namens temporaryPrivateKey ein.

Während des ersten Starts ersetzt der Agent diese temporären Schlüssel durch:

  1. Erzeugen eines neuen Satzes von Zugriffsschlüsseln und Speichern dieser Schlüssel unter /home/agent/.ssh als database-connector-agent-app-private-key.p8 und database-connector-agent-app-public-key.pub innerhalb des Containers. Dieses Verzeichnis sollte als externes, beschreibbares Volume in den Container eingebunden werden, damit die Schlüssel erhalten bleiben, wenn der Container heruntergefahren wird.

  2. Änderung des Dienstkontos zur Verwendung der neuen Schlüssel.

  3. Entfernen Sie das Feld temporaryPrivateKey aus der Datei snowflake.json.

Nach dem ersten Austausch der Schlüssel rotiert der Agent die Schlüssel nicht mehr.

Sie können die vom Agenten erzeugten Schlüssel verwenden. Sie können aber auch ein eigenes Set erstellen, das Dienstkonto ändern und den privaten Schlüssel an den Agenten weitergeben.

Die Reihenfolge bei der Ermittlung des privaten Schlüssels des Agenten ist:

  1. Jeder Schlüssel, der mit der Umgebungsvariablen SNOWFLAKE_PRIVATEKEY übergeben wird. Wenn dieser Wert gefunden wird, ignoriert der Konnektor den temporären Schlüssel von snowflake.json.

  2. Schlüssel, die auf eingebundenen Volumes gefunden wurden, in /home/agent/.ssh/database-connector-agent-app-private-key.p8. Wenn diese Datei gefunden wird, ignoriert der Konnektor den temporären Schlüssel von snowflake.json.

  3. Der Wert des Feldes temporaryPrivateKey aus der Datei snowflake.json.

Konfigurieren Sie die Orchestrierung mit Kubernetes

Bemerkung

Dieser Abschnitt konzentriert sich zwar auf Kubernetes, aber der Konnektor kann in jedem System zur Container-Orchestrierung gestartet werden. Die Syntaxen für die Konfiguration sind oft ähnlich. Einzelheiten finden Sie in der Dokumentation zu Ihrem System.

Bei der Verwendung von Kubernetes ist das Einbinden von beschreibbaren Volumes normalerweise keine Option. Infolgedessen ist der Agent nicht in der Lage, die Schlüssel für sein Snowflake-Konto automatisch zu ersetzen. Sie müssen eine Reihe von Schlüsseln manuell erstellen, den Benutzer ändern und dann den privaten Schlüssel dem Container, auf dem der Agent läuft, zur Verfügung stellen, in der Regel als eingebundenes Geheimnis. Einzelheiten zur Einstellung von Schlüsselpaaren für Snowflake-Benutzer finden Sie unter Konfigurieren der Schlüsselpaar-Authentifizierung.

Wir empfehlen, dass Sie die Geheimnisse in einem sicheren Speicher wie HashiCorp Vault aufbewahren. Diese Speicher verfügen in der Regel über bestehende Integrationen mit Kubernetes, zum Beispiel bietet Vault einen speziellen Operator. Die Details der Integration sind spezifisch für Ihr System zur Orchestrierung von Containern und Ihren sicheren Speicher. Einzelheiten finden Sie in der jeweiligen Dokumentation.

Kubernetes wird normalerweise in Clustern mit mehreren Knoten ausgeführt, ohne die Möglichkeit, Dateien von den Host-Rechnern aus einzubinden. Um den Container des Agenten mit den Konfigurationsdateien von JSON zu versorgen, können Sie eine Kubernetes ConfigMap erstellen, die alle drei Dateien speichert.

Im Folgenden sehen Sie ein grundlegendes Beispiel für die Konfiguration des Agenten in Kubernetes.

  1. Erstellen Sie eine ConfigMap, in der Sie den JDBC-Treiber und snowflake.json speichern:

    kubectl create configmap database-connector-config \
      --from-file=jdbc-driver.jar=</path/to/mariadb/jdbc/jar> \
      --from-file=snowflake.json=</path/to/snowflake/json/file>
    
    Copy

    Tipp

    Der Treiber JDBC JAR ist zum Zeitpunkt der Erstellung dieses Dokuments etwa 650KB groß und liegt damit weit unter der von Kubernetes vorgegebenen ConfigMap-Beschränkung von 1MB. Wenn Sie es vorziehen, nicht so viele Daten in eine ConfigMap zu packen, besteht ein gängiges Muster darin, ein benutzerdefiniertes Docker-Image zu erstellen, das auf dem offiziellen Image des Agenten basiert und um die JDBC JAR ergänzt wird.

  2. Erstellen Sie ein Geheimnis, in dem der Inhalt des privaten Schlüssels des Benutzers des Agenten gespeichert wird, und datasources.json:

    kubectl create secret generic database-connector-secrets \
      --from-file=private-key=</path/to/private/key/file> \
      --from-file=datasources.json=</path/to/datasources.json>
    
    Copy
  3. Konfigurieren Sie den Pod des Agenten, indem Sie die Konfigurationsdateien und den privaten Schlüssel als Volumes einbinden:

    apiVersion: v1
    kind: Pod
    metadata:
      name: database-connector-agent
    spec:
      restartPolicy: Always
      containers:
        - name: database-connector-agent
          image: snowflakedb/database-connector-agent:latest
          resources:
            requests:
              memory: "6Gi"
            limits:
              memory: "8Gi"
          volumeMounts:
            - name: config
              mountPath: /home/agent/libs/jdbc-driver.jar
              subPath: jdbc-driver.jar
            - name: config
              mountPath: /home/agent/snowflake.json
              subPath: snowflake.json
            - name: secrets
              mountPath: /home/agent/datasources.json
              subPath: datasources.json
            - name: secrets
              mountPath: /etc/private-key/private-key
              subPath: private-key
          env:
            - name: MYSQL_DATASOURCE_DRIVERPATH
              value: /home/agent/libs/jdbc-driver.jar
            - name: SNOWFLAKE_PRIVATEKEYPATH
              value: /etc/private-key/private-key
      volumes:
        - name: config
          configMap:
            name: database-connector-config
        - name: secrets
          secret:
           secretName: database-connector-secrets
    
    Copy
  4. Speichern Sie die Konfiguration des Pods als YAML-Datei, z. B. database-connector.yaml, und starten Sie:

    kubectl apply -f database-connector.yaml
    
    Copy

Überwachen des Agenten

Der Container des Agenten gibt die Protokolle an stdout aus, auf die Sie mit Docker zugreifen können. Wenn der Name Ihres Containers zum Beispiel database-connector-agent lautet, lautet der Befehl zum Anzeigen der Protokolle:

docker container logs database-connector-agent
Copy

Diese Protokolle werden auch an Snowflake weitergeleitet. Unter Überwachen des Snowflake Connector for MySQL finden Sie Informationen darüber, wie Sie auf diese zugreifen können.

Zugriff auf den Endpunkt für den Healthcheck

Der Agent stellt einen HTTP-Endpunkt mit Informationen zur Data Health zur Verfügung. Sie können diesen Endpunkt verwenden, wenn Sie den Agenten in einem Orchestrierungssystem ausführen, um festzustellen, wann der Agent vollständig gestartet wurde und ob er funktionsfähig ist. Der Endpunkt ist unter Port 8080 und Pfad /actuator/health verfügbar.

Um den Endpunkt als Liveness-Probe in Kubernetes zu verwenden, fügen Sie Ihrer Pod-Konfiguration Folgendes hinzu:

apiVersion: v1
kind: Pod
spec:
  containers:
  - ...
    livenessProbe:
      httpGet:
        path: /actuator/health
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
Copy

Nächste Schritte

Führen Sie nach Beendigung dieser Prozeduren die unter Konfigurieren der Replikation für Snowflake Connector for MySQL beschriebenen Schritte aus.