Gestión de tareas

La creación de índices nuevos sobre muchos datos o la réplica de una base de datos grande puede tardar bastante tiempo.

¿Cómo puede determinar si se están procesando las tareas o si han finalizado? El punto final _active_tasks ofrece información sobre todas las tareas en curso. Sin embargo, si inicia numerosas tareas, es posible que algunas de ellas se ejecuten más tarde y no se muestren en _active_tasks hasta que empiecen.

Vea los siguientes ejemplos de código SDK y 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))

El ejemplo Go anterior requiere el siguiente bloque de importación:

import (
    "encoding/json"
    "fmt"
    "github.com/IBM/cloudant-go-sdk/cloudantv1"
)

Todos los ejemplos de Go requieren que se inicialice el objeto service. Para obtener más información, consulte los ejemplos de la Sección de autenticación de la documentación de la API.

Ahora aprenderá a utilizar el punto final _active_tasks para supervisar las tareas de larga ejecución. Se utiliza el mandato curl para acceder al punto final. Se utiliza el procesador JSON de línea de mandatos jq para procesar la respuesta de JSON.

Esta guía de aprendizaje se centra en las tareas que son esenciales para llevar a cabo esta tarea. Para obtener más información, consulte el tema sobre Utilización de IBM® Cloudant® for IBM Cloud® para obtener una guía completa de las opciones disponibles.

Conceptos básicos de curl y jq

Para obtener todas las tareas activas y formatear correctamente la salida, realice una llamada a su cuenta mediante curl y dirija la salida a jq.

Con jq, filtre una lista de documentos por sus valores de campo. Este filtro facilita la obtención de todos los documentos de réplica o los detalles de una determinada tarea de indexación de vista. La referencia de API tiene más información acerca de las opciones.

Consulte un ejemplo de obtención y formateo de una lista de tareas activas:

curl "$SERVICE_URL/_active_tasks" | jq

Supervisión de creaciones de vistas e índices de búsqueda

Los índices de vista se vuelven a crear cuando se actualiza un documento de diseño. Una actualización en cualquiera de las vistas hace que se vuelvan a crear todas las vistas del documento.

Los índices de búsqueda se vuelven a crear solo cuando se modifica su función de índice correspondiente. Para cada índice de búsqueda que se crea y para cada documento de diseño con vistas que se modifica, se crea una nueva tarea para cada réplica y cada fragmento de un clúster.

Por ejemplo, si hay 24 fragmentos con tres réplicas cada uno y actualiza dos índices de búsqueda, se ejecutan 24 x 3 x 2 = 144 tareas.

Para ver todas las tareas de indexación de vistas, dirija la salida de curl a jq y deje que filtre los documentos de la matriz por el campo de tipo. Existe un mandato correspondiente para las tareas de indexación de búsqueda.

En cada caso, los resultados de la búsqueda de una lista de tareas de indexación es una lista de objetos JSON: uno para cada una de las tareas activas encontradas.

Consulte un ejemplo sobre cómo localizar las tareas de indexación de vistas filtrando por el tipo indexer:

curl -s "$SERVICE_URL/_active_tasks" | jq '.[] | select(.type=="indexer")'

Consulte un ejemplo sobre cómo localizar las tareas de indexación de búsquedas filtrando por el tipo search_indexer:

curl -s "$SERVICE_URL/_active_tasks" | jq '.[] | select(.type=="search_indexer")'

Consulte los resultados de ejemplo después de buscar las tareas de indexación de vistas:

{
    "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"
}

Estimación del tiempo necesario para completar una tarea

Para estimar el tiempo necesario para que finalice la tarea de indexación, supervise el número de changes_done y compare este valor con total_changes. Por ejemplo, si changes_done avanza 250 por segundo y total_changes es 1.000.000, se espera que la tarea tarde 1.000.000 / 250 = 4.000 segundos, o unos 66 minutos, en completarse.

Las estimaciones del tiempo necesario para completar una tarea de indexación no pueden ser correctas al 100%. El tiempo real que se tarda en completar la tarea dependerá de los factores siguientes:

  • El tiempo que se tarda en procesar cada documento. Por ejemplo, una vista podría comprobar primero el tipo de documento, y crear nuevas entradas de índice para un solo tipo.
  • El tamaño de los documentos.
  • La carga de trabajo actual en el clúster.

Debe tener en cuenta que la combinación de estos factores puede hacer que la estimación sea bastante imprecisa.

Consulte un ejemplo de extracción del campo changes_done mediante jq:

curl ... | jq '.[] | select(.type=="search_indexer") | .changes_done'

Supervisión de la réplica

Para buscar todas las tareas de réplica, dirija la salida de curl a jq y filtre los documentos de la matriz por su campo de tipo.

Facilite la selección de la información sobre un proceso de réplica de la lista de tareas activas siguiendo estos pasos:

  1. Inicie el proceso de réplica mediante la creación de un documento en la base de datos _replicator.
  2. Establezca su campo _id en un valor conocido.

Consulte un ejemplo de búsqueda de todas las tareas de réplica, filtrando por el tipo replication:

curl -s "$SERVICE_URL/_active_tasks" | jq '.[] | select(.type=="replication")'

Consulte un ejemplo de búsqueda de una determinada tarea de réplica filtrando por una identidad de documento conocida:

curl ... | jq '.[] | select(.doc_id=="ID")'

Consulte un ejemplo de búsqueda de una determinada tarea de réplica filtrando por un replication_id conocido:

curl ... | jq '.[] | select(.replication_id=="ID")'

Consulte un resultado de ejemplo después de buscar una tarea de réplica:

{
    "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"
}

Resolución de problemas de tareas atascadas

¿Se ha atascado una tarea?

En el caso de una réplica que no sea continua, en la que la base de datos de origen no se actualiza significativamente durante la réplica, el valor changes_pending muestra el número de documentos que faltan por procesar. Por lo tanto, el valor changes_pending es un buen indicador para calcular cuándo terminará la réplica.

En el caso de una réplica continua, interesa más saber cómo cambia en el tiempo el número de documentos procesados y si el valor de changes_pending aumenta. Si changes_pending aumenta, pero revisions_checked permanece constante durante un rato, es probable que la réplica se haya atascado. Si changes_pending aumenta y revisions_checked también aumenta, es probable que la réplica no pueda seguir el ritmo de todo el volumen de datos que se ha añadido o actualizado en la base de datos.

¿Qué hay que hacer cuando una tarea se atasca?

Para resolver un problema de replicación bloqueada, es posible que tengas que cancelar el proceso de replicación y volver a iniciarlo.

Si esto no ayuda, es posible que la réplica se haya atascado porque el usuario que accede a las bases de datos de origen o de destino no tenga permisos de escritura.

La réplica utiliza puntos de comprobación, lo que implica que el contenido que ya se haya replicado y que no se haya modificado no se tendrá que replicar de nuevo si se reinicia la réplica.

Si ha creado el proceso de réplica mediante la creación de un documento en la base de datos _replicator, también puede comprobar allí el estado de la réplica.