发现和集群形成(Discovery and cluster formation)

2019-09-09 00:13发布

(一)发现(Discovery 定义

发现(Discovery )是群集形成模块找到用于形成群集的其他节点的过程。

当启动Elasticsearch节点或某个节点认为主节点出现故障时执行发现过程直到找到主节点或选择了新的主节点时。

发现(Discovery )过程从一个或多个种子主机提供程序种子地址 列表开始,以及最新已知群集中任何符合主节点的地址。该过程分两个阶段进行:首先,每个节点通过连接到每个种子地址并尝试识别它所连接的节点。其次,它与远程节点共享所有已知的符合主节点资格的列表,并且远程节点也会分享它自己的符合主节点资格的列表。然后,该节点将连接它刚刚发现的所有新节点等等。

如果节点不符合主节点,则它将继续下一个节点,直到它发现了选定的主节点。如果未发现选定的主节点,则节点将在discovery.find_peers_interval(默认为1s)之后重试。

如果该节点符合主节点,则它将继续此发现过程,直到它发现了一个选定的主节点,或者它已发现满足完成选举所需要的无主节点的符合主节点(masterless master-eligible)。否则将在discovery.find_peers_interval(默认为1s)之后重试

(二)种子主机提供者(seed hosts provider )

默认情况下,有两种配置种子节点列表:基于设置和基于文件的种子主机提供程序。通过发现插件可以扩展为支持云环境和其他形式的seed hosts providers。使用discovery.seed_providers 设置配置seed hosts providers,默认为基于设置的主机提供程序。此设置接受不同提供程序的列表,允许您使用多种方法查找群集的种子主机。

每个seed hosts provider 都会生成种子节点的IP地址或主机名。如果它返回任何主机名,则使用DNS解析为IP地址。如果主机名解析为多个IP地址,则Elasticsearch会尝试在所有这些地址中查找种子节点。如果没有配置节点的TCP端口,那么它将隐式使用由transport.profiles.default.port给定的端口范围中的第一个端口,如transport.profiles.default.port未设置则使用transport.port。并发查找的数量由discovery.seed_resolver.max_concurrent_resolvers默认值控制 10,每次查找的超时由discovery.seed_resolver.timeout 默认值控制5s。请注意,DNS查找受JVM DNS缓存的约束 。

(三)基于设置的seed hosts provider

基于设置的seed hosts provider使用节点设置来配置seed nodes地址的静态列表。这些地址可以作为主机名或IP地址给出; 指定为主机名的主机在每轮发现期间解析为IP地址。

使用discovery.seed_hosts 静态设置设置主机列表。例如:

discovery.seed_hosts:
   - 192.168.1.10:9300
   - 192.168.1.11 
   - seeds.mydomain.com 
如果未指定,端口将默认为transport.profiles.default.porttransport.port
如果主机名解析为多个IP地址,Elasticsearch将尝试连接到每个已解析的地址。

(四)基于文件的seed hosts provider

基于文件的seed hosts provider通过外部文件配置主机列表。该文件如果有更改Elasticsearch会重新加载此文件,以便种子节点列表可以动态更改,而无需重新启动每个节点。

elasticsearch.yml文件中按如下方式配置:

discovery.seed_providers: file

创建文件$ES_PATH_CONF/unicast_hosts.txt。每次对文件进行更改时,Elasticsearch都会使用新的主机列表。

请注意,基于文件的发现插件会增加单播主机列表(unicast hosts list ) :如果elasticsearch.yml存在有效的种子地址 (discovery.seed_hosts配置的地址)则Elasticsearch除了使用discovery.seed_hosts提供的地址外,还使用unicast_hosts.txt里面配置的地址。

unicast_hosts.txt文件每行包含一个节点。每个节点由主机(主机名或IP地址)和可选的传输端口号组成。如果未指定端口号,则Elasticsearch将隐式使用由transport.profiles.default.port给定的端口范围中的第一个端口 ,如果transport.profiles.default.port未设置则使用transport.port

例如,这是一个unicast_hosts.txt具有四个参与发现的节点的集群的示例,其中一些节点未在默认端口上运行:

10.10.10.5
10.10.10.6:9305
10.10.10.5:10005
# an IPv6 address
[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:9301

允许主机名而不是IP地址,主机名将通过DNS解析。

您还可以为此文件添加注释。所有注释必须以#号开头。

(五)基于仲裁的决策制定

选择主节点和更改群集状态是符合主节点的节点必须协同执行的两个基本任务。即使某些节点出现故障,这些活动也必须能够稳健地工作。Elasticsearch通过考虑每个操作成功接收来自仲裁的响应来实现这种稳健性,仲裁是群集中符合主节点的节点的子集。仅要求节点的子集进行响应的优点是,这意味着某些节点可能会在不阻止群集进展的情况下发生故障。

Elasticsearch允许您向正在运行的集群添加和删除符合主节点的节点。在许多情况下,您可以通过根据需要启动或停止节点来完成此操作。请参阅添加和删​​除节点

在添加或删除节点时,Elasticsearch通过更新群集的投票配置来维持最佳的容错级别,该配置是一组符合主节点的节点,每个节点会在做出诸如选择新主节点或提交新群集状态等决策时有重要影响。只有在投票配置中超过一半的节点响应后才能做出决定。

要确保群集仍然可用,您不能同时停止投票配置中的一半及以上节点。只要有超过一半的投票节点可用,群集仍然可以正常工作。这意味着如果有三个或四个符合主节点的节点,则群集可以容忍其中一个节点不可用。如果有两个或更少的符合主节点的节点,则它们必须全部保持可用。

在节点加入或离开群集后,选定的主节点必须发出群集状态更新,以调整投票配置,这可能需要一点时间才能完成。在从群集中删除更多节点之前,等待此调整完成非常重要。

群集维护,滚动重新启动和迁移

许多群集维护任务涉及临时关闭和重启一个或多个节点。默认情况下,如果其中一个符合主节点的节点脱机(例如在 rolling restart期间),则Elasticsearch可以保持可用 。此外,如果多个节点停止然后再次启动,那么它将自动恢复,例如在 full cluster restart期间 。在这些情况下,无需采取任何进一步操作。

(六)投票配置

每个Elasticsearch集群都有一个投票配置,这是一组符合 主节点的节点,每个节点都会影响到诸如选择新主节点或提交新集群状态等决策。只有在投票配置中的大多数(超过一半)节点响应后才能做出决策。

在节点加入或离开集群后,Elasticsearch会通过自动对投票配置进行相应更改,以确保集群尽可能具有弹性。在从群集中删除更多节点之前,请务必等待此调整完成。请参阅添加和删​​除节点

当前的投票配置存储在群集状态中,因此您可以按如下方式检查其当前内容:

GET /_cluster/state?filter_path=metadata.cluster_coordination.last_committed_config

(七)偶数个符合主节点的节点

群集中通常应该有奇数个符合主节点的节点。如果存在偶数,则Elasticsearch将其中一个退出投票配置以确保其具有奇数大小。

例如,如果群集中有四个符合主节点的节点,并且投票配置包含所有节点,则任何基于仲裁的决策都需要至少三个投票。这种情况意味着群集只能容忍丢失一个符合主节点的节点。如果此群集被分成两个相等的一半,则两个都不包含三个符合主节点的节点,并且群集将无法取得任何进展。但是,如果投票配置仅包含四个符合主节点的节点中的三个,则群集仍然完全容忍丢失一个节点,但基于仲裁的决策需要来自三个投票节点中的两个的投票。如果偶数分割,一半将包含三个投票节点中的两个,因此一半将保持可用。

(八)设置初始投票配置

当一个全新的集群首次启动时,它必须选择其第一个主节点。要进行此选举,需要知道投票算数的符合主节点的节点集。此初始投票配置称为引导配置,并在 集群引导过程中设置

重要的是,引导配置确切地确定哪些节点应该在第一次选举中投票。仅为每个节点配置期望群集中应该有多少个节点是不够的。同样重要的是要注意,引导配置必须来自群集外部:群集没有安全的方法来自行正确地确定引导配置。????

如果未正确设置引导程序配置,则在启动全新集群时,可能会意外形成两个多带带的集群而不是一个集群。这种情况可能会导致数据丢失。

初始仲裁仅在整个群集启动时才需要。加入已建立集群的新节点可以安全地从选定的主节点获取所需的所有信息。已经加入群集的节点将在磁盘重新启动时将所有必需的信息存储到磁盘。

(九)引导集群

首次启动Elasticsearch集群需要在集群中的一个或多个符合主节点的节点上显式定义初始的符合主节点的节点集。这称为群集自举。这仅在群集首次启动时才需要:已加入群集的节点将此信息存储在其数据文件夹中,以便在完全群集重新启动时,或者加入正在运行的群集的新启动节点从集群的主节点获取此信息。

初始的一组符合主节点的节点在cluster.initial_master_nodes设置中定义 。可以使用以下几种方式定义:

  • 该节点的节点名称。
  • node.name未设置则节点的主机名 ,因为node.name默认为节点的主机名。您必须使用完全限定的主机名或裸主机名,如主机名是www.exsampl.com,则该设置必须也是www.exsampl.com
  • 节点的发布地址的IP地址。
  • 节点的发布地址的IP地址和端口IP:PORT

启动符合主节点的节点时,可以在命令行或elasticsearch.yml文件中提供此设置。群集形成后,不再需要此设置,将被忽略。它不需要在不符合主节点的节点上设置,也不需要在启动加入现有集群的符合主节点的节点上设置。请注意,符合条件的节点应使用在重新启动后永久的保留在存储。如果找不到它们,并且cluster.initial_master_nodes已设置,并且发生完全群集重新启动,则将形成另一个全新的群集,这可能导致数据丢失。

在技​​术上足以cluster.initial_master_nodes在集群中设置一个符合主节点的节点,并且仅在设置的值中提及该单个节点,但这在集群完全形成之前不提供容错。因此,最好使用至少三个符合主节点的节点进行引导,每个节点都包含一个cluster.initial_master_nodes包含所有三个节点的设置。

您必须在设置cluster.initial_master_nodes它的每个节点上设置相同的节点列表,以确保在引导期间仅形成单个群集,从而避免数据丢失的风险。

对于具有3主资格的节点(与群集节点名称 master-amaster-bmaster-c)的结构将如下所示:

cluster.initial_master_nodes:
  - master-a
  - master-b
  - master-c

与所有节点设置一样,也可以在命令行上指定用于启动Elasticsearch的初始主节点集:

$ bin/elasticsearch -Ecluster.initial_master_nodes=master-a,master-b,master-c

选择群集名称

通过该cluster.name设置,您可以创建多个彼此分离的群集。节点在首次连接时验证它们是否同意其群集名称,并且Elasticsearch将仅从具有相同群集名称的节点形成群集。群集名称的默认值为elasticsearch,但建议更改此值以反映群集的逻辑名称。

在开发模式的自动引导

如果群集使用完全默认配置运行,则它将基于可在启动后的短时间内发现在同一主机上运行的节点自动引导群集。这意味着默认情况下,可以在一台计算机上启动多个节点,并使它们自动形成一个对开发环境和实验非常有用的集群。但是,由于节点可能并不总是能够足够快地成功发现,因此无法依赖此自动引导,也无法在生产部署中使用。

如果配置了以下任何设置,则不会进行自动引导,您必须配置cluster.initial_master_nodes

  • discovery.seed_providers
  • discovery.seed_hosts
  • cluster.initial_master_nodes

如果在未配置这些设置的情况下启动Elasticsearch节点,则它将以开发模式启动并自动引导至新集群。如果您在不同的主机上启动某些Elasticsearch节点,则默认情况下它们不会相互发现,并且会在每个主机上形成不同的群集。即使您随后尝试将所有节点配置到单个群集中,Elasticsearch也不会在它们形成后将多带带的群集合并在一起。这是因为没有办法将这些多带带的集群合并在一起而没有数据丢失的风险。您可以通过检查GET /每个节点上报告的群集UUID来判断您是否已形成多带带的群集。如果您打算组建一个群集,那么您应该重新开始:

  • 如果您不想丢失任何数据,请拍摄每个单主机群集的快照。请注意,每个群集必须使用自己的快照存储库。
  • 关闭所有节点。
  • 通过删除其数据文件夹的内容完全擦除每个节点 。
  • cluster.initial_master_nodes如上所述配置。
  • 重新启动所有节点并验证它们是否已形成单个群集。
  • 根据需要还原所有快照。

(十)添加和删​​除节点

在添加或删除节点时,Elasticsearch会通过自动更新群集的投票配置来维持最佳的容错级别

建议在群集中拥有少量且固定数量的符合主节点的节点,并通过仅添加和删除不符合主节点的节点来上下扩展群集。但是,在某些情况下,可能需要向群集添加或从群集中删除一些符合主节点的节点。

添加符合主节点的节点

如果要将某些节点添加到群集,只需配置新节点以查找现有群集并启动。Elasticsearch会将新节点添加到投票配置中。

在主节点选举期间或加入现有的已形成集群时,节点会向主节点发送加入请求,以便正式添加到集群。您可以使用该cluster.join.timeout设置配置节点在发送加入群集的请求后等待的时间。它的默认值是30s

删除符合条件的节点

删除符合主节点的节点时,重要的是不要同时删除太多的节点。例如,如果当前有七个符合主节点的节点并且您希望将其减少到三个,不要一次性停止四个节点:这样做只会留下三个节点,这不到一半表决配置,这意味着集群不能采取任何进一步的行动。

更准确地说,如果同时关闭一半或更多符合主节点的节点,则群集通常将变为不可用。如果发生这种情况,则可以通过再次启动已删除的节点使群集重新联机。

只要群集中至少有三个符合主节点的节点,最好一次删除一个节点,从而为群集留出足够的时间来自动调整投票配置并调整故障对新节点集的容差级别。

如果只剩下两个符合主节点的节点,那么两个节点都不能安全删除。要删除其中一个节点,您必须首先通知Elasticsearch它不应该是投票配置的一部分,并且应该将投票权提供给另一个节点。然后添加到投票配置排除列表,这样不会影响其他节点的正常运行。添加到投票配置排除列表的节点仍然可以正常工作,但Elasticsearch会尝试将其从投票配置中删除,因此不再需要投票。重要的是,Elasticsearch永远不会自动将投票排除列表上的节点移回投票配置。一旦排除的节点成功地从投票配置中自动重新配置,在不影响集群主级可用性的情况下关闭它是安全的。可以使用以下命令将节点添加到投票配置排除列表中 投票配置排除 API。例如:

# Add node to voting configuration exclusions list and wait for the system
# to auto-reconfigure the node out of the voting configuration up to the
# default timeout of 30 seconds
POST /_cluster/voting_config_exclusions/node_name

# Add node to voting configuration exclusions list and wait for
# auto-reconfiguration up to one minute
POST /_cluster/voting_config_exclusions/node_name?timeout=1m

应使用节点过滤器代替node_name此处指定应添加到排除列表的 节点。如果对投票配置排除API的调用失败,您可以放心地重试几次。只有成功的响应才能保证节点实际上已从投票配置中删除,并且不会恢复。如果它是从投票配置中删除的活动主节点,那么它将主节点将被处于投票配置中的另一个符合主节点的节点替代。

也可以使用它同时删除多个符合主节点的节点。将多个节点添加到排除列表中时,系统会尝试从投票配置中自动重新配置所有这些节点,从而可以在保持群集可用的同时安全地关闭它们。在上述示例中,将七主节点群集缩小为仅有三个主节点,您可以将四个节点添加到排除列表,等待确认,然后同时关闭它们。

只有在短时间内从群集中删除至少一半符合主节点的节点时,才需要使用表决排除。在删除不符合主节点的节点时不需要它们,在删除少于一半的符合主节点的节点时也不需要它们。

为节点添加排除会在投票配置排除列表中为该节点创建一个条目,系统会自动尝试重新配置投票配置以删除该节点,并防止它在删除后返回到投票配置。当前排除列表存储在群集状态中,可以按如下方式进行检查:

GET /_cluster/state?filter_path=metadata.cluster_coordination.voting_config_exclusions

此列表的大小受cluster.max_voting_config_exclusions 设置限制,默认设置为10。请参阅发现和群集形成设置。由于投票配置排除是持久的并且数量有限,因此必须清除它们。通常,在对群集执行某些维护时会添加排除项,并且应在维护完成时清除排除项。在正常操作中,群集应该没有投票配置排除。

如果某个节点从投票配置中排除,因为它将永久关闭,则可以在关闭该节点并将其从群集中删除后将其排除。如果排除错误,或者只是暂时需要,也可以清除排除项:

# Wait for all the nodes with voting configuration exclusions to be removed from
# the cluster and then remove all the exclusions, allowing any node to return to
# the voting configuration in the future.
DELETE /_cluster/voting_config_exclusions

# Immediately remove all the voting configuration exclusions, allowing any node
# to return to the voting configuration in the future.
DELETE /_cluster/voting_config_exclusions?wait_for_removal=false

(十一)发布集群状态

主节点是群集中唯一可以更改群集状态的节点。主节点一次处理一批群集状态更新操作,计算所需的更改并将更新的群集状态发布到群集中的所有其他节点。每个发布都以主服务器将更新的集群状态广播到集群中的所有节点开始。每个节点都返回确认响应,但尚未应用新接收的集群状态更新。一旦主节点从足够多的符合主节点的节点收集了确认,则称新的集群状态被提交,并且主节点广播另一个消息,指示节点应用现在提交的状态。每个节点都接收此消息,应用更新的集群状态信息,然后将第二个确认发送回主节点。

每个集群状态更新完全发布到所有节点会有一个时间限制。它由cluster.publish.timeout定义默认设置 30s,从发布开始的时间开始计算。如果在提交新集群状态之前达超时,则拒绝集群状态更改,并且主节点认为已失败。开始尝试选举新的主节点。

如果在cluster.publish.timeout时间之内前提交了新的集群状态,则主节点会认为更改已成功。它等待超时,或者直到它收到集群中的每个节点已应用更新集群状态的确认信息,然后开始处理并发布下一个集群状态更新。如果尚未收到某些确认(即某些节点尚未确认它们已应用当前更新),则称这些节点滞后(lagging ),因为它们的群集状态已落后于主节点的最新状态。主节点等待滞后节点再次赶上,使用cluster.follower_lag.timeout设置默认为90s。如果某个节点在此时间内仍未成功应用群集状态更新,则会将其视为已失败并从群集中删除。

群集状态更新通常作为差异发布到先前的群集状态,这减少了发布群集状态更新所需的时间和网络带宽。例如,在仅更新群集状态中索引子集的映射时,只需将这些索引的更新发布到群集中的节点,只要这些节点具有先前的群集状态即可。如果节点缺少先前的群集状态,例如重新加入群集时,主节点将向该节点发布完整群集状态。

Elasticsearch是一个基于对等的系统,其中节点直接相互通信。高吞吐量API(索引,删除,搜索)通常不与主节点交互。主节点的职责是维护全局集群状态,并在节点加入或离开集群时重新分配分片。每次更改集群状态时,新状态将发布到集群中的所有节点。

(十二)集群故障检测

选定的主节点定期检查群集中的每个节点,以确保它们仍然连接且健康。群集中的每个节点还会定期检查所选主节点的运行状况。这些检查分别称为跟随检查领导检查(follower checks and leader checks

Elasticsearch允许这些检查偶尔失败或超时而不采取任何操作。只有在多次连续检查失败后才会将节点视为故障。您可以使用cluster.fault_detection.*控制故障检测行为 。

(十三)发现和集群形成设置

发现和群集形成受以下设置影响:

discovery.seed_hosts

提供群集中符合主节点的节点的列表。每个值都具有格式host:porthostport默认为设置 transport.profiles.default.port。请注意,必须将IPv6主机置于括号内。默认值为["127.0.0.1", "[::1]"]。见discovery.seed_hosts。此设置旧版本称为discovery.zen.ping.unicast.hosts。它的旧名称已弃用但仍继续工作以保持向后兼容性。将来的版本将删除对旧名称的支持。

discovery.seed_providers

指定 要使用哪种类型的种子主机提供程序来获取用于启动发现过程的种子节点的地址。默认情况下,它是 基于设置的种子主机提供程序。此设置旧版本称为discovery.zen.hosts_provider。它的旧名称已弃用但仍继续工作以保持向后兼容性。将来的版本将删除对旧名称的支持。

discovery.type

指定Elasticsearch是否应构成多节点集群。默认情况下,Elasticsearch在形成群集时会发现其他节点,并允许其他节点稍后加入群集。如果discovery.type设置为single-node,则Elasticsearch形成单节点集群。有关何时可以使用此设置的详细信息,请参阅单节点发现

cluster.initial_master_nodes

设置全新集群中符合主节点的初始节点集。默认情况下,此列表为空,表示此节点希望加入已经建立的集群。见cluster.initial_master_nodes


登录 后发表评论
0条评论
还没有人评论过~