Konfiguration für zusammengesetzten Index

Firestore im Datastore-Modus nutzt Indexe für jede Abfrage, die von Ihrer Anwendung durchgeführt wird. Diese Indexe werden aktualisiert, sobald sich eine Entität ändert. So können Ergebnisse schnell zurückgegeben werden, wenn die Anwendung eine Abfrage ausführt. Im Datastore-Modus werden integrierte Indexe automatisch erstellt, vorab werden jedoch Informationen über die für die Anwendung notwendigen zusammengesetzten Indexe benötigt. In einer Konfigurationsdatei legen Sie fest, welche zusammengesetzten Indexe Ihre Anwendung braucht. Der Datenspeicher-Emulator kann die Konfiguration eines zusammengesetzten Index im Datastore-Modus automatisch generieren, wenn Sie Ihre Anwendung testen. Das gcloud-Befehlszeilentool enthält Befehle zum Aktualisieren der Indexe, die für Ihre Produktionsdatenbank im Datastore-Modus verfügbar sind.

Systemanforderungen

Wenn Sie die gcloud CLI verwenden möchten, müssen Sie die Google Cloud CLI installiert haben.

Über index.yaml

Jede Abfrage im Datastore-Modus, die von einer Anwendung durchgeführt wird, erfordert einen entsprechenden Index. Indexe für einfache Abfragen, zum Beispiel Abfragen zu einzelnen Attributen, werden automatisch erstellt. Zusammengesetzte Indexe für komplexe Abfragen müssen in einer Konfigurationsdatei mit dem Namen index.yaml definiert werden. Diese Datei wird mit der Anwendung hochgeladen, um zusammengesetzte Indexe in einer Datenbank im Datastore-Modus zu erstellen.

Der Datastore-Emulator fügt dieser Datei automatisch Elemente hinzu, wenn die Anwendung versucht, eine Abfrage auszuführen, für die ein zusammengesetzter Index erforderlich ist, für den in der Konfigurationsdatei kein entsprechender Eintrag vorhanden ist. Sie können zusammengesetzte Indexe anpassen oder manuell neue erstellen, indem Sie die Datei bearbeiten. Die Datei index.yaml befindet sich im Ordner <project-directory>/WEB-INF/. Standardmäßig befindet sich die Datei WEB-INF/appengine-generated/index.yaml im Datenverzeichnis ~/.config/gcloud/emulators/datastore/. Weitere Informationen finden Sie unter Projektverzeichnisse des Datastore-Emulators.

Im Folgenden finden Sie ein Beispiel für eine index.yaml-Datei:

indexes:

- kind: Task
  ancestor: no
  properties:
  - name: done
  - name: priority
    direction: desc

- kind: Task
  properties:
  - name: collaborators
    direction: asc
  - name: created
    direction: desc

- kind: TaskList
  ancestor: yes
  properties:
  - name: percent_complete
    direction: asc
  - name: type
    direction: asc

Die Syntax von index.yaml ist das YAML-Format. Weitere Informationen zu dieser Syntax finden Sie auf der YAML-Website.

Definitionen für zusammengesetzte Indexe

index.yaml verfügt über ein einziges Listenelement mit dem Namen indexes. Jedes Element in der Liste stellt einen zusammengesetzten Index für die Anwendung dar.

Ein Indexelement kann folgende Elemente enthalten:

kind
Die Art der Entität für die Abfrage. Dieses Element ist ein Pflichtelement.
properties

Eine Liste der Attribute, die als Spalten des zusammengesetzten Index in der gewünschten Reihenfolge aufgenommen werden sollen: zuerst Attribute in Gleichheitsfiltern, dann Eigenschaften in Ungleichheitsfiltern und dann die Sortierreihenfolgen und Richtungen.

Jedes Element in dieser Liste weist folgende Elemente auf:

name
Der Name des Attributs im Datastore-Modus.
direction
Die Sortierreihenfolge, entweder asc für aufsteigend oder desc für absteigend. Diese muss nur für Attribute angegeben werden, die in der Sortierfolge der Anfrage verwendet werden, und muss mit der von der Anfrage verwendeten Richtung übereinstimmen. Der Standardwert ist asc.
ancestor

yes, wenn die Abfrage eine Ancestor-Klausel hat. Der Standardwert ist no.

Automatische und manuelle zusammengesetzte Indexe

Wenn der Datastore-Emulator eine generierte zusammengesetzte Indexdefinition zu index.yaml hinzufügt, erfolgt dies nach der folgenden Zeile. Falls nötig, wird sie eingefügt:

# AUTOGENERATED

Der Emulator betrachtet alle Definitionen für zusammengesetzte Indexe unterhalb dieser Zeile als automatisch und kann vorhandene Definitionen unterhalb dieser Zeile aktualisieren, wenn die Anwendung Abfragen ausführt.

Alle Definitionen für zusammengesetzte Indexe oberhalb dieser Zeile werden als manuell gesteuert und nicht vom Emulator aktualisiert. Der Emulator nimmt Änderungen nur unterhalb der Zeile vor, und zwar nur dann, wenn in der Datei index.yaml kein zusammengesetzter Index für eine von der Anwendung ausgeführte Abfrage beschrieben wird. Wenn Sie die Kontrolle über eine automatische Definition für einen zusammengesetzten Index übernehmen möchten, verschieben Sie sie an eine Stelle oberhalb dieser Zeile.

Zusammengesetzte Indexe aktualisieren

Der Befehl datastore indexes create prüft die Konfiguration Ihres lokalen zusammengesetzten Datastore-Indexes (die Datei index.yaml). Wenn in der Konfiguration eines zusammengesetzten Index ein zusammengesetzter Index definiert ist, der in Ihrer Produktionsdatenbank im Datastore-Modus noch nicht vorhanden ist, erstellt die Datenbank den neuen zusammengesetzten Index. Ein Beispiel für die Verwendung von indexes create finden Sie im Entwicklungsworkflow mit der gcloud CLI.

Zum Erstellen eines zusammengesetzten Index muss die Datenbank den zusammengesetzten Index einrichten und ihn dann mit vorhandenen Daten füllen. Die Erstellungszeit eines zusammengesetzten Index ist die Summe aus Einrichtungszeit und Backfill-Zeit:

  • Das Einrichten eines zusammengesetzten Index dauert einige Minuten. Die Mindesterstellungszeit für einen zusammengesetzten Index beträgt auch bei einer leeren Datenbank einige Minuten.

  • Die Backfill-Zeit hängt davon ab, wie viele vorhandene Daten in den neuen zusammengesetzten Index gehören. Je mehr Attributwerte zu einem zusammengesetzten Index gehören, desto länger dauert das Backfill des zusammengesetzten Index.

Wenn die Anwendung eine Abfrage ausführt, für die ein zusammengesetzter Index erforderlich ist, der noch nicht fertig erstellt wurde, löst die Abfrage eine Ausnahme aus. Um dies zu verhindern, müssen Sie vorsichtig bei der Bereitstellung einer neuen Version Ihrer Anwendung sein, die einen zusammengesetzten Index erfordert, bevor der neue zusammengesetzte Index fertig erstellt ist.

Sie können den Status der zusammengesetzten Indexe in der Google Cloud Console auf der Seite Indexe prüfen.

Nicht verwendete zusammengesetzte Indexe löschen

Wenn Sie einen zusammengesetzten Index in der Konfiguration des zusammengesetzten Index ändern oder entfernen, wird er nicht automatisch aus der Datenbank im Datastore-Modus gelöscht. So haben Sie die Möglichkeit, eine ältere Version der Anwendung weiter auszuführen, während neue zusammengesetzte Indexe erstellt werden, oder sofort zur älteren Version zurückzukehren, wenn mit einer neueren Version ein Problem festgestellt wird.

Wenn Sie sich sicher sind, dass Sie die alten zusammengesetzten Indexe nicht mehr benötigen, können Sie sie mit dem Befehl datastore indexes cleanup löschen. Mit diesem Befehl werden alle zusammengesetzten Indexe für die Produktionsinstanz im Datastore-Modus gelöscht, die in der lokalen Version von index.yaml nicht mehr aufgeführt sind. Ein Beispiel für die Verwendung von indexes cleanup finden Sie im Entwicklungsworkflow mit der gcloud CLI.

Befehlszeilenargumente

Ausführliche Informationen zu Befehlszeilenargumenten zum Erstellen und Bereinigen von zusammengesetzten Indexen finden Sie unter datastore indexes create bzw. datastore indexes cleanup. Weitere Informationen zu Befehlszeilenargumenten für die gcloud CLI finden Sie in der Referenz zur gcloud CLI.

Umgang mit lang andauernden Vorgängen

Erstellen von zusammengesetzten Indexen sind Vorgänge mit langer Ausführungszeit, die viel Zeit in Anspruch nehmen können.

Nachdem Sie einen Build für einen zusammengesetzten Index gestartet haben, wird dem Vorgang im Datastore-Modus ein eindeutiger Name zugewiesen. Vorgangsnamen haben das Präfix projects/[PROJECT_ID]/databases/(default)/operations/, zum Beispiel:

projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

Wenn Sie für den Befehl describe einen Vorgangsnamen angeben, können Sie das Präfix weglassen.

Lang andauernde Vorgänge auflisten

Verwenden Sie zum Auflisten von Vorgängen mit langer Ausführungszeit den Befehl gcloud datastore operations list: Dieser Befehl listet laufende und kürzlich abgeschlossene Vorgänge auf. Die Vorgänge sind nach Abschluss einige Tage lang in der Liste enthalten:

gcloud

gcloud datastore operations list

rest

Bevor Sie die Anfragedaten verwenden, ersetzen Sie die folgenden Werte:

  • project-id: Ihre Projekt-ID.

HTTP-Methode und URL:

GET https://datastore.googleapis.com/v1/projects/project-id/operations

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Weitere Informationen zur Antwort finden Sie weiter unten.

Ein kürzlich abgeschlossener zusammengesetzter Index-Build enthält beispielsweise die folgenden Informationen:

{
  "operations": [
  {
    "name": "projects/project-id/operations/S01vcFVpSmdBQ0lDDCoDIGRiNTdiZDQNmE4YS0yMTVmNWUzZSQadGx1YWZlZAcSMXRzYWVzdS1yZXhlZG5pLW5pbWRhFQpWEg",
    "done": true,
    "metadata": {
      "@type": "type.googleapis.com/google.datastore.admin.v1.IndexOperationMetadata",
      "common": {
        "endTime": "2020-06-23T16:55:29.923562Z",
        "operationType": "CREATE_INDEX",
        "startTime": "2020-06-23T16:55:10Z",
        "state": "SUCCESSFUL"
      },
      "indexId": "CICAJiUpoMK",
      "progressEntities": {
        "workCompleted": "2193027",
        "workEstimated": "2198182"
      }
    },
    "response": {
      "@type": "type.googleapis.com/google.datastore.admin.v1.Index",
      "ancestor": "NONE",
      "indexId": "CICAJiUpoMK",
      "kind": "Task",
      "projectId": "project-id",
           "properties": [
        {
          "direction": "ASCENDING",
          "name": "priority"
        },
        {
          "direction": "ASCENDING",
          "name": "done"
        },
        {
          "direction": "DESCENDING",
          "name": "created"
        }
      ],
      "state": "READY"
    }
  },
  ]
}

Einzelnen Vorgang beschreiben

Anstelle aller Vorgänge mit langer Ausführungszeit können Sie auch die Details eines einzelnen Vorgangs auflisten:

gcloud

Verwenden Sie den Befehl operations describe, um den Status eines zusammengesetzten Index-Builds anzuzeigen.

gcloud datastore operations describe operation-name

rest

Bevor Sie die Anfragedaten verwenden, ersetzen Sie die folgenden Werte:

  • project-id: Ihre Projekt-ID.

HTTP-Methode und URL:

GET https://datastore.googleapis.com/v1/projects/project-id/operations

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Weitere Informationen zur Antwort finden Sie weiter unten.

Fertigstellungszeit schätzen

Während der Ausführung eines Vorgangs wird im Feld state der Gesamtstatus des Vorgangs angezeigt.

Eine Anfrage für den Status eines Vorgangs mit langer Ausführungszeit gibt auch die Messwerte workEstimated und workCompleted zurück. Diese Messwerte werden für die Anzahl der Entitäten zurückgegeben. workEstimated gibt die geschätzte Gesamtanzahl der Entitäten an, die ein Vorgang verarbeitet. Die Schätzungen beruhen auf Datenbankstatistiken. workCompleted gibt die Anzahl der bis jetzt verarbeiteten Entitäten an. Nach Abschluss des Vorgangs gibt workCompleted die Gesamtzahl der tatsächlich verarbeiteten Entitäten wieder. Dieser kann vom Wert von workEstimated abweichen.

Teilen Sie workCompleted durch workEstimated, um eine grobe Schätzung des Fortschritts zu erhalten. Die Schätzung ist möglicherweise ungenau, da sie von der verzögerten Statistikerfassung abhängt.

Hier ist beispielsweise der Fortschrittsstatus eines zusammengesetzten Index-Builds:

{
  "operations": [
    {
      "name": "projects/project-id/operations/AyAyMDBiM2U5NTgwZDAtZGIyYi0zYjc0LTIzYWEtZjg1ZGdWFmZWQHEjF0c2Flc3UtcmV4ZWRuaS1uaW1kYRUKSBI",
      "metadata": {
        "@type": "type.googleapis.com/google.datastore.admin.v1.IndexOperationMetadata",
        "common": {
          "operationType": "CREATE_INDEX",
          "startTime": "2020-06-23T16:52:25.697539Z",
          "state": "PROCESSING"
        },
        "progressEntities": {
          "workCompleted": "219327",
          "workEstimated": "2198182"
        }
       },
    },
    ...

Wenn ein Vorgang abgeschlossen ist, enthält die Vorgangsbeschreibung "done": true. Der Wert des Feldes state stellt das Ergebnis des Vorgangs dar. Wenn das Feld done nicht in der Antwort festgelegt ist, lautet der Wert false. Verlassen Sie sich bei laufenden Vorgängen nicht auf die Existenz des Werts done.