elasticsearch-node

编辑

elasticsearch-node 命令使您能够在节点关闭时对其执行某些不安全的操作。此命令允许您调整节点的角色,不安全地编辑集群设置,并可能在灾难后恢复一些数据,或者即使与磁盘上的数据不兼容也能启动节点。

概要

编辑
bin/elasticsearch-node repurpose|unsafe-bootstrap|detach-cluster|override-version
  [-E <KeyValuePair>]
  [-h, --help] ([-s, --silent] | [-v, --verbose])

描述

编辑

此工具具有多种模式

  • 如果节点以前是数据节点有资格成为主节点的节点,但已被重新用于不具有这些角色中的一个或另一个角色,则可以使用 elasticsearch-node repurpose 从节点中删除不需要的数据。
  • 如果集群状态包含阻止集群形成的冲突设置,则可以使用 elasticsearch-node remove-settings 从集群状态中删除持久设置。
  • 如果集群状态包含阻止集群形成的冲突索引设置,则可以使用 elasticsearch-node remove-index-settings 从集群状态中删除索引设置。
  • 如果集群状态包含阻止集群状态加载的损坏元数据,则可以使用 elasticsearch-node remove-customs 从集群状态中删除自定义元数据。
  • elasticsearch-node unsafe-bootstrap 可用于执行不安全的集群引导。它强制其中一个节点使用其本地集群元数据副本自行形成一个全新的集群。
  • elasticsearch-node detach-cluster 使您能够将节点从一个集群移动到另一个集群。这可以用于将节点移动到使用 elasticsearch-node unsafe-bootstrap 命令创建的新集群中。如果无法进行不安全的集群引导,它还可以使您能够将节点移动到全新的集群中。
  • 即使数据路径中的数据是由不兼容的 Elasticsearch 版本写入的,elasticsearch-node override-version 也可以使您启动节点。有时,这可能允许您降级到早期版本的 Elasticsearch。

JVM 选项

编辑

CLI 工具以 64MB 的堆运行。对于大多数工具,此值都很好。但是,如果需要,可以通过设置 CLI_JAVA_OPTS 环境变量来覆盖此值。例如,以下代码将 elasticsearch-node 工具使用的堆大小增加到 1GB。

export CLI_JAVA_OPTS="-Xmx1g"
bin/elasticsearch-node ...

更改节点的角色

编辑

在某些情况下,您可能希望在不遵循适当的重新利用过程的情况下重新利用节点。elasticsearch-node repurpose 工具允许您删除任何多余的磁盘数据,并在重新利用节点后启动它。

预期用途是

  • 停止节点
  • 通过根据需要设置 node.roles 来更新 elasticsearch.yml
  • 在节点上运行 elasticsearch-node repurpose
  • 启动节点

如果在没有 data 角色且具有 master 角色的节点上运行 elasticsearch-node repurpose,则它将删除该节点上任何剩余的分片数据,但它将保留索引和集群元数据。如果在没有 datamaster 角色的节点上运行 elasticsearch-node repurpose,则它将删除任何剩余的分片数据和索引元数据,但它将保留集群元数据。

如果所包含的数据在集群中的其他节点上不可用,则运行此命令可能会导致提到的索引数据丢失。仅当您理解并接受可能的后果,并且仅在确定无法干净地重新利用节点后才运行此工具。

该工具提供了要删除的数据的摘要,并在进行任何更改之前要求确认。您可以通过传递详细(-v)选项来获取有关受影响的索引和分片的详细信息。

删除持久集群设置

编辑

在某些情况下,节点可能包含阻止集群形成的持久集群设置。由于集群无法形成,因此无法使用集群更新设置 API 删除这些设置。

elasticsearch-node remove-settings 工具允许您从磁盘集群状态中强制删除这些持久设置。该工具将应删除的设置列表作为参数,并且还支持通配符模式。

预期用途是

  • 停止节点
  • 在节点上运行 elasticsearch-node remove-settings name-of-setting-to-remove
  • 对所有其他有资格成为主节点的节点重复执行
  • 启动节点

删除索引设置

编辑

在某些情况下,索引可能包含阻止集群形成的索引设置。由于集群无法形成,因此无法使用更新索引设置 API 删除这些设置。

elasticsearch-node remove-index-settings 工具允许您从磁盘集群状态中强制删除这些索引设置。该工具将应删除的索引设置列表作为参数,并且还支持通配符模式。

预期用途是

  • 停止节点
  • 在节点上运行 elasticsearch-node remove-index-settings name-of-index-setting-to-remove
  • 对所有节点重复执行
  • 启动节点

从集群状态中删除自定义元数据

编辑

在某些情况下,节点可能包含自定义元数据(通常由插件提供),这些元数据会阻止节点启动并从磁盘加载集群。

elasticsearch-node remove-customs 工具允许您强制删除有问题的自定义元数据。该工具将应删除的自定义元数据名称列表作为参数,并且还支持通配符模式。

预期用途是

  • 停止节点
  • 在节点上运行 elasticsearch-node remove-customs name-of-custom-to-remove
  • 对所有其他有资格成为主节点的节点重复执行
  • 启动节点

灾难后恢复数据

编辑

有时,Elasticsearch 节点会暂时停止,可能是因为需要执行某些维护活动,也可能是因为硬件故障。在解决临时情况并重新启动节点后,它将重新加入集群并正常继续运行。根据您的配置,即使一个或多个节点停止,您的集群也可能保持完全可用。

有时,可能无法在节点停止后重新启动它。例如,节点的主机可能存在无法修复的硬件问题。如果集群仍然可用,则可以在另一个主机上启动一个新节点,Elasticsearch 会将此节点添加到集群中,以代替发生故障的节点。

每个节点都将其数据存储在由path.data 设置定义的数据目录中。这意味着,在灾难中,您还可以通过将其数据目录移动到另一个主机来重新启动节点,前提是这些数据目录可以从故障主机中恢复。

Elasticsearch 需要来自大多数有资格成为主节点的节点的响应,以便选出主节点并更新集群状态。这意味着,如果您有三个有资格成为主节点的节点,那么即使其中一个节点发生故障,集群也将保持可用。但是,如果三个有资格成为主节点的节点中有两个发生故障,那么集群将不可用,直到至少其中一个节点重新启动。

在极少数情况下,可能无法重新启动足够多的节点来恢复集群的可用性。如果发生此类灾难,您应该从最近的快照构建一个新集群,并重新导入自快照拍摄以来摄取的任何数据。

但是,如果灾难足够严重,则可能也无法从最近的快照中恢复。不幸的是,在这种情况下,没有不冒数据丢失风险的前进道路,但是可以使用 elasticsearch-node 工具构建一个包含失败集群中某些数据的新集群。

绕过版本检查

编辑

Elasticsearch 写入磁盘的数据旨在由当前版本和一组有限的未来版本读取。它通常无法由旧版本读取,也无法由比主要版本新一个以上的版本读取。存储在磁盘上的数据包括写入数据的节点的版本,Elasticsearch 在启动时会检查它是否与此版本兼容。

在极少数情况下,可能需要绕过此检查并使用不兼容版本写入的数据启动 Elasticsearch 节点。如果存储数据的格式已更改,则此操作可能无法正常工作,并且这是一个冒险的过程,因为格式可能会以 Elasticsearch 可能误解的方式更改,从而导致数据丢失。

要绕过此检查,您可以使用 elasticsearch-node override-version 工具将数据路径中存储的版本号覆盖为当前版本,从而使 Elasticsearch 认为它与磁盘上的数据兼容。

不安全的集群引导
编辑

如果至少还有一个符合主节点资格的节点,但无法重启其中多数节点,则 elasticsearch-node unsafe-bootstrap 命令将不安全地覆盖集群的投票配置,就像执行另一个集群引导过程一样。然后,目标节点可以使用本地持有的集群元数据自行形成一个新的集群。

这些步骤可能导致任意的数据丢失,因为目标节点可能没有最新的集群元数据,并且此过时的元数据可能导致无法使用集群中的部分或全部索引。

由于不安全的引导过程会形成一个包含单个节点的新集群,因此一旦您运行了该命令,就必须使用 elasticsearch-node detach-cluster 工具将失败集群中任何其他幸存节点迁移到此新集群中。

当您运行 elasticsearch-node unsafe-bootstrap 工具时,它会分析节点的状态,并在采取任何操作之前请求确认。在请求确认之前,它会报告运行该工具的节点上的集群状态的任期和版本,如下所示:

Current node cluster state (term, version) pair is (4, 12)

如果您可以选择在哪个节点上运行此工具,则应选择任期尽可能大的节点。如果存在多个任期相同的节点,则选择版本最大的节点。此信息标识具有最新鲜集群状态的节点,从而最大限度地减少可能丢失的数据量。例如,如果第一个节点报告 (4, 12),而第二个节点报告 (5, 3),则首选第二个节点,因为其任期较大。但是,如果第二个节点报告 (3, 17),则首选第一个节点,因为其任期较大。如果第二个节点报告 (4, 10),则其任期与第一个节点相同,但版本较小,因此首选第一个节点。

运行此命令可能导致任意的数据丢失。只有当您理解并接受可能的后果,并且已尽一切其他恢复集群的可能性时,才运行此工具。

使用此工具的操作顺序如下:

  1. 确保您确实失去了对集群中至少一半符合主节点资格的节点的访问权限,并且无法通过将其数据路径移动到健康的硬件来修复或恢复它们。
  2. 停止所有剩余的节点。
  3. 如上所述,选择一个剩余的符合主节点资格的节点作为新的当选主节点。
  4. 在此节点上,运行如下所示的 elasticsearch-node unsafe-bootstrap 命令。验证该工具是否报告了 Master node was successfully bootstrapped
  5. 启动此节点,并验证它是否被选为主节点。
  6. 在集群中的每个其他节点上,运行如下所述的 elasticsearch-node detach-cluster 工具
  7. 启动所有其他节点,并验证每个节点是否都加入了集群。
  8. 调查集群中的数据,以发现在此过程中是否有任何数据丢失。

当您运行该工具时,它将确保正在用于引导集群的节点未运行。重要的是,在运行此工具时,所有其他符合主节点资格的节点也都已停止,但该工具不会检查这一点。

消息 Master node was successfully bootstrapped 并不表示没有数据丢失,它只是表示该工具能够完成其工作。

从集群分离节点
编辑

节点在集群之间移动是不安全的,因为不同的集群具有完全不同的集群元数据。没有安全的方法可以将两个集群的元数据合并在一起。

为了防止意外加入错误的集群,每个集群在首次启动时都会创建一个唯一的标识符,称为 *集群 UUID*。每个节点都会记录其集群的 UUID,并拒绝加入具有不同 UUID 的集群。

但是,如果节点的集群永久失败,则可能需要尝试将其移动到新集群中。elasticsearch-node detach-cluster 命令允许您通过重置节点的集群 UUID 来将其从集群中分离出来。然后,它可以加入具有不同 UUID 的另一个集群。

例如,在不安全地引导集群后,您将需要将所有其他幸存节点从其旧集群中分离出来,以便它们可以加入新的、不安全引导的集群。

只有当至少有一个幸存的符合主节点资格的节点时,才有可能进行不安全的集群引导。如果没有剩余的符合主节点资格的节点,则集群元数据将完全丢失。但是,各个数据节点也包含与其分片对应的索引元数据的副本。有时,这允许新集群将这些分片作为悬挂索引导入。在集群中所有符合主节点资格的节点丢失后,有时可以通过创建一个新集群,然后使用 elasticsearch-node detach-cluster 命令将任何幸存的节点移动到此新集群中来恢复某些索引。一旦新集群完全形成,请使用悬挂索引 API 来列出、导入或删除任何悬挂索引。

导入悬挂索引时存在数据丢失的风险,因为数据节点可能没有最新版本的索引元数据,并且没有任何关于哪些分片副本是同步的信息。这意味着可能会选择过时的分片副本作为主副本,并且某些分片可能与导入的映射不兼容。

执行此命令可能导致任意的数据丢失。只有当您理解并接受可能的后果,并且已尽一切其他恢复集群的可能性时,才运行此工具。

使用此工具的操作顺序如下:

  1. 确保您确实失去了对集群中每个符合主节点资格的节点的访问权限,并且无法通过将其数据路径移动到健康的硬件来修复或恢复它们。
  2. 启动一个新集群,并验证它是否健康。此集群可能包含一个或多个全新的符合主节点资格的节点,或者可能是一个如上所述形成的不安全引导的集群。
  3. 停止所有剩余的数据节点。
  4. 在每个数据节点上,运行如下所示的 elasticsearch-node detach-cluster 工具。验证该工具是否报告了 Node was successfully detached from the cluster
  5. 如有必要,请配置每个数据节点以发现新集群
  6. 启动每个数据节点,并验证它是否已加入新集群。
  7. 等待所有恢复操作完成,并调查集群中的数据,以发现在此过程中是否有任何数据丢失。使用悬挂索引 API 来列出、导入或删除任何悬挂索引。

消息 Node was successfully detached from the cluster 并不表示没有数据丢失,它只是表示该工具能够完成其工作。

参数

编辑
repurpose
当节点的角色更改时,删除多余的数据。
unsafe-bootstrap
指定将此节点不安全地引导为一个新的单节点集群。
detach-cluster
指定将此节点从其集群中不安全地分离出来,以便它可以加入不同的集群。
override-version
覆盖存储在数据路径中的版本号,以便节点可以在与磁盘数据不兼容的情况下启动。
remove-settings
强制从磁盘上的集群状态中删除提供的持久集群设置。
-E <KeyValuePair>
配置一个设置。
-h, --help
返回所有命令参数。
-s, --silent
显示最少的输出。
-v, --verbose
显示详细输出。

示例

编辑

将节点重新用作专用主节点

编辑

在此示例中,将以前的数据节点重新用作专用主节点。首先,在其 elasticsearch.yml 配置文件中将节点的设置更新为 node.roles: [ "master" ]。然后,运行 elasticsearch-node repurpose 命令以查找和删除多余的分片数据

node$ ./bin/elasticsearch-node repurpose

    WARNING: Elasticsearch MUST be stopped before running this tool.

Found 2 shards in 2 indices to clean up
Use -v to see list of paths and indices affected
Node is being re-purposed as master and no-data. Clean-up of shard data will be performed.
Do you want to proceed?
Confirm [y/N] y
Node successfully repurposed to master and no-data.

将节点重新用作仅协调节点

编辑

在此示例中,将以前保存数据的节点重新用作仅协调节点。首先,在其 elasticsearch.yml 配置文件中将节点的设置更新为 node.roles: []。然后,运行 elasticsearch-node repurpose 命令以查找和删除多余的分片数据和索引元数据

node$./bin/elasticsearch-node repurpose

    WARNING: Elasticsearch MUST be stopped before running this tool.

Found 2 indices (2 shards and 2 index meta data) to clean up
Use -v to see list of paths and indices affected
Node is being re-purposed as no-master and no-data. Clean-up of index data will be performed.
Do you want to proceed?
Confirm [y/N] y
Node successfully repurposed to no-master and no-data.

删除持久集群设置

编辑

如果您的节点包含阻止集群形成的持久集群设置,即无法使用集群更新设置 API 删除,则可以运行以下命令来删除一个或多个集群设置。

node$ ./bin/elasticsearch-node remove-settings xpack.monitoring.exporters.my_exporter.host

    WARNING: Elasticsearch MUST be stopped before running this tool.

The following settings will be removed:
xpack.monitoring.exporters.my_exporter.host: "10.1.2.3"

You should only run this tool if you have incompatible settings in the
cluster state that prevent the cluster from forming.
This tool can cause data loss and its use should be your last resort.

Do you want to proceed?

Confirm [y/N] y

Settings were successfully removed from the cluster state

您还可以使用通配符删除多个设置,例如使用

node$ ./bin/elasticsearch-node remove-settings xpack.monitoring.*

删除索引设置

编辑

如果您的索引包含阻止集群形成的索引设置,则可以运行以下命令来删除一个或多个索引设置。

node$ ./bin/elasticsearch-node remove-index-settings index.my_plugin.foo

    WARNING: Elasticsearch MUST be stopped before running this tool.

You should only run this tool if you have incompatible index settings in the
cluster state that prevent the cluster from forming.
This tool can cause data loss and its use should be your last resort.

Do you want to proceed?

Confirm [y/N] y

Index settings were successfully removed from the cluster state

您还可以使用通配符删除多个索引设置,例如使用

node$ ./bin/elasticsearch-node remove-index-settings index.my_plugin.*

从集群状态中删除自定义元数据

编辑

如果磁盘上的集群状态包含阻止节点启动和加载集群状态的自定义元数据,则可以运行以下命令来删除此自定义元数据。

node$ ./bin/elasticsearch-node remove-customs snapshot_lifecycle

    WARNING: Elasticsearch MUST be stopped before running this tool.

The following customs will be removed:
snapshot_lifecycle

You should only run this tool if you have broken custom metadata in the
cluster state that prevents the cluster state from being loaded.
This tool can cause data loss and its use should be your last resort.

Do you want to proceed?

Confirm [y/N] y

Customs were successfully removed from the cluster state

不安全的集群引导

编辑

假设你的集群有五个有资格成为主节点的节点,你永久失去了其中三个,只剩下两个节点。

  • 在第一个剩余节点上运行该工具,但在确认步骤中回答 n
node_1$ ./bin/elasticsearch-node unsafe-bootstrap

    WARNING: Elasticsearch MUST be stopped before running this tool.

Current node cluster state (term, version) pair is (4, 12)

You should only run this tool if you have permanently lost half or more
of the master-eligible nodes in this cluster, and you cannot restore the
cluster from a snapshot. This tool can cause arbitrary data loss and its
use should be your last resort. If you have multiple surviving master
eligible nodes, you should run this tool on the node with the highest
cluster state (term, version) pair.

Do you want to proceed?

Confirm [y/N] n
  • 在第二个剩余节点上运行该工具,并在确认步骤中再次回答 n
node_2$ ./bin/elasticsearch-node unsafe-bootstrap

    WARNING: Elasticsearch MUST be stopped before running this tool.

Current node cluster state (term, version) pair is (5, 3)

You should only run this tool if you have permanently lost half or more
of the master-eligible nodes in this cluster, and you cannot restore the
cluster from a snapshot. This tool can cause arbitrary data loss and its
use should be your last resort. If you have multiple surviving master
eligible nodes, you should run this tool on the node with the highest
cluster state (term, version) pair.

Do you want to proceed?

Confirm [y/N] n
  • 由于第二个节点具有更大的任期,它具有更新的集群状态,因此最好使用此节点不安全地引导集群。
node_2$ ./bin/elasticsearch-node unsafe-bootstrap

    WARNING: Elasticsearch MUST be stopped before running this tool.

Current node cluster state (term, version) pair is (5, 3)

You should only run this tool if you have permanently lost half or more
of the master-eligible nodes in this cluster, and you cannot restore the
cluster from a snapshot. This tool can cause arbitrary data loss and its
use should be your last resort. If you have multiple surviving master
eligible nodes, you should run this tool on the node with the highest
cluster state (term, version) pair.

Do you want to proceed?

Confirm [y/N] y
Master node was successfully bootstrapped

将节点从其集群中分离

编辑

在不安全地引导新集群后,运行 elasticsearch-node detach-cluster 命令以将所有剩余节点从失败的集群中分离,以便它们可以加入新集群。

node_3$ ./bin/elasticsearch-node detach-cluster

    WARNING: Elasticsearch MUST be stopped before running this tool.

You should only run this tool if you have permanently lost all of the
master-eligible nodes in this cluster and you cannot restore the cluster
from a snapshot, or you have already unsafely bootstrapped a new cluster
by running `elasticsearch-node unsafe-bootstrap` on a master-eligible
node that belonged to the same cluster as this node. This tool can cause
arbitrary data loss and its use should be your last resort.

Do you want to proceed?

Confirm [y/N] y
Node was successfully detached from the cluster

绕过版本检查

编辑

运行 elasticsearch-node override-version 命令来覆盖数据路径中存储的版本,以便节点可以启动,即使它与数据路径中存储的数据不兼容。

node$ ./bin/elasticsearch-node override-version

    WARNING: Elasticsearch MUST be stopped before running this tool.

This data path was last written by Elasticsearch version [x.x.x] and may no
longer be compatible with Elasticsearch version [y.y.y]. This tool will bypass
this compatibility check, allowing a version [y.y.y] node to start on this data
path, but a version [y.y.y] node may not be able to read this data or may read
it incorrectly leading to data loss.

You should not use this tool. Instead, continue to use a version [x.x.x] node
on this data path. If necessary, you can use reindex-from-remote to copy the
data from here into an older cluster.

Do you want to proceed?

Confirm [y/N] y
Successfully overwrote this node's metadata to bypass its version compatibility checks.