节点角色
Elastic Stack 自行管理
任何时候您启动一个 Elasticsearch 实例,您都在启动一个节点。 连接节点的集合称为集群。 如果您运行的是单个 Elasticsearch 节点,那么您拥有一个单节点集群。 所有节点都知道集群中的所有其他节点,并且可以将客户端请求转发到相应的节点。
每个节点执行一个或多个角色。 角色控制节点在集群中的行为。
您可以通过在elasticsearch.yml
中设置 node.roles
来定义节点的角色。 如果您设置了 node.roles
,则节点仅分配您指定的角色。 如果您未设置 node.roles
,则节点将被分配以下角色
master
data
data_content
data_hot
data_warm
data_cold
data_frozen
ingest
ml
remote_cluster_client
transform
如果您设置了 node.roles
,请确保您指定集群所需的每个节点角色。 每个集群都需要以下节点角色
master
data_content
和data_hot
或
data
某些 Elastic Stack 功能还需要特定的节点角色
- 跨集群搜索和跨集群复制需要
remote_cluster_client
角色。 - Stack Monitoring 和 Ingest 管道需要
ingest
角色。 - Fleet、Elastic Security 应用程序和转换需要
transform
角色。 使用这些功能的跨集群搜索也需要remote_cluster_client
角色。 - 机器学习功能(例如异常检测)需要
ml
角色。
随着集群的增长,特别是如果您有大型机器学习作业或连续转换,请考虑将专用的主节点候选节点与专用的数据节点、机器学习节点和转换节点分开。
每个数据节点在磁盘上维护以下数据
- 分配给该节点的每个分片的分片数据,
- 与分配给该节点的每个分片对应的索引元数据,以及
- 集群范围的元数据,例如设置和索引模板。
同样,每个主节点候选节点在磁盘上维护以下数据
- 集群中每个索引的索引元数据,以及
- 集群范围的元数据,例如设置和索引模板。
每个节点在启动时都会检查其数据路径的内容。 如果它发现意外数据,它将拒绝启动。 这是为了避免导入不需要的悬挂索引,这可能导致红色集群健康状态。 更准确地说,没有 data
角色的节点如果发现启动时磁盘上有任何分片数据,将拒绝启动;如果既没有 master
角色也没有 data
角色的节点发现启动时磁盘上有任何索引元数据,将拒绝启动。
可以通过调整节点的elasticsearch.yml
文件并重新启动它来更改节点的角色。 这被称为重新调整节点用途。 为了满足上述对意外数据的检查,在启动没有 data
或 master
角色的节点时,您必须执行一些额外的步骤来准备重新调整用途的节点。
- 如果您想通过删除
data
角色来重新调整数据节点的用途,那么您应该首先使用分配过滤器,以安全地将所有分片数据迁移到集群中的其他节点上。 - 如果您想重新调整节点的用途,使其既没有
data
角色也没有master
角色,那么最简单的方法是启动一个全新的节点,该节点具有空的数据路径和所需的角色。 您可能会发现使用分配过滤器首先将分片数据迁移到集群中的其他位置是最安全的。
如果无法按照这些额外的步骤操作,则您可以使用elasticsearch-node repurpose
工具删除阻止节点启动的任何多余数据。
以下是节点可以在集群中执行的角色的列表。 一个节点可以有一个或多个角色。
- 主节点候选节点 (
master
):有资格被选举为主节点的节点,该节点控制集群。 - 数据节点 (
data
,data_content
,data_hot
,data_warm
,data_cold
,data_frozen
):具有多个数据角色之一的节点。 数据节点保存数据并执行与数据相关的操作,例如 CRUD、搜索和聚合。 您可以在集群中使用多个数据角色,以便您可以实现数据层。 - Ingest 节点 (
ingest
):Ingest 节点能够将Ingest 管道应用于文档,以便在索引之前转换和丰富文档。 如果 Ingest 负载很重,那么使用专用的 Ingest 节点,并且不要在具有master
或data
角色的节点中包含ingest
角色是有意义的。 - 远程候选节点 (
remote_cluster_client
):有资格充当远程客户端的节点。 - 机器学习节点 (
ml
):可以运行机器学习功能的节点。 如果要使用机器学习功能,则集群中必须至少有一个机器学习节点。 有关更多信息,请参见机器学习设置和Elastic Stack 中的机器学习。 - Transform 节点 (
transform
):可以执行转换的节点。 如果要使用转换,则集群中必须至少有一个转换节点。 有关更多信息,请参见转换设置和转换数据。
诸如搜索请求或批量索引请求之类的请求可能涉及保存在不同数据节点上的数据。 例如,搜索请求分两个阶段执行,这两个阶段由接收客户端请求的节点(即协调节点)协调。
在分散阶段中,协调节点将请求转发到保存数据的数据节点。 每个数据节点在本地执行请求,并将结果返回给协调节点。 在收集阶段中,协调节点将每个数据节点的结果简化为单个全局结果集。
每个节点都隐式地是一个协调节点。 这意味着 node.roles
设置中具有显式空角色列表的节点将仅充当协调节点,该节点无法禁用。 因此,此类节点需要有足够的内存和 CPU 来处理收集阶段。
主节点负责轻量级的集群范围操作,例如创建或删除索引,跟踪哪些节点是集群的一部分,以及决定将哪些分片分配给哪些节点。 对于集群健康而言,拥有一个稳定的主节点非常重要。
任何不是仅投票节点的主节点候选节点都可以通过主节点选举过程被选举成为主节点。
主节点必须具有一个 path.data
目录,其内容在重启后保持不变,就像数据节点一样,因为这是存储集群元数据的位置。 集群元数据描述了如何读取存储在数据节点上的数据,因此如果它丢失了,则无法读取存储在数据节点上的数据。
对于集群的健康而言,被选举的主节点拥有履行其职责所需的资源非常重要。 如果被选举的主节点超载了其他任务,那么集群将无法良好运行。 避免使用其他任务使主节点超载的最可靠方法是将所有主节点候选节点配置为仅具有 master
角色的专用主节点候选节点,从而使它们可以专注于管理集群。 主节点候选节点仍然也会像协调节点一样,将客户端的请求路由到集群中的其他节点,但是您不应该将专用主节点用于此目的。
如果小型或轻负载的集群的主节点候选节点具有其他角色和职责,则可能可以正常运行,但是一旦您的集群包含超过几个节点,那么通常使用专用主节点候选节点是有意义的。
要创建专用主节点候选节点,请设置
node.roles: [ master ]
仅投票主节点候选节点是参与主节点选举的节点,但不会充当集群的被选举的主节点。 特别是,仅投票节点可以在选举中充当决胜者。
使用术语“主节点候选”来描述仅投票节点似乎令人困惑,因为这样的节点实际上根本没有资格成为主节点。 这种术语是不幸的历史结果:主节点候选节点是参与选举并在集群状态发布期间执行某些任务的节点,而仅投票节点具有相同的职责,即使它们永远无法成为被选举的主节点。
要将有资格成为主节点的节点配置为仅投票节点,请在角色列表中包含 master
和 voting_only
。例如,要创建一个仅投票数据节点
node.roles: [ data, master, voting_only ]
只有具有 master
角色的节点才能标记为具有 voting_only
角色。
高可用性 (HA) 集群至少需要三个有资格成为主节点的节点,其中至少有两个不是仅投票节点。即使其中一个节点发生故障,这样的集群也能够选举出一个主节点。
仅投票的有资格成为主节点的节点也可以在您的集群中承担其他角色。例如,一个节点可以既是数据节点,又是仅投票的有资格成为主节点的节点。专用的仅投票的有资格成为主节点的节点是一个仅投票的有资格成为主节点的节点,它不承担集群中的任何其他角色。要创建一个专用的仅投票的有资格成为主节点的节点,请设置
node.roles: [ master, voting_only ]
由于专用的仅投票节点永远不会充当集群的当选主节点,因此它们可能需要比真正的主节点更少的堆内存和更弱的 CPU。但是,所有有资格成为主节点的节点,包括仅投票节点,都在发布集群状态更新的关键路径上。集群状态更新通常独立于诸如索引或搜索等性能关键型工作负载,但它们参与管理活动,例如索引创建和滚动更新、映射更新以及故障后的恢复。这些活动的性能特征是每个有资格成为主节点的节点上的存储速度,以及当选主节点与集群中其他节点之间的网络互连的可靠性和延迟的函数。因此,您必须确保集群中的节点可用的存储和网络足以满足您的性能目标。
数据节点保存包含您已索引的文档的分片。数据节点处理与数据相关的操作,如 CRUD、搜索和聚合。这些操作是 I/O、内存和 CPU 密集型的。重要的是要监控这些资源,并在它们过载时添加更多的数据节点。
拥有专用数据节点的主要好处是将主节点和数据节点的角色分开。
在多层部署架构中,您可以使用专门的数据角色将数据节点分配给特定的层:data_content
、data_hot
、data_warm
、data_cold
或 data_frozen
。一个节点可以属于多个层。
如果您希望将节点包含在所有层中,或者您的集群不使用多层,则可以使用通用的 data
角色。
集群分片限制阻止每个节点创建超过 1000 个非冻结分片,以及每个专用冻结节点创建 3000 个冻结分片。确保您的集群中有足够数量的每种类型的节点来处理您需要的分片数量。
如果您使用专门的数据角色将节点分配给特定的层,那么您也不应该将其分配给通用的 data
角色。通用的 data
角色优先于专门的数据角色。
通用数据节点包含在所有内容层中。具有通用 data
角色的节点可以承担任何专门的数据节点角色。
要创建一个专用的通用数据节点,请设置
node.roles: [ data ]
内容数据节点是内容层的一部分。存储在内容层中的数据通常是诸如产品目录或文章档案等项目的集合。与时间序列数据不同,内容的价值随着时间的推移保持相对不变,因此将其移动到具有不同性能特征的层是没有意义的。内容数据通常具有较长的数据保留要求,并且您希望能够快速检索项目,无论它们有多旧。
内容层节点通常针对查询性能进行了优化——它们优先考虑处理能力而不是 IO 吞吐量,以便它们可以处理复杂的搜索和聚合并快速返回结果。虽然它们也负责索引,但内容数据的摄取速度通常不如诸如日志和指标等时间序列数据。从弹性的角度来看,此层中的索引应配置为使用一个或多个副本。
内容层是必需的,并且通常与热层部署在同一节点组中。系统索引和不属于数据流的其他索引会自动分配到内容层。
要创建一个专用的内容节点,请设置
node.roles: [ data_content ]
热数据节点是热层的一部分。热层是 Elasticsearch 时间序列数据的入口点,并保存您最新、最常搜索的时间序列数据。热层中的节点需要对读取和写入都很快,这需要更多的硬件资源和更快的存储 (SSD)。为了弹性,热层中的索引应配置为使用一个或多个副本。
热层是必需的。属于数据流的新索引会自动分配到热层。
要创建一个专用的热节点,请设置
node.roles: [ data_hot ]
温数据节点是温层的一部分。一旦时间序列数据的查询频率低于热层中最近索引的数据,就可以将其移动到温层。温层通常保存最近几周的数据。仍然允许更新,但可能不频繁。温层中的节点通常不需要像热层中的节点那样快。为了弹性,温层中的索引应配置为使用一个或多个副本。
要创建一个专用的温节点,请设置
node.roles: [ data_warm ]
冷数据节点是冷层的一部分。当您不再需要定期搜索时间序列数据时,它可以从温层移动到冷层。虽然仍然可以搜索,但此层通常针对较低的存储成本而不是搜索速度进行了优化。
为了更好的存储节省,您可以将 完全挂载的索引 的 可搜索快照 保留在冷层上。与常规索引不同,这些完全挂载的索引不需要副本来保证可靠性。如果发生故障,它们可以从底层快照中恢复数据。需要快照存储库才能在冷层中使用完全挂载的索引。完全挂载的索引是只读的。
或者,您可以使用冷层来存储具有副本的常规索引,而不是使用可搜索快照。这使您可以将旧数据存储在成本较低的硬件上,但与温层相比,不会减少所需的磁盘空间。
要创建一个专用的冷节点,请设置
node.roles: [ data_cold ]
冻结数据节点是冻结层的一部分。一旦数据不再被查询,或者很少被查询,它可能会从冷层移动到冻结层,并在那里度过余生。
冻结层需要一个快照存储库。冻结层使用 部分挂载的索引 来存储和加载来自快照存储库的数据。这减少了本地存储和运营成本,同时仍然允许您搜索冻结的数据。由于 Elasticsearch 有时必须从快照存储库中获取冻结的数据,因此在冻结层上的搜索通常比在冷层上慢。
要创建一个专用的冻结节点,请设置
node.roles: [ data_frozen ]
Ingest 节点可以执行预处理管道,该管道由一个或多个 ingest 处理器组成。根据 ingest 处理器执行的操作类型和所需的资源,拥有专用的 ingest 节点可能是有意义的,这些节点将仅执行此特定任务。
要创建一个专用的 ingest 节点,请设置
node.roles: [ ingest ]
如果您取消处理主节点职责、保存数据和预处理文档的能力,那么您将剩下只能路由请求、处理搜索 reduce 阶段和分发批量索引的协调节点。从本质上讲,仅协调节点的作用类似于智能负载均衡器。
仅协调节点可以通过从数据节点和有资格成为主节点的节点卸载协调节点角色来使大型集群受益。它们加入集群并接收完整的集群状态,就像其他每个节点一样,并且它们使用集群状态将请求直接路由到适当的位置。
向集群添加过多的仅协调节点会增加整个集群的负担,因为当选主节点必须等待来自每个节点的集群状态更新的确认!仅协调节点的好处不应被夸大——数据节点可以愉快地实现相同的目的。
要创建一个专用的协调节点,请设置
node.roles: [ ]
远程节点充当跨集群客户端并连接到 远程集群。连接后,您可以使用 跨集群搜索搜索远程集群。您还可以使用 跨集群复制在集群之间同步数据。
node.roles: [ remote_cluster_client ]
机器学习节点运行作业并处理机器学习 API 请求。有关更多信息,请参阅机器学习设置。
要创建一个专用的机器学习节点,请设置
node.roles: [ ml, remote_cluster_client]
remote_cluster_client
角色是可选的,但强烈建议使用。否则,在机器学习作业或数据源中使用跨集群搜索时,该搜索将失败。如果您在异常检测作业中使用跨集群搜索,则所有有资格成为主节点的节点也需要 remote_cluster_client
角色。否则,数据源无法启动。请参阅远程节点。
转换节点运行转换并处理转换 API 请求。有关更多信息,请参见转换设置。
要创建专用转换节点,请设置
node.roles: [ transform, remote_cluster_client ]
remote_cluster_client
角色是可选的,但强烈建议使用。否则,在转换中使用跨集群搜索时会失败。 请参见远程可用节点。