赞
踩
Elasticsearch:
在main里面创建了Elasticsearch实例,然后调用了main方法,这个main方法最终会调用到父类Command的main方法
这里做了几件事:
createEnv 函数最终调用了 InternalSettingsPreparer.prepareEnvironment 来加载 elasticsearch.yml 配置文件,并且创建了 command 运行的环境:Environment 对象
总结一下第一阶段:解析命令行参数并且验证配置
阶段二主要是在Bootstrap类中进行的,我们进入到Bootstrap.init方法中看
这个方法特别长,主要做了这样几件事:
本地资源初始化主要包括:
除了调用initializeNatives方法进行本地资源初始化,还调用initializeProbes() 进行初始化探针操作,主要用于操作系统负载监控、jvm 信息获取、进程相关信息获取。
之前只是简单的看了一下Node的创建,再回顾一下:
后续在构造方法里面一共做了这样几件事:
ES线程池的实现封装在ThreadPool中。ThreadPool中定义了4种线程池类型:
ThreadPool中创建了多个线程池,主要有以下几种:
action的类型定义在ActionType:
后续就是节点启动的流程了
Node.start主要负责启动各个生命周期组件(LifecycleComponent)和从Guice(也就是injector)中获取需要启动的服务类实例,然后调用它们的start方法
并且后面是一堆server要启动:
总结一下:
服务 | 简介 |
---|---|
IndicesService | 负责索引管理,如创建、删除等操作。 |
IndicesClusterStateService | 负责根据各种集群索引状态信息进行相应的操作,如创建或者恢复索引(这些实际的操作会交给具体的模块实现)等。 |
SnapshotsService | 负责创建快照,在执行快照创建和删除的时候,所有的执行步骤都在主节点上=进行。 |
SnapshotShardsService | 此服务在 data node 上运行,并且控制此节点上运行中的分片快照。其负责开启和停止分片级别的快照。 |
RepositoriesService | 负责维护节点快照存储仓库和提供对存储仓库的访问。 |
SearchService | 提供搜索支持的服务。 |
ClusterService | 集群管理服务,负责管理集群状态、处理集群任务、发布集群状态等。 |
FsHealthService | 文件系统健康检查服务。通过创建一个临时文件来检查文件系统是否可写。 |
MonitorService | 负责提供操作系统、进程、JVM、文件系统级别的监控服务 |
NodeConnectionsService | 该组件负责维护从该节点到集群状态中列出的所有节点的连接,并在节点从集群状态中删除后断开与节点的连接。并且会定期检查所有链接是否在打开状态,并且在需要的时候恢复它们。需要注意的是此组件不负责移除节点! |
GatewayService | 网关服务,负责集群元数据的持久化和恢复。 |
Discovery | 节点发现模块是一个可插拔的模块,其负责发现集群中其他的节点,发布集群状态到所有节点,选举主节点和发布集群状态变更事件。 |
PeerRecoverySourceService | 负责处理对等分片的恢复请求,并且开启从这个源分片到目标分片的恢复流程。 |
TransportService | 负责节点间数据同步。 |
HttpServerTransport | 提供 REST 接口服务。 |
根据前面的内容可知,Master 对集群的重要性,所以集群中多个节点启动后首要的任务是选举出一个 Master,有了 Master 后续的集群启动操作将由 Master 主导。
在 Master 被选举出来后,其首要任务就是要选择出集群的元数据信息,这部分的工作主要在 Gateway 模块中处理。Master 会向已经加入到集群的所有节点获取各种的元数据信息,然后选择出版本号最新的那个作为集群的元数据,并向所有节点进行广播。
在 allocation 过程中将会选择 shard 级别的元数据信息,并且构建内容路由表。在集群启动的时候,所有的 shard 都是未分配的,allocation 会决定哪个 shard 被分配到哪个节点,并且把这个关系记录下来写入到内容路由表。
我们知道 ES 的分片分为主分片和副分片,所以在分配的时候会先选择出主分片,然后再选择出副分配。
为了保证数据的可靠性,在启动的时候主分片需要执行 recovery 流程来恢复没有来得及刷盘的数据。而副分片除了要恢复没有刷盘的数据外,还要恢复主分片已经写入但是副分片还没有写入的数据来保证数据的一致性。
集群的启动主要就是上述的几大流程,经过这些流程后,一般来说集群就可以提供对外的服务了。
通过 Elasticsearch 这个类,系统进行了命令行参数解析与配置加载。通过 Bootstrap 类进行了资源检查与本地资源初始化。最后实例化了 Node 类,其负责加载各个模块和插件、创建线程池、创建 keepalive 线程等工作,在 Node.start 方法中获取了各个服务的实例并且调用它们的 start 方法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。