Gestione di attività
La creazione di nuovi indici su grandi quantità di dati o la replica di un database di grandi dimensioni può richiedere molto tempo.
Come si può determinare se le attività sono in corso o completate? o completati? L'
endpoint _active_tasks fornisce informazioni su tutte le attività in corso. Tuttavia, se si avviano numerose attività, alcune di esse potrebbero essere programmate
per essere eseguite in un secondo momento e non comparire sotto _active_tasks finché non iniziano.
Vedere i seguenti esempi di codice SDK e curl:
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))
Il precedente esempio di Go richiede il seguente blocco di importazione:
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
Tutti gli esempi Go richiedono l'iniziazione dell'oggetto service. Per ulteriori informazioni, consultare la sezione Autenticazione della documentazione API per gli esempi.
Ora si apprende come utilizzare l'endpoint _active_tasks per monitorare le attività di lunga durata. Il comando curl viene utilizzato per accedere all'endpoint. Per elaborare la risposta JSON viene utilizzato il processore
JSON da riga di comando jq.
Questo tutorial, incentrato sull'attività, tratta solo gli aspetti essenziali per portare a termine tale attività. Per ulteriori informazioni, consultare la guida completa “Utilizzo di IBM® Cloudant® for IBM Cloud® ” per conoscere tutte le opzioni disponibili.
Principi di base di curl e jq
Per ottenere tutti i task attivi e formattare l'output in modo chiaro, richiama il tuo account utilizzando curl, e reindirizza l'output a jq.
Con jq``, è possibile filtrare un elenco di documenti in base ai valori dei campi. Questo filtro semplifica il recupero di tutti i documenti di replica, oppure dei dettagli relativi a una specifica attività di indicizzazione delle
viste. La guida di riferimento API contiene ulteriori informazioni sulle opzioni.
Ecco un esempio di come ottenere e formattare un elenco delle attività attive:
curl "$SERVICE_URL/_active_tasks" | jq
Monitoraggio delle creazioni delle viste e degli indici di ricerca
Gli indici delle viste vengono ricreati quando un documento di progettazione viene aggiornato. Un aggiornamento a una qualsiasi delle viste provoca la ricostruzione di tutte le viste nel documento.
Gli indici di ricerca vengono ricreati solo quando la loro funzione di indice corrispondente viene modificata. Per ogni indice di ricerca creato e per ogni documento di progettazione le cui viste vengono modificate, viene creata una nuova attività per ogni replica e ogni shard all’interno di un cluster.
Ad esempio, se sono presenti 24 shard con tre repliche ciascuno, e si aggiornano due indici di ricerca, vengono eseguiti 24 × 3 × 2 = 144 task.
Per trovare tutte le attività di indicizzazione delle viste, passa l'output curl a jq e quindi filtra i documenti nell'array in base al campo del tipo. Un comando corrispondente funziona per le attività di indicizzazione
della ricerca.
In ogni caso, il risultato della ricerca di un elenco di task di indicizzazione è un elenco di oggetti JSON: uno per ogni attività attiva trovata.
Ecco un esempio di come individuare tutte le attività di indicizzazione delle viste filtrando per il tipo " indexer ":
curl -s "$SERVICE_URL/_active_tasks" | jq '.[] | select(.type=="indexer")'
Ecco un esempio di come individuare tutte le attività di indicizzazione della ricerca filtrando per il tipo " search_indexer ":
curl -s "$SERVICE_URL/_active_tasks" | jq '.[] | select(.type=="search_indexer")'
Vedere i risultati di esempio dopo aver cercato le attività di indicizzazione delle viste:
{
"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"
}
Stima del tempo per completare un'attività
Per stimare il tempo necessario per completare l'attività di indicizzazione, monitora il numero di changes_done e confronta questo valore con total_changes. Ad esempio, se changes_done avanza di 250 al
secondo e total_changes è 1.000.000, si prevede che il completamento dell'attività richiederà 1.000.000 / 250 = 4.000 secondi, o all'incirca 66 minuti.
Le stime relative al tempo necessario per completare un'operazione di indicizzazione non possono essere corrette al 100%. Il tempo effettivo per completare l'attività dipende dai seguenti fattori:
- Il tempo necessario per elaborare ciascun documento. Ad esempio, una procedura potrebbe verificare innanzitutto il tipo di documento, e generare nuove voci di indice per un solo tipo.
- La dimensione dei documenti.
- Il carico di lavoro corrente sul cluster.
È necessario tenere presente che questi fattori potrebbero combinarsi tra loro, determinando una notevole imprecisione nella vostra stima.
Vedere l'esempio di estrazione del campo changes_done utilizzando jq:
curl ... | jq '.[] | select(.type=="search_indexer") | .changes_done'
Monitoraggio della replica
Per trovare tutte le attività di replica, passa l'output curl a jq e filtra i documenti nell'array in base al campo del tipo.
Per facilitare la selezione delle informazioni su un processo di replica dall'elenco delle attività attive, procedere come segue:
- Avviare il processo di replica creando un documento nel database
_replicator. - Impostare il campo
_idsu un valore noto.
Ecco un esempio di come individuare tutte le attività di replica, filtrandole in base al tipo " replication ":
curl -s "$SERVICE_URL/_active_tasks" | jq '.[] | select(.type=="replication")'
Ecco un esempio di come individuare un'attività di replica specifica, filtrando in base all'identità nota di un documento:
curl ... | jq '.[] | select(.doc_id=="ID")'
Ecco un esempio di come individuare un’attività di replica specifica, filtrando in base a un replication_id noto:
curl ... | jq '.[] | select(.replication_id=="ID")'
Vedere un esempio di risultato dopo la ricerca di un'attività di replica:
{
"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"
}
Risoluzione dei problemi di attività bloccate
Un'attività è bloccata?
Nel caso di una replica una tantum e non continua, in cui il database di origine non subisce aggiornamenti significativi durante la replica, il valore " changes_pending " indica il numero di documenti ancora da elaborare.
Pertanto, il valore " changes_pending " è un buon indicatore del momento in cui la replica dovrebbe concludersi.
Nel caso di una replica continua, ti interessa soprattutto capire come varia nel tempo il numero di documenti elaborati e se il valore dell' changes_pending e aumenta. Se changes_pending aumenta, ma revisions_checked rimane constante per un po', è probabile che la replica sia bloccata. Se il valore di “ changes_pending ” aumenta, e anche quello di “ revisions_checked ” aumenta, tali aumenti potrebbero indicare che la replica
non riesce a stare al passo con il volume di dati aggiunti o aggiornati nel database.
Cosa fare con un'attività bloccata?
Per risolvere un problema di replica bloccata, potrebbe essere necessario annullare il processo di replica e riavviarlo.
Se questo non risolve il problema, la replica potrebbe essere bloccata perché l'utente che sta accedendo ai database di origine o di destinazione non dispone dei permessi di scrittura.
La replica utilizza dei checkpoint, il che significa che i contenuti già replicati e rimasti invariati non devono essere replicati nuovamente se la replica viene riavviata.
Se hai iniziato il processo di replica creando un documento nel database _replicator, puoi anche controllare lo stato della replica da lì.