タスクの管理
多数のデータにわたる新しい索引を作成したり、大規模なデータベースを複製したりするには、かなりの時間がかかる場合があります。
タスクが進行中か、それとも完了したかを調べるにはどうすればよいのでしょうか。
_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
にパイピングし、配列内の文書をそれらのタイプ・フィールドでフィルター処理します。
以下の手順に従うと、複製プロセスに関する情報をアクティブ・タスクのリストから簡単に選択できるようになります。
_replicator
データベースに文書を作成して、複製プロセスを開始します。- その
_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
データベース内に文書を作成して複製プロセスを作成した場合は、そこで複製の状況をチェックすることもできます。