美文网首页
Elasticsearch启动流程源码学习(三)

Elasticsearch启动流程源码学习(三)

作者: Ombres | 来源:发表于2019-06-04 21:16 被阅读0次

    Node 类

    这是Elasticsearch的核心类,基本上所有的初始化都是在这个类中完成的。

    node级别的一些配置

    1. WRITE_PORTS_FILE_SETTING:对应参数为node.portsfile,默认为false
    2. NODE_DATA_SETTING:对应参数为node.data,默认为true
    3. NODE_MASTER_SETTING:对应参数为node.master,默认为true
    4. NODE_INGEST_SETTING:对应参数为node.ingest,默认为true
    5. NODE_LOCAL_STORAGE_SETTING:对应参数为node.local_storage,默认为true
    6. NODE_NAME_SETTING:对应参数为node.name
    7. NODE_ATTRIBUTES:对应参数为node.attr,默认为true
       public static final Setting<Boolean> WRITE_PORTS_FILE_SETTING =
            Setting.boolSetting("node.portsfile", false, Property.NodeScope);
        public static final Setting<Boolean> NODE_DATA_SETTING = Setting.boolSetting("node.data", true, Property.NodeScope);
        public static final Setting<Boolean> NODE_MASTER_SETTING =
            Setting.boolSetting("node.master", true, Property.NodeScope);
        public static final Setting<Boolean> NODE_INGEST_SETTING =
            Setting.boolSetting("node.ingest", true, Property.NodeScope);
        public static final Setting<Boolean> NODE_LOCAL_STORAGE_SETTING = Setting.boolSetting("node.local_storage", true, Property.NodeScope);
        public static final Setting<String> NODE_NAME_SETTING = Setting.simpleString("node.name", Property.NodeScope);
        public static final Setting.AffixSetting<String> NODE_ATTRIBUTES = Setting.prefixKeySetting("node.attr.", (key) ->
            new Setting<>(key, "", (value) -> {
                if (value.length() > 0
                    && (Character.isWhitespace(value.charAt(0)) || Character.isWhitespace(value.charAt(value.length() - 1)))) {
                    throw new IllegalArgumentException(key + " cannot have leading or trailing whitespace " +
                        "[" + value + "]");
                }
                if (value.length() > 0 && "node.attr.server_name".equals(key)) {
                    try {
                        new SNIHostName(value);
                    } catch (IllegalArgumentException e) {
                        throw new IllegalArgumentException("invalid node.attr.server_name [" + value + "]", e );
                    }
                }
                return value;
            }, Property.NodeScope));
        public static final Setting<String> BREAKER_TYPE_KEY = new Setting<>("indices.breaker.type", "hierarchy", (s) -> {
            switch (s) {
                case "hierarchy":
                case "none":
                    return s;
                default:
                    throw new IllegalArgumentException("indices.breaker.type must be one of [hierarchy, none] but was: " + s);
            }
        }, Setting.Property.NodeScope);
    
        private static final String CLIENT_TYPE = "node";
    

    node生命周期

        private final Lifecycle lifecycle = new Lifecycle();
    

    其他组件

    1. 日志
      private final Logger logger;
    2. 依赖注入器
      private final Injector injector;
    3. node配置
      private final Settings settings;
    4. 运行环境
      private final Environment environment;
    5. node运行环境
      private final NodeEnvironment nodeEnvironment;
    6. 插件服务(保存模块和插件信息)
      private final PluginsService pluginsService;
    7. 本地节点执行操作的客户端
      private final NodeClient client;
    8. 生命周期组件
      private final Collection<LifecycleComponent> pluginLifecycleComponents;
    9. 本地节点工厂,集群发现相关
      private final LocalNodeFactory localNodeFactory;
    10. 节点服务
      private final NodeService nodeService;

    Node构造器

    1. 获取log组件
    2. 获取环境配置
    3. 获取JVM信息
    4. 构造一个PluginService,根据插件和模块修改配置(Setting)
    5. 构造localNodeFactory
    6. 基于目前的配置创建最终的环境,方便任何时候访问。(Environment)
    7. 根据插件和模块以及目前的配置(Setting),构建线程池,然后将线程池的ThreadContext添加到DeprecationLogger,不用每次都注入,这个只会在这里执行一次,可以添加ThreadContext到network响应
    8. 从插件和模块获取追加配置
    9. 构建NodeClient,用于执行本地节点操作。这里会将线程池交给NodeClient维护。
      在NodeClient的中还包括一个Admin,用来管理Cluster和Indecies。
      包括一个动作监听器,它封装另一个动作监听器并线程化它的执行。
    10. 构建一个ResourceWatcherService,其他服务可以把自己的资源监听注册到这个服务中
    11. 构建一个ScriptModule,管理ScriptService,在SettingsModule构建之后,scriptModule会监听Setting的变化
    12. 构建一个AnalysisModule,管理分词器,
    13. 构建SettingsModule,管理集群及节点的所有配置
    14. 初始化NetworkService,管理节点的网络通信
    15. 初始化ClusterService,管理集群间的通信。
    16. 初始化IngestService,管理Ingest节点。
    17. 添加硬盘监控
    18. 初始化ClusterInfoService,定期收集节点信息
    19. 初始化UsageService,监控Elasticsearch使用情况,这里记录所有的Rest请求的handler
    20. 初始化所有的plugin modules
    21. 构建一个监听服务,用来监控以下几种信息
        private final JvmGcMonitorService jvmGcMonitorService;
        private final OsService osService;
        private final ProcessService processService;
        private final JvmService jvmService;
        private final FsService fsService;
    
    1. 构建ClusterModule,将以上clusterService, clusterPlugins, clusterInfoService进行统一管理,将这个moudule加入modules
    2. 构建IndicesModule,用来管理Mapper,将这个moudule加入modules
    3. 构建SearchModule,包括queries, aggregations, and suggesters等。
    4. 初始化CircuitBreakerService,这是熔断服务。
    5. 构建GatewayModule,并添加到modules
    6. PageCacheRecycler初始化,在SettingsModule初始化的时候已经初始化了一些配置,并且维护了一个NON_RECYCLING_INSTANCE
    7. settingsModule加入modules
    8. 构建NamedWriteableRegistry,注册一些可序列化的对象的的reader
    9. 构建NamedXContentRegistry,注册XContent解析器
    10. 初始化MetaStateService,用来操作读写ManifestMetaDataIndexMetaData
    11. 构建engineFactoryProvidersindexStoreFactories
    12. 初始化IndicesService,这是索引管理的服务
    13. 初始化MetaDataCreateIndexService,负责提交创建索引请求的服务,在这之前需要初始化别名校验。
    14. 构建所有的Plugin.class子类的所有插件
    15. 构建ActionModule,构建并绑定通用操作映射、所有传输操作和操作过滤器
    16. 构建NetworkModule,管理所有网络相关的类
    17. 初始化MetaDataIndexUpgradeService,用于集群升级的时候索引元数据的升级
    18. 初始化TemplateUpgradeService,新节点加入的时候为已安装的插件升级Template
    19. 初始化TransportService,这里会获取networkModule中的tranport,实际上就是SecurityNetty4ServerTransport。
    20. GatewayMetaState,该类负责在磁盘中存储/检索元数据。它还检查文件系统级别是否支持原子移动,因为这是元数据存储算法的必需条件。集群状态信息在这里,master会收集信息然后广播到其他节点
    21. 初始化SearchTransportService,内部是一个transportService会有一个ResponseCollectorService,收集每个节点上执行的任务的队列大小、响应时间和服务时间的统计信息,使协调节点可以使用值的EWMA。
    22. 构建一个HttpServerTransport,这也是一个SecurityNetty4ServerTransport
    23. 构建DiscoveryModule,服务发现的模块
    24. 初始化NodeService,内部包含多个服务,对以上某些服务进行了一次封装。
       private final Settings settings;
        private final ThreadPool threadPool;
        private final MonitorService monitorService;
        private final TransportService transportService;
        private final IndicesService indicesService;
        private final PluginsService pluginService;
        private final CircuitBreakerService circuitBreakerService;
        private final IngestService ingestService;
        private final SettingsFilter settingsFilter;
        private final ScriptService scriptService;
        private final HttpServerTransport httpServerTransport;
        private final ResponseCollectorService responseCollectorService;
        private final SearchTransportService searchTransportService;
    
        private final Discovery discovery;
    
    1. 初始化SearchService
    2. 构建所有的PersistentTaskPlugin所属的PersistentTasksExecutor,主要是xpack的一些功能,先new一个注册器,最后封装为一个PersistentTasksClusterService和一个PersistentTasksService
    3. 这里比较关键,是把以上的服务加到modules,然后创建一个注入器,使用的时候就会自动注入。
    4. 接下来就是一些配置了,clusterModule添加GatewayAllocator
    5. pluginLifecycleComponents初始化
    6. NodeClient初始化。
    7. ActionModule初始化所有的RestHandler
    8. 结束。
      《过完第一遍,但是还有需要调整的 2019.06.06》

    相关文章

      网友评论

          本文标题:Elasticsearch启动流程源码学习(三)

          本文链接:https://www.haomeiwen.com/subject/zfwrxctx.html