社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Elasticsearch

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

Ombres • 6 年前 • 350 次点击  

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
 
350 次点击