Node 类
这是Elasticsearch的核心类,基本上所有的初始化都是在这个类中完成的。
node级别的一些配置
-
WRITE_PORTS_FILE_SETTING
:对应参数为node.portsfile
,默认为false -
NODE_DATA_SETTING
:对应参数为node.data
,默认为true -
NODE_MASTER_SETTING
:对应参数为node.master
,默认为true -
NODE_INGEST_SETTING
:对应参数为node.ingest
,默认为true -
NODE_LOCAL_STORAGE_SETTING
:对应参数为node.local_storage
,默认为true -
NODE_NAME_SETTING
:对应参数为node.name
-
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();
其他组件
- 日志
private final Logger logger; - 依赖注入器
private final Injector injector; - node配置
private final Settings settings; - 运行环境
private final Environment environment; - node运行环境
private final NodeEnvironment nodeEnvironment; - 插件服务(保存模块和插件信息)
private final PluginsService pluginsService; - 本地节点执行操作的客户端
private final NodeClient client; - 生命周期组件
private final Collection<LifecycleComponent> pluginLifecycleComponents; - 本地节点工厂,集群发现相关
private final LocalNodeFactory localNodeFactory; - 节点服务
private final NodeService nodeService;
Node构造器
- 获取log组件
- 获取环境配置
- 获取JVM信息
- 构造一个PluginService,根据插件和模块修改配置(Setting)
- 构造localNodeFactory
- 基于目前的配置创建最终的环境,方便任何时候访问。(Environment)
- 根据插件和模块以及目前的配置(Setting),构建线程池,然后将线程池的ThreadContext添加到DeprecationLogger,不用每次都注入,这个只会在这里执行一次,可以添加ThreadContext到network响应
- 从插件和模块获取追加配置
- 构建NodeClient,用于执行本地节点操作。这里会将线程池交给NodeClient维护。
在NodeClient的中还包括一个Admin,用来管理Cluster和Indecies。
包括一个动作监听器,它封装另一个动作监听器并线程化它的执行。 - 构建一个ResourceWatcherService,其他服务可以把自己的资源监听注册到这个服务中
- 构建一个ScriptModule,管理ScriptService,在SettingsModule构建之后,scriptModule会监听Setting的变化
- 构建一个AnalysisModule,管理分词器,
- 构建SettingsModule,管理集群及节点的所有配置
- 初始化NetworkService,管理节点的网络通信
- 初始化ClusterService,管理集群间的通信。
- 初始化IngestService,管理Ingest节点。
- 添加硬盘监控
- 初始化ClusterInfoService,定期收集节点信息
- 初始化UsageService,监控Elasticsearch使用情况,这里记录所有的Rest请求的handler
- 初始化所有的plugin modules
- 构建一个监听服务,用来监控以下几种信息
private final JvmGcMonitorService jvmGcMonitorService;
private final OsService osService;
private final ProcessService processService;
private final JvmService jvmService;
private final FsService fsService;
- 构建ClusterModule,将以上clusterService, clusterPlugins, clusterInfoService进行统一管理,将这个moudule加入modules
- 构建IndicesModule,用来管理Mapper,将这个moudule加入modules
- 构建SearchModule,包括queries, aggregations, and suggesters等。
- 初始化CircuitBreakerService,这是熔断服务。
- 构建GatewayModule,并添加到modules
- PageCacheRecycler初始化,在SettingsModule初始化的时候已经初始化了一些配置,并且维护了一个
NON_RECYCLING_INSTANCE
- settingsModule加入modules
- 构建NamedWriteableRegistry,注册一些可序列化的对象的的
reader
- 构建NamedXContentRegistry,注册XContent解析器
- 初始化MetaStateService,用来操作读写
Manifest
,MetaData
,IndexMetaData
- 构建
engineFactoryProviders
和indexStoreFactories
- 初始化IndicesService,这是索引管理的服务
- 初始化MetaDataCreateIndexService,负责提交创建索引请求的服务,在这之前需要初始化别名校验。
- 构建所有的Plugin.class子类的所有插件
- 构建ActionModule,构建并绑定通用操作映射、所有传输操作和操作过滤器
- 构建NetworkModule,管理所有网络相关的类
- 初始化MetaDataIndexUpgradeService,用于集群升级的时候索引元数据的升级
- 初始化TemplateUpgradeService,新节点加入的时候为已安装的插件升级Template
- 初始化TransportService,这里会获取networkModule中的tranport,实际上就是SecurityNetty4ServerTransport。
- GatewayMetaState,该类负责在磁盘中存储/检索元数据。它还检查文件系统级别是否支持原子移动,因为这是元数据存储算法的必需条件。集群状态信息在这里,master会收集信息然后广播到其他节点
- 初始化SearchTransportService,内部是一个transportService会有一个ResponseCollectorService,收集每个节点上执行的任务的队列大小、响应时间和服务时间的统计信息,使协调节点可以使用值的EWMA。
- 构建一个HttpServerTransport,这也是一个SecurityNetty4ServerTransport
- 构建DiscoveryModule,服务发现的模块
- 初始化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;
- 初始化SearchService
- 构建所有的PersistentTaskPlugin所属的PersistentTasksExecutor,主要是xpack的一些功能,先new一个注册器,最后封装为一个PersistentTasksClusterService和一个PersistentTasksService
- 这里比较关键,是把以上的服务加到modules,然后创建一个注入器,使用的时候就会自动注入。
- 接下来就是一些配置了,clusterModule添加GatewayAllocator
- pluginLifecycleComponents初始化
- NodeClient初始化。
- ActionModule初始化所有的RestHandler
- 结束。
《过完第一遍,但是还有需要调整的 2019.06.06》
网友评论