1.Node内部架构图
先来看一下Node节点的内部实现架构图。
首先最上层入口是Restful风格和javaTcp风格的API入口,RestFul请求映射到处理器RestControl。JavaApi映射到轻量级的TransportClient或者重量级的NodeClient。所有的外部命令(不管是http还是tcp)最终都转换为统一的Action动作。不同的action动作又都基于底层的种类繁多的Services服务。涉及到索引数据的Service会调用底层封装的Lucene来完成具体操作。最底层的GateWay对应数据的不同存储方式,默认是采用Local FileSystem,即保存到本地.通过配置也可以将索引数据保存到远程的HDFS或者AmazonS3。
2.Module
我们知道ES节点是由多个模块组成,这些模块负责其功能。 这些模块有以下两种类型的设置
-
静态设置 - 在启动Elasticsearch之前,需要在配置文件(
elasticsearch.yml
)中配置这些设置。需要更新集群中的所有关注节点以反映这些设置的更改。 -
动态设置 - 这些设置可以在实时Elasticsearch上设置。
所有模块都是在node构造的时候加入,主要的module有这些
ModulesBuilder modules = new ModulesBuilder(); modules.add(new Version.Module(version)); modules.add(new CircuitBreakerModule(settings)); // plugin modules must be added here, before others or we can get crazy injection errors... for (Module pluginModule : pluginsService.nodeModules()) { modules.add(pluginModule); } modules.add(new PluginsModule(pluginsService)); modules.add(new SettingsModule(this.settings)); modules.add(new NodeModule(this)); modules.add(new NetworkModule(namedWriteableRegistry)); modules.add(new ScriptModule(this.settings)); modules.add(new EnvironmentModule(environment)); modules.add(new NodeEnvironmentModule(nodeEnvironment)); modules.add(new ClusterNameModule(this.settings)); modules.add(new ThreadPoolModule(threadPool)); modules.add(new DiscoveryModule(this.settings)); modules.add(new ClusterModule(this.settings)); modules.add(new RestModule(this.settings)); modules.add(new TransportModule(settings, namedWriteableRegistry)); if (settings.getAsBoolean(HTTP_ENABLED, true)) { modules.add(new HttpServerModule(settings)); } modules.add(new IndicesModule()); modules.add(new SearchModule()); modules.add(new ActionModule(false)); modules.add(new MonitorModule(settings)); modules.add(new GatewayModule(settings)); modules.add(new NodeClientModule()); modules.add(new ShapeModule()); modules.add(new PercolatorModule()); modules.add(new ResourceWatcherModule()); modules.add(new RepositoriesModule()); modules.add(new TribeModule());
每个module都从AbstractModule派生而来,在configure中绑定需要用到的各种service
@Override protected void configure() { bind(DynamicSettings.class).annotatedWith(ClusterDynamicSettings.class).toInstance(clusterDynamicSettings.build()); bind(DynamicSettings.class).annotatedWith(IndexDynamicSettings.class).toInstance(indexDynamicSettings.build()); bind(ClusterInfoService.class).to(clusterInfoServiceImpl).asEagerSingleton(); bind(GatewayAllocator.class).asEagerSingleton(); bind(AllocationService.class).asEagerSingleton(); bind(DiscoveryNodeService.class).asEagerSingleton(); bind(OperationRouting.class).asEagerSingleton(); bind(MetaDataCreateIndexService.class).asEagerSingleton(); bind(MetaDataDeleteIndexService.class).asEagerSingleton(); ....... }
3.Services
通用服务,为action modules 等提供具体业务实现。
4.gateway的主要职责是用来对数据进行长持久化。
整个集群重启之后可以通过gateway重新恢复数据。怎么去对所有节点的索引信息进行持久化是个问题,除了索引信息之外,还有ClusterState(集群信息),mapping,索引碎片信息,以及transaction log等信息也是需要进行持久化的,0.11之后的版本新加了LocalGateway(并且是默认配置),加上之前的fs(使用共享文件系统)、hdfs(hadoop 分布式文件系统)、cloud(ec2之类的云存储)。