IBM Cloud Docs
タスクの管理

タスクの管理

多数のデータにわたる新しい索引を作成したり、大規模なデータベースを複製したりするには、かなりの時間がかかる場合があります。

タスクが進行中か、それとも完了したかを調べるにはどうすればよいのでしょうか。 _active_tasks エンドポイント は、実行中のすべてのタスクに関する情報を提供します。 ただし、多数のタスクを開始した場合、一部のタスクは後で実行するようにスケジュールされ、以下には表示されない可能性があります。 _active_tasks 彼らが始めるまで

SDK および 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))

前の Go の例では、以下のインポート・ブロックが必要です。

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

すべての Go の例では、serviceオブジェクトを初期化する必要があります。 詳しくは、API 資料の認証セクションで例を参照してください。

ここでは、長時間実行されるタスクを _active_tasks エンドポイントを使用してモニターする方法について説明します。 このエンドポイントにアクセスするには、 curl コマンドを使用します。 JSON 応答を処理するには、コマンド・ラインの JSON プロセッサー jq を使用します。

タスクに焦点を当てたこのチュートリアルでは、このタスクの実行に不可欠なことだけを取り上げています。 詳しくは、『 IBM® Cloudant® for IBM Cloud® の使用』で、使用可能なオプションについての詳しい説明を参照してください。

curl および jq の基本

すべてのアクティブ・タスクを取得し、出力を適切にフォーマット設定するには、 curl を使用してアカウントを呼び出し、 出力を jq にパイピングします。

jq を使用すると、文書リストをフィールド値によってフィルター処理することができます。 このフィルター処理により、すべての複製文書を取得したり、1 つの特定のビュー索引付けタスクのみの詳細を取得したりすることが容易になります。 API リファレンスに、これらのオプションに関する詳細情報が記載されています。

アクティブ・タスクのリストを取得して形式を設定する例を以下に示します。

curl "$SERVICE_URL/_active_tasks" | jq

ビューの作成および検索索引のモニタリング

ビュー索引は、設計文書が更新される際に再作成されます。 いずれかのビューを更新すると、文書内のすべてのビューが再作成されます。

検索索引は、対応する索引機能が変更される時にのみ再作成されます。 作成される検索索引ごとに、および、変更されるビューを含む設計文書ごとに、各レプリカおよびクラスター内の各シャードについて新しいタスクが 1 つ作成されます。

例えば、それぞれ 3 個のレプリカを持つシャードが 24 個ある場合に、2 個の検索索引を更新すると、24 x 3 x 2 = 144 タスクが実行されます。

すべてのビュー索引付けタスクを検出するには、curl 出力を jq にパイピングし、配列内の文書をそれらのタイプ・フィールドでフィルター処理します。 検索索引付けタスクについては、対応するコマンドが機能します。

いずれの場合も、インデックス付けタスクのリストを検索した結果は、JSON オブジェクトのリストになります。 検出されたアクティブ・タスクごとに 1 つ。

indexer タイプでフィルタリングしてビューの索引作成タスクをすべて検出する例を以下に示します。

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

search_indexer タイプでフィルタリングして検索索引作成タスクをすべて検出する例を以下に示します。

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

ビューの索引作成タスクを検索した後の結果の例を以下に示します。

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

タスクを完了するための時間の見積もり

索引付けタスクが完了するまでに必要な時間を見積もるには、changes_done の数値をモニターし、この値を total_changes と比較します。 例えば、 changes_done が 1 秒間につき 250 ずつ進み、total_changes が 1,000,000 の場合、このタスクは、完了までに 1,000,000 / 250 = 4,000 秒、つまり約 66 分かかると予想されます。

索引作成タスクを完了するまでに必要な時間の見積もりは 100% 正しいわけではありません。 タスクを完了するための実際の時間は、以下の要因によって決まります。

  • 各文書の処理に要する時間。 例えば、最初に文書のタイプをチェックし、1 つのみのタイプ用に新しい索引項目を排出するといったビューが考えられます。
  • 文書のサイズ。
  • クラスター上の現在のワークロード。

これらの要因が組み合わさって見積もりがかなり不正確になる可能性があることを想定しておく必要があります。

changes_done を使用して jq フィールドを抽出する例を以下に示します。

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

複製のモニター

すべての複製タスクを検出するには、curl 出力を jq にパイピングし、配列内の文書をそれらのタイプ・フィールドでフィルター処理します。

以下の手順に従うと、複製プロセスに関する情報をアクティブ・タスクのリストから簡単に選択できるようになります。

  1. _replicator データベースに文書を作成して、複製プロセスを開始します。
  2. その _id フィールドを既知の値に設定します。

replication タイプでフィルタリングして複製タスクをすべて検出する例を以下に示します。

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

既知の文書 ID でフィルタリングして特定の複製タスクを検出する例を以下に示します。

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

既知の replication_id でフィルタリングして特定の複製タスクを検出する例を以下に示します。

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

複製タスクを検索した後の結果の例を以下に示します。

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

進行が停滞したタスクのトラブルシューティング

タスクの進行が停滞した場合

複製中にソース・データベースの大幅な更新が行われない、1 回限りの非継続的複製では、changes_pending 値が残りの処理対象文書の数を示します。 したがって、 changes_pending 値は、いつ頃複製が終了するかを示す優れた指標です。

継続的複製では、ユーザーは、 処理された文書の数が時間の経過とともにどのように変化するか、 および changes_pending 値が増加するかどうかということに、より関心があります。 changes_pending は増加しているものの、revisions_checked はしばらくの間一定している場合は、複製が停止している可能性があります。 changes_pending が増加し、revisions_checked も増加している場合は、データベースに追加されるデータ、またはデータベース内で更新されるデータのボリュームに複製が追いついていないことを示している可能性があります。

進行が停滞したタスクの対処法

停止した複製を解決するには、 複製プロセスをキャンセル して、再度開始しなければならない場合があります。

それでも解決しない場合は、ソース・データベースまたはターゲット・データベースにアクセスしているユーザーが書き込み権限を持っていないことが原因で、複製が停止している可能性があります。

複製ではチェックポイントが使用されます。つまり、既に複製され、変更されていない内容は、複製がリスタートされた場合、再度複製される必要はありません。

_replicator データベース内に文書を作成して複製プロセスを作成した場合は、そこで複製の状況をチェックすることもできます。