Python社区  »  Elasticsearch

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

Ombres • 2 月前 • 22 次点击  

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》
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/34475
 
22 次点击  
分享到微博