Tasks verwalten
Das Erstellen neuer Indizes aus vielen Daten bzw. das Replizieren einer umfangreichen Datenbank kann ziemlich lange dauern.
Wie können Sie feststellen, ob Ihre Tasks Fortschritte machen oder abgeschlossen sind? Der Endpunkt _active_tasks liefert Informationen zu allen aktiven Tasks.
Wenn Sie jedoch viele Tasks starten, sind manche möglicherweise für eine spätere Ausführung geplant und werden erst unter _active_tasks angezeigt, wenn sie tatsächlich gestartet werden.
Siehe die folgenden Beispiele für SDK- und Curl-Code:
curl "$SERVICE_URL/_active_tasks"
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.ActiveTask;
Cloudant service = Cloudant.newInstance();
List<ActiveTask> response =
service.getActiveTasks().execute().getResult();
System.out.println(response);
const { CloudantV1 } = require('@ibm-cloud/cloudant');
const service = CloudantV1.newInstance({});
service.getActiveTasks().then(response => {
console.log(response.result);
});
from ibmcloudant.cloudant_v1 import CloudantV1
service = CloudantV1.new_instance()
response = service.get_active_tasks().get_result()
print(response)
getActiveTasksOptions := service.NewGetActiveTasksOptions()
activeTask, response, err := service.GetActiveTasks(getActiveTasksOptions)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(activeTask, "", " ")
fmt.Println(string(b))
Das vorherige Go-Beispiel erfordert den folgenden Importblock:
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
Für alle Go-Beispiele muss das Objekt service initialisiert sein. Weitere Informationen finden Sie in den Beispielen im Abschnitt 'Authentifizierung' in der API-Dokumentation.
Als nächstes erfahren Sie, wie Sie mit dem Endpunkt _active_tasks Tasks mit langer Laufzeit überwachen können. Der Befehl curl wird verwendet, um auf den Endpunkt zuzugreifen. Der JSON-Prozessor der Befehlszeile jq wird verwendet, um die JSON-Antwort zu verarbeiten.
Dieses taskorientierte Lernprogramm deckt nur die Bereiche ab, die zum Ausführen der Task relevant sind. Ausführliche Informationen zu den verfügbaren Optionen finden Sie im Leitfaden IBM® Cloudant® for IBM Cloud® verwenden.
Grundlegende Informationen zu curl und jq
Um alle aktiven Tasks abzurufen und die Ausgabe ansprechend zu formatieren, rufen Sie Ihr Konto mithilfe von curl auf und leiten Sie die Ausgabe per Pipe an jq weiter.
Mit jq können Sie eine Liste von Dokumenten nach ihren Feldwerten filtern. Dieser Filter vereinfacht das Abrufen aller Replikationsdokumente oder der Details einer bestimmten Ansichtsindexierungstask. Die API-Referenz enthält weitere
Informationen zu diesen Optionen.
Beispiel zum Abrufen und Formatieren einer Liste der aktiven Tasks:
curl "$SERVICE_URL/_active_tasks" | jq
Überwachung von Ansichts-Builds und Suchindizes
Ansichtsindizes werden neu erstellt, wenn ein Entwurfsdokument aktualisiert wird. Eine Aktualisierung einer Ansicht löst die Neuerstellung aller Ansichten in dem Dokument aus.
Suchindizes werden nur dann neu erstellt, wenn die zugehörige Indexfunktion geändert wird. Für jeden erstellten Suchindex und für jedes Entwurfsdokument mit Ansichten, die geändert werden, wird für jedes Replikat und jedes Shard in einem Cluster eine neue Task erstellt.
Wenn beispielsweise 24 Shards mit je drei Replikaten vorhanden sind und Sie zwei Suchindizes aktualisieren, werden 24 x 3 x 2 = 144 Tasks ausgeführt.
Um alle Ansichtsindexierungstasks zu finden, leiten Sie die curl-Ausgabe über eine Pipe an jq weiter und filtern die Dokumente im Array nach ihrem Typ. Ein entsprechender Befehl kann für die Suchindexierungstasks ausgeführt
werden.
In beiden Fällen ist das Ergebnis der Suche nach einer Liste von Indexierungstasks eine Liste von JSON-Objekten: eines für jede gefundene aktive Task.
Beispiel für das Suchen aller Anzeigeindexierungstasks durch Filtern nach dem Typ indexer:
curl -s "$SERVICE_URL/_active_tasks" | jq '.[] | select(.type=="indexer")'
Beispiel für das Suchen aller Suchindexierungstasks durch Filtern nach dem Typ search_indexer:
curl -s "$SERVICE_URL/_active_tasks" | jq '.[] | select(.type=="search_indexer")'
Beispielergebnisse für die Suche nach den Anzeigeindexierungstasks:
{
"total_changes": 6435,
"started_on": 1371118332,
"user": "username",
"updated_on": 1371118334,
"type": "indexer",
"node": "dbcore@db6.meritage.cloudant.net",
"pid": "<0.16366.6103>",
"changes_done": 364,
"database": "shards/40000000-7fffffff/username/database",
"design_document": "_design/ngrams"
}
Zeit bis zur Fertigstellung einer Task schätzen
Sie können die Zeit bis zur Fertigstellung der Indexierungstask schätzen, indem Sie die Anzahl von vorgenommenen Änderungen (changes_done) mit der Gesamtzahl von Änderungen (total_changes) vergleichen. Wenn changes_done sich um 250 pro Sekunde erhöht und total_changes 1.000.000 ist, dauert die Task voraussichtlich 1.000.000 / 250 = 4.000 Sekunden, bzw. ca. 66 Minuten.
Schätzungen der Zeit bis zur Fertigstellung einer Task sind nie absolut genau. Die tatsächliche Zeit bis zur Fertigstellung der Task hängt von den folgenden Faktoren ab:
- Die Zeit für die Verarbeitung der einzelnen Dokumente. Zum Beispiel, Eine Ansicht könnte zunächst den Dokumenttyp prüfen, und neue Indexeinträge nur für einen Typ erstellen.
- Die Größe der Dokumente.
- Die aktuelle Auslastung des Clusters.
Sie sollten davon ausgehen, dass diese Faktoren zusammengenommen eine beträchtliche Abweichung von Ihrer Schätzung bedeuten können.
Beispiel für das Extrahieren des Felds changes_done mithilfe von jq:
curl ... | jq '.[] | select(.type=="search_indexer") | .changes_done'
Replikation überwachen
Um alle Replikationstasks zu finden, leiten Sie die curl-Ausgabe über eine Pipe an jq weiter und filtern Sie die Dokumente im Array nach ihrem Typ.
Führen Sie die folgenden Schritte aus, um die Auswahl der Informationen zu einem Replikationsprozess aus der Liste der aktiven Tasks zu vereinfachen:
- Starten Sie den Replikationsprozess, indem Sie ein Dokument in der Datenbank
_replicatorerstellen. - Geben Sie im zugehörigen Feld
_ideinen bekannten Wert an.
Beispiel für das Suchen aller Replikationstasks durch Filtern nach dem Typ replication:
curl -s "$SERVICE_URL/_active_tasks" | jq '.[] | select(.type=="replication")'
Beispiel für das Suchen einer bestimmten Replikationstask durch Filtern nach einer bekannten Dokumentidentität:
curl ... | jq '.[] | select(.doc_id=="ID")'
Beispiel für das Suchen einer bestimmten Replikationstask durch Filtern nach einer bekannten Replikations-ID (replication_id):
curl ... | jq '.[] | select(.replication_id=="ID")'
Beispielergebnis nach der Suche nach einer Replikationstask:
{
"started_on": 1371094220,
"source_seq": "62960-sakdjflksdfjsdlkafjalskdfjlsakfjlasdkjksald",
"source": "",
"revisions_checked": 12,
"continuous": true,
"doc_id": null,
"doc_write_failures": 0,
"docs_read": 12,
"target": "",
"type": "replication",
"updated_on": 1371118477,
"user": "username",
"checkpointed_source_seq": "61764-dskfjalsfjsalkfjssadjfhasdfkjhsdkfhsdkf",
"changes_pending": 1196,
"pid": "<0.9955.4120>",
"node": "dbcore@db7.meritage.cloudant.net",
"docs_written": 12,
"missing_revisions_found": 12,
"replication_id": "asfksdlfkjsadkfjsdalkfjas+continuous+create_target"
}
Fehlerbehebung für blockierte Tasks
Ist eine Task blockiert?
Für eine einmalige, nicht fortlaufende Replikation, bei der die Quellendatenbank während der Replikation nicht drastisch aktualisiert wird, gibt der Wert changes_pending an, wie viele Dokumente noch verarbeitet werden müssen.
Aus diesem Grund ist der Wert changes_pending ein guter Indikator dafür, wann die Replikation voraussichtlich abgeschlossen wird.
Bei einer fortlaufenden Replikation sind Sie eher daran interessiert, wie sich die Anzahl der verarbeiteten Dokumente im Laufe der Zeit ändert und ob der Wert changes_pending zunimmt. Wenn changes_pending zunimmt,
aber revisions_checked für längere Zeit konstant bleibt, ist die Replikation wahrscheinlich blockiert. Wenn beide Werte, changes_pending und revisions_checked zunehmen, können diese Erhöhungen darauf
hinweisen, dass die Replikation nicht mit der Menge von Daten mithalten kann, die der Datenbank hinzugefügt oder darin aktualisiert werden.
Was tun bei einer blockierten Task?
Um eine ins Stocken geratene Replikation zu beheben, müssen Sie möglicherweise den Dienst „ den Replikationsprozess abbrechen “ neu starten und erneut starten.
Wenn dies nicht hilft, wurde die Replikation möglicherweise blockiert, weil der Benutzer, der auf die Quellen- und Zieldatenbanken zugreift, nicht über Schreibberechtigung verfügt.
Die Replikation nutzt Prüfpunkte. Dies bedeutet, dass bereits replizierte und nicht veränderte Inhalte nicht erneut repliziert werden müssen, wenn die Replikation erneut gestartet wird.
Wenn Sie den Replikationsprozess durch Erstellen eines Dokuments in der Datenbank _replicator gestartet haben, können Sie den Status der Replikation auch dort prüfen.