Node内部架构图

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之类的云存储)。

posted @ 2017-12-27 17:01  daniel456  阅读(1116)  评论(0编辑  收藏  举报