暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ElasticSearch介绍-Discover模块(一)

阿拉丁总舵 2020-01-15
2425


本篇是es的discover模块介绍,discover组件是es的最核心最基础的组件之一,提供节点发现,master选举,故障检测能力。


ElasticSearch属于无中心化分布式存储检索系统,而实现无中心化分布式的核心之一则是如何自动发现集群中的节点以及内部如何进行Master自选举。这正是Discover模块的定位。 Discover模块属于ElasticSearch的最基础最核心的模块之一。

Discover模块介绍将分为两部分:

1Discover模块的总体结构、通用配置解析、以及扩展点介绍。此部分重在了解作为业务方,如何扩展实现自己的Discover插件。

2Discover模块的业务,也就是具体的ZenDiscoverCoordinator。此部分重在理解ES是如何进行节点发现,如何选举,如何故障检测的。:

1: 总体结构

上图,所谓Outer extension的表示暴露给第三方扩展的,也就是存在与ESplugin模块中的。ESplugin模块包含了所有ES暴露给第三方的扩展点,以及插件的生命周期管理。

Inner extension表示的是内部的扩展性,给ES内核开发团队的用于扩展ES能力的扩展点。例如ZenDiscoverCoordinator都是内部的扩展实现。

Discover模块总体结构如上图,Discover模块骨架重在提供开放性,一切具体实现均为插件化。

2.    Discover

Discover模块的定义接口,ES是采用模块化构筑的,核心提供模块的生命周期管理,也即是LifecycleComponent


所谓生命周期,即是管理组件的启动,停止,状态,事件传递。ES的组件管理如上图,任何内部组件均需继承或实现LifecycleComponent接口。


对于Discover模块来说,内部又扩展基于不同的方式实现Discover逻辑,内置扩展了两个,分别为ZenDiscoverCoordinator。因此Discover组件则是接口继承方式。再有工厂根据指定的配置决定实例化哪个Discover实例。

3.    SeedHostsProvider

种子节点发现的接口。ES用于发现集群中节点的方式是需要指定初始种子节点,也就是我们之前经常使用到的类如下面的配置:

(注意:新版本7.0之后的配置参数为:discovery.seed_hosts,用以替代discovery.zen.ping.unicast.hosts,过度阶段两者均可二选一使用。)

SeedHostsProvider只提供了一个接口,如下:传入host主机列表,生成通信的地址。

ES内置提供了两种实现方式,分别是基于配置发现种子节点方式:SettingsBasedSeedHostsProvider和基于文件发现的FileBasedSeedHostsProvider

4.    SettingsBasedSeedHostsProvider

ES默认的,也是大部分经常使用的模式,也即是在elasticsearch.yml中指定方式。

那如果elasticsearch.yml中没有指定,则es会如何处理呢?

可见,如果没有指定,则es会提供在回环地址上的默认监听地址集。

至于端口范围,如下图,默认是9300-9400端口范围,且同一个地址只允许最大绑定六个端口。也就是说,如果es是单机上多实例,则最多六个实例。当然也可以自定义端口范围,此时需要在elasticsearch.yml中设置transport.profiile属性。

5.    FileBasedSeedHostsProvider

ES内置提供的基于配置文件的方式,而非elasticsearch.yml指定。相当于对外以文件接口允许第三方设置种子节点集。如下可知,第三方可以通过写入到ES配置目录下的unicast_hosts.txt文件来提供种子节点集。

6.    ElectionStrategy

自定义选举策略扩展点。ES内置的Discover实现,如ZenDisocover,其通过种子节点发现集群内部所有节点,并完成Master选举,之后进行Master和其它节点的故障检测,而Master选举则是基于投票进行,每个节点投票出自认为的最佳节点为Master节点,当投票数超过大多数的时候,则确定Master角色。那么ElectionStrategy则作用于Master选举的时候,允许第三方扩展,来影响Master选举行为。具体来说是限制选举的投票人数。此部分允许第三方扩展。

扩展方提供继承自抽象类ElectionStrategy的的实现类,并在DiscoverPlugin插件中实现getElectionStrategies接口。同时在elasticsearch.yml中配置cluster.election.strategy参数,制定的值即为getElectionStrategies接口返回MapKey。也即是策略的标志。

7.    DiscoverPlugin

此为Discover组件对外暴露的扩展插件接口,其采用封装模式,将上述种子发现插件和选举策略插件封装在一个接口中并对外提供扩展。这样一来,对于第三方,只需要实现DiscoverPlugin接口即可完成Discover组件的扩展定制。ES内置的第三方扩展实现有AWSEC2GoogleGCEMicrosoftAzure。其均是从云端节点上的ES集群自动扩容角度出发,提供免配置方式,自动发现种子节点。例如云端ES集群节点单独划分为一个主机组或者打了统一标签,那么插件实现方则基于标签或者主机分组通过云端API获取主机列表。例如EC2的扩展实现:

8.    DiscoveryModule

Discover组件的工厂。其根据elasticsearch.yml的配置生成Discover的实例。

而生成Discover实例所需的选举策略,种子发现器都是基于配置指定以及扩展插件中得来。

从前一篇可知,正是node组件通过DiscoverModule来进行Discover的实例化:

之后在node组件统一拉起Discover,如下。此部分才是真正的Discover业务开始。

9.    自定义配置

本篇介绍的是Discover的总体结构,涉及到的对外配置参数为:

关于Discover部分的业务:如何节点发现,如何Master选举,如何故障检测,将在下一篇详细讲解ZenDiscover的实现。


文章转载自阿拉丁总舵,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论