ES学習ノートの--delete appiの実現プロセス
4125 ワード
ESのdelete appiは使いやすいです.
ES関連機能アクションの名前は統一されています.例えば
しかし、Transport Delectionを勉強して、その核心的な流れは父の類にあります.個人的にはこの名前はよくないと思いますが、コピーだけで機能が実行されるという意味です.
クラスname
機能
ReroutePhase
要求をprimaryセグメントがあるノードにルーティングする.
Primary Phase
メインスライスでタスクを実行します.
Replication Phase
すべてのreplicaをスライスしてタスクを実行します.
この構造は一般的で、テンプレートのようです.このクラスにはコメントがあり、クラスの運行フローを説明しました.
ESは各ノードコードが同じであるため、デフォルトでは各ノードのロールが自由に切り替わります.ここでは主に
削除に関して、ESは
最後に、
curl -XDELETE 'http://localhost:9200/index/type/doc_id'
前にget api
の主要な流れを学びました.ここでdelete api
の実現原理を探ってみます.優先的な選択delete api
はindex api
ではなく、主に削除が容易であるように思えるので、delete api
学習曲線の選択は比較的緩やかであるべきである.ES関連機能アクションの名前は統一されています.例えば
get api
、対応する実装クラスの名前はTransportGetAction
、delete api
、対応する実装クラスの名前も同じです.しかし、Transport Delectionを勉強して、その核心的な流れは父の類にあります.個人的にはこの名前はよくないと思いますが、コピーだけで機能が実行されるという意味です.
TransportDeleteAction
を知る前に、まずTransportReplicationAction
の実行プロセスを説明します. ES : , 。 :
s1: 。
s2: 。
s3: 。
上記のように、TransportReplicationAction
クラスでは、3つのサブクラスが対応している.クラスname
機能
ReroutePhase
要求をprimaryセグメントがあるノードにルーティングする.
Primary Phase
メインスライスでタスクを実行します.
Replication Phase
すべてのreplicaをスライスしてタスクを実行します.
この構造は一般的で、テンプレートのようです.このクラスにはコメントがあり、クラスの運行フローを説明しました.
/**
* Base class for requests that should be executed on a primary copy followed by replica copies.
* Subclasses can resolve the target shard and provide implementation for primary and replica operations.
*
* The action samples cluster state on the receiving node to reroute to node with primary copy and on the
* primary node to validate request before primary operation followed by sampling state again for resolving
* nodes with replica copies to perform replication.
*/
説明すると次のようなポイントがあります.1. primary shard , replica shard 。
2. , `TransportDeleteAction` 。
3. cluster state 。 `resolveRequest`
この流れに基づいて、削除操作はまだヘビー級のもので、コピーが多いほど、削除のコストが大きいことが分かります.ESは各ノードコードが同じであるため、デフォルトでは各ノードのロールが自由に切り替わります.ここでは主に
delete api
の方法を勉強する時の小さなコツです.たとえばコード: void performOnReplica(final ShardRouting shard) {
// if we don't have that node, it means that it might have failed and will be created again, in
// this case, we don't have to do the operation, and just let it failover
final String nodeId = shard.currentNodeId();
...
final DiscoveryNode node = nodes.get(nodeId);
transportService.sendRequest(node, transportReplicaAction, ... ){
...
}
}
ここTransportReplicationAction
の後、受信ロジックはどこにありますか? transportService.registerRequestHandler(actionName, request, ThreadPool.Names.SAME, new OperationTransportHandler());
transportService.registerRequestHandler(transportPrimaryAction, request, executor, new PrimaryOperationTransportHandler());
// we must never reject on because of thread pool capacity on replicas
transportService.registerRequestHandler(transportReplicaAction, replicaRequest, executor, true, true, new ReplicaOperationTransportHandler());
すなわち、transportService.sendRequest()
の第二パラメータtransportService.sendRequest()
とtransportService.sendRequest()
の第一パラメータaction
は、一対一に対応している.transportService.registerRequestHandler()
に会ったら、直接action
パラメータを通して対応するHandlerを見つければいい.例えばtransportService.sendRequest()
は、action
方法で送信された要求を受信するためのものである.PrimaryOperationTransportHandler
に戻って、ES削除の論理を理解するには、クラス全体が2つの方法を理解するだけでよい.# primary shard
shardOperationOnPrimary()
# replica shard
executeDeleteRequestOnReplica()
この中は削除の具体的なロジックです.Engine関連の内容は後からもっと深くなります.削除に関して、ESは
ReroutePhase().run()
の考え方を提供する.初期ESは、queryによる大量削除をサポートしていますが、後でこの機能が危険すぎると感じたら、TransportDeleteAction
をPluginに作成し、ユーザー自身でプラグインをインストールしてから使用できます.ES一括削除の考え方については、delete by id
プラグインのソースコードを参照することができますが、delete by query
を介して条件に従ってdoc idを検索し、delete by query
を使用して削除します.最後に、
scroll query
は比較的一般的なモードであるため、ESの他の機能もこのモードに基づくものである.例えば、client.bulk()
.