【ソースコード分析】エラスティックサーチ8.0.0の起動プロセス(4)

この記事では、起動プロセスの分析を続けます

1、ShardLimitValidator

クラスター内の各ノードのシャードの最大数は、デフォルトで1000です。

2、MetadataCreateIndexService

主にインデックス作成の処理を担当します

3、ActionModule

入力パラメータIndexScopedSettingsがあります

インデックスレベルのいくつかの組み込みパラメータ値、合計120を示し、その多くは頻繁に触れられます。

いくつかの典型的なものを選択します。といった

index.search.slowlog.threshold.fetch.trace -> {Setting@12155} "{
  "key" : "index.search.slowlog.threshold.fetch.trace",
  "properties" : [
    "Dynamic",
    "IndexScope"
  ],
  "is_group_setting" : false,
  "default" : "-1"
}"
index.number_of_shards -> {Setting@12205} "{
  "key" : "index.number_of_shards",
  "properties" : [
    "Final",
    "IndexScope"
  ],
  "is_group_setting" : false,
  "default" : "1"
}"

デフォルトのシャードは1です

システムの組み込みアクションはActionRegistryに配置され、アクションはesのさまざまな操作をこのオブジェクトにカプセル化することです。

public abstract class TransportAction<Request extends ActionRequest, Response extends ActionResponse> 

トップレベルの抽象クラス、その2つのジェネリック、requestとreturnの宣言は、esの呼び出し元としてよく使用する各apiの抽象化です。といった

public class TransportCreateIndexAction extends TransportMasterNodeAction<CreateIndexRequest, CreateIndexResponse> 
public abstract class HandledTransportAction<Request extends ActionRequest, Response extends ActionResponse>
        extends TransportAction<Request, Response> 
public class TransportBulkAction extends HandledTransportAction<BulkRequest, BulkResponse>
public class TransportSearchAction extends HandledTransportAction<SearchRequest, SearchResponse> 

上記に加えて、クラスター構成に2つの構成が追加され、そのうちの1つはデフォルトの自動インデックス作成がtrueです。どのような状況で創造が許されないのか想像できませんか?

マッピング要求の検証、エイリアス要求の検証。これらの2つのアイテムは、プラグインから取得されます。

また、HTTPリクエストのディスパッチを主な目的とするRestControllerオブジェクトを作成し、処理に適したハンドラーを見つけます。主にリクエストのuriparamsメソッドに基づいて、それを見つける方法。最後に、RestHandlerが見つかります。このクラスはインターフェースであり、内部のコアメソッドです。

@Override
    public final void handleRequest(RestRequest request, RestChannel channel, NodeClient client) throws Exception {
        // execute the action
        action.accept(channel);
}

4、NetworkModule

ロードされたNetworkPluginを分析します。4関連

最終的に得られた

final Transport transport = networkModule.getTransportSupplier().get();

トランスポートの最終的なインスタンス化されたオブジェクトタイプは次のとおりです

輸送は何をしますか?

これは、クラスター内のノード間の接続を処理するために使用されます。たとえば、クエリ要求、あるノードから別のノードへの要求は、トランスポートを介して完了します。そして、それは非同期の方法で行われ、スレッドのブロッキングを引き起こしません。その送信はtcpに基づいています。

5、UpgradeService

MetadataIndexUpgradeServiceは主に、残りのインデックスのメタデータを現在のクラスターの最新バージョンにアップグレードする役割を果たします。典型的な使用シナリオは、クラスターがアップグレードされたとき、またはダングリングインデックスがクラスターにインポートされたときです。

TemplateUpgradeServiceはテンプレート関連を記述しており、私は個人的に使用するテンプレートを少なくしています。ただし、一部の企業は専用のesメンテナンスチームを持っていると言われており、頻繁に運用されるAPIにはテンプレート関連のAPIが多数あります。このサービスでは、ノードがクラスターに参加しようとすると、プラグインが途中でインストールされたときにテンプレートがアップグレードされると説明されています。

6、RepositoriesModule + SnapshotsService

RepositoriesModuleモジュールは、スナップショットと復元の準備のために作成されます。スナップショットは段階的に保存されます。インデックスのさまざまなスナップショットまたはクラスターのさまざまなスナップショットを保存できます。どこに保管されていますか?ローカルまたはクラウドディスクのどこにでも保存できます。図のように入力します

SnapshotsServiceが作成されると、スナップショット状態変更のハンドラーがトランスポートサービスに登録されます。

シャードレベルのスナップショットサービスも作成されます。このサービスは、シャードでのスナップショット操作の開始と停止を管理します。

次に、主にスナップショットの復元を処理する復元サービスRestoreServiceを作成します

7、DiscoveryModule

このモジュールは、ノードがお互いを見つけてクラスターを形成することを意味します。主なシナリオは、esが開始されたとき、または新しいマスターノードが選択されたときです。検出プロセスは2つのステップに分かれています。最初のステップは、設定でシードホストリストを提供することです。次に、各ノードはリスト内のマシンに接続を試み、それがノードであるか、マスターになる可能性のあるノードであるかを確認します。 。2番目のステップでは、最初のステップが成功した場合、ノードは取得したマスター候補ノード情報を正常に接続されたノードと共有します。正常に接続されたノードは、パートナーのアドレスも1つずつ返します。次に、ノードはこれらの新しく返されたアドレスに接続しようとします

8.NodeClientの初期化

現在のノードでさまざまな操作を実行するクライアント

最後に、HTTPハンドラーを初期化します 

デフォルトでは、esのほとんどすべてのアクションはHTTPを介して処理されます。このスクリーンショットは部分的です

public void initRestHandlers(Supplier<DiscoveryNodes> nodesInCluster) {
        List<AbstractCatAction> catActions = new ArrayList<>();
        Consumer<RestHandler> registerHandler = handler -> {
            if (handler instanceof AbstractCatAction) {
                catActions.add((AbstractCatAction) handler);
            }
            restController.registerHandler(handler);
        };
        registerHandler.accept(new RestAddVotingConfigExclusionAction());
        registerHandler.accept(new RestClearVotingConfigExclusionsAction());
        registerHandler.accept(new RestMainAction());
        registerHandler.accept(new RestNodesInfoAction(settingsFilter));
        registerHandler.accept(new RestRemoteClusterInfoAction());
        registerHandler.accept(new RestNodesStatsAction());
        registerHandler.accept(new RestNodesUsageAction());
        registerHandler.accept(new RestNodesHotThreadsAction());
        registerHandler.accept(new RestClusterAllocationExplainAction());
        registerHandler.accept(new RestClusterStatsAction());
        registerHandler.accept(new RestClusterStateAction(settingsFilter));
        registerHandler.accept(new RestClusterHealthAction());
        registerHandler.accept(new RestClusterUpdateSettingsAction());
        registerHandler.accept(new RestClusterGetSettingsAction(settings, clusterSettings, settingsFilter));
        registerHandler.accept(new RestClusterRerouteAction(settingsFilter));
        registerHandler.accept(new RestClusterSearchShardsAction());
        registerHandler.accept(new RestPendingClusterTasksAction());
        registerHandler.accept(new RestPutRepositoryAction());
        registerHandler.accept(new RestGetRepositoriesAction(settingsFilter));
        registerHandler.accept(new RestDeleteRepositoryAction());
        registerHandler.accept(new RestVerifyRepositoryAction());
}

ついにノードインスタンスがアップしました!

 

9.まとめ

ノードを作成する過程で、Module、bindメソッドなどで終わるなど、依存関係の挿入に関連するオブジェクトをたくさん見ました。はい、esはGuice依存関係の挿入フレームワークを使用してさまざまなオブジェクト間の依存関係を完成させます。

Guiceの詳細な使用については、追加情報が必要です。

ソースコード検索が好きな友達:赤いはしご、一緒に進歩する

おすすめ

転載: blog.csdn.net/weixin_39394909/article/details/108438968