注册快照仓库

edit

本指南向您展示如何注册快照仓库。快照仓库是用于存储快照的集群外存储位置。在拍摄或恢复快照之前,您必须注册一个仓库。

在本指南中,您将学习如何:

  • 注册一个快照仓库
  • 验证仓库是否正常工作
  • 清理仓库以删除不需要的文件

先决条件

edit
  • 要使用 Kibana 的 快照和恢复 功能,您必须具备以下权限:

    • 集群权限: monitor, manage_slm, cluster:admin/snapshot, 和 cluster:admin/repository
    • 索引权限: allmonitor 索引上
  • 要注册快照仓库,集群的全局元数据必须是可写的。确保没有任何 集群块 阻止写访问。

注意事项

edit

在注册快照仓库时,请记住以下几点:

  • 每个快照存储库都是独立且独立的。Elasticsearch不会在存储库之间共享数据。
  • 集群应仅注册一次特定的快照存储库桶。如果您在多个集群中注册相同的快照存储库,则只有一个集群应对该存储库具有写访问权限。在其他集群上,将存储库注册为只读。

    这可以防止多个集群同时向存储库写入数据并损坏存储库的内容。它还防止Elasticsearch缓存存储库的内容,这意味着其他集群所做的更改将立即变得可见。

  • 升级Elasticsearch到新版本时,您可以继续使用升级前使用的相同存储库。如果存储库由多个集群访问,它们应具有相同的版本。一旦存储库被特定版本的Elasticsearch修改,它可能无法被旧版本正确访问。但是,即使您在升级期间或之后拍摄了更多快照,您仍然能够通过将升级前拍摄的快照恢复到运行升级前版本的集群中来恢复失败的升级。

管理快照仓库

edit

您可以通过两种方式注册和管理快照仓库:

要在Kibana中管理存储库,请转到主菜单并点击堆栈管理 > 快照和恢复 > 存储库。要注册快照存储库,请点击注册存储库

您还可以使用创建快照仓库 API注册一个仓库。

快照仓库类型

edit

支持的快照仓库类型因您的部署类型而异:

Elasticsearch Service 仓库类型

edit

Elasticsearch Service 部署 自动注册 found-snapshots 仓库。Elasticsearch Service 使用此 仓库和 cloud-snapshot-policy 来定期对您的 集群进行快照。您还可以使用 found-snapshots 仓库来实现您自己的 SLM 策略 或存储可搜索的快照。

The found-snapshots 仓库是特定于每个部署的。然而,如果部署在同一个账户和同一个区域下,你可以从另一个部署的 found-snapshots 仓库中恢复快照。请参阅云端 快照和恢复 文档以了解更多信息。

Elasticsearch Service 部署还支持以下存储库类型:

自托管仓库类型

edit

如果你管理自己的 Elasticsearch 集群,你可以使用以下内置的快照仓库类型:

其他仓库类型可通过官方插件获得:

您也可以将这些存储库类型与替代存储实现一起使用,只要替代实现完全兼容即可。例如,MinIO 提供了 AWS S3 API 的替代实现,您可以将 MinIO 与 s3 存储库类型一起使用。

请注意,某些存储系统声称与这些仓库类型兼容,但并未完全模拟其行为。Elasticsearch 需要完全兼容。特别是替代实现必须支持相同的一系列 API 端点,在失败时返回相同的错误,并提供等效的一致性保证和性能,即使在多个节点同时访问时也是如此。不兼容的错误代码、一致性或性能可能特别难以追踪,因为错误、一致性失败和性能问题通常很少见且难以重现。

您可以使用存储库分析API对您的存储系统的适用性进行一些基本检查。如果此API未能成功完成,或指示性能不佳,则您的存储系统不完全兼容,因此不适合用作快照存储库。您需要与您的存储系统供应商合作,解决您遇到的任何不兼容问题。

验证仓库

edit

当您注册一个快照仓库时,Elasticsearch 会自动验证该仓库在所有主节点和数据节点上是否可用且功能正常。

要禁用此验证,请将创建快照仓库 APIverify查询参数设置为false。您无法在Kibana中禁用仓库验证。

PUT _snapshot/my_unverified_backup?verify=false
{
  "type": "fs",
  "settings": {
    "location": "my_unverified_backup_location"
  }
}

如果需要,您可以手动运行存储库验证检查。要在 Kibana 中验证存储库,请转到存储库列表页面并点击存储库的名称。然后点击验证存储库。您也可以使用验证快照存储库 API

POST _snapshot/my_unverified_backup/_verify

如果成功,请求将返回用于验证仓库的节点列表。如果验证失败,请求将返回一个错误。

您可以使用仓库分析 API更彻底地测试一个仓库。

清理仓库

edit

随着时间的推移,存储库可能会积累一些不被任何现有快照引用的数据。这是由于快照功能在快照创建期间故障场景中提供的数据安全保证以及快照创建过程的去中心化特性所导致的。这些未引用的数据不会对快照存储库的性能或安全性产生负面影响,但会导致存储使用量高于必要水平。要删除这些未引用的数据,您可以在存储库上运行清理操作。这将触发对存储库内容的全面核算,并删除任何未引用的数据。

要在 Kibana 中运行存储库清理操作,请转到存储库列表页面并点击存储库的名称。然后点击清理存储库

您还可以使用清理快照仓库 API

POST _snapshot/my_repository/_cleanup

API返回:

{
  "results": {
    "deleted_bytes": 20,
    "deleted_blobs": 5
  }
}

根据具体的存储库实现,显示的可用字节数以及删除的blob数量可能是近似值或精确结果。删除的blob数量为非零值意味着找到了未引用的blob并随后进行了清理。

请注意,此端点执行的大多数清理操作在从仓库中删除任何快照时会自动执行。如果您定期删除快照,在大多数情况下,您不会获得任何或仅获得很少的空间节省,因此应相应降低调用此功能的频率。

备份一个仓库

edit

您可能希望对您的仓库进行独立备份,例如,这样您就可以拥有其内容的存档副本,以便在以后某个日期重新创建仓库的当前状态。

您必须确保在备份Elasticsearch内容时,Elasticsearch不会写入存储库。如果在备份过程中Elasticsearch向存储库写入任何数据,则备份内容可能不一致,将来可能无法从中恢复任何数据。通过从具有写入权限的集群中注销存储库来防止写入存储库。

或者,如果您的仓库支持,您可以对底层文件系统进行原子快照,然后对这个文件系统快照进行备份。非常重要的一点是,文件系统快照必须是原子性的。

不要依赖通过本节描述以外的方法进行的仓库备份。如果你使用其他方法来复制你的仓库内容,那么生成的副本可能会捕获到数据的不一致视图。从这样的副本中恢复仓库可能会失败,报告错误,或者可能会成功但静默丢失部分数据。

不要将单个节点的文件系统快照作为备份机制。您必须使用 Elasticsearch 快照和还原功能将集群内容复制到单独的存储库。然后,如果需要,您可以对这个存储库进行文件系统快照。

当从备份中恢复仓库时,在仓库内容完全恢复之前,不得将仓库注册到Elasticsearch。如果在仓库注册到Elasticsearch时更改其内容,则仓库可能变得不可读或可能会静默丢失部分内容。在从备份恢复仓库后,使用验证仓库完整性 API 在开始使用仓库之前验证其完整性。

Azure 仓库

edit

您可以使用 Azure Blob存储 作为 快照和还原 的存储库。

设置

edit

要启用 Azure 仓库,首先通过指定一个或多个形式的设置来配置 Azure 仓库客户端 azure.client.CLIENT_NAME.SETTING_NAME。默认情况下,azure 仓库使用名为 default 的客户端,但在注册每个仓库时可以指定不同的客户端名称。

唯一必须的 Azure 仓库客户端设置是 account,这是一个在 安全设置 中定义的 Elasticsearch 密钥库。要提供此设置,请在每个节点上使用 elasticsearch-keystore 工具:

bin/elasticsearch-keystore add azure.client.default.account

如果在节点启动后调整此设置,请调用 Nodes reload secure settings API 以重新加载新值。

您可以通过设置它们的 account 值来定义多个客户端。例如,要设置 default 客户端和另一个名为 secondary 的客户端,请在每个节点上运行以下命令:

bin/elasticsearch-keystore add azure.client.default.account
bin/elasticsearch-keystore add azure.client.secondary.account

The keysas_token 设置也是安全设置,可以使用以下命令进行设置:

bin/elasticsearch-keystore add azure.client.default.key
bin/elasticsearch-keystore add azure.client.secondary.sas_token

其他 Azure 仓库客户端设置必须在节点启动前在 elasticsearch.yml 中设置。例如:

azure.client.default.timeout: 10s
azure.client.default.max_retries: 7
azure.client.default.endpoint_suffix: core.chinacloudapi.cn
azure.client.secondary.timeout: 30s

在这个例子中,使用default客户端的仓库每次尝试的客户端超时时间为10s,在失败前重试7次,并且端点后缀为core.chinacloudapi.cn。使用secondary客户端的仓库每次尝试的超时时间为30s,但将使用默认端点,并在默认重试次数后失败。

一旦正确配置了Azure存储库客户端,请按如下方式注册Azure存储库,使用client提供客户端名称,并参考存储库设置

PUT _snapshot/my_backup
{
  "type": "azure",
  "settings": {
    "client": "secondary"
  }
}

如果你使用的是默认客户端,你可以省略客户端仓库设置:

PUT _snapshot/my_backup
{
  "type": "azure"
}

正在进行中的快照或恢复作业不会被存储安全设置的重新加载所抢占。它们将使用操作开始时构建的客户端完成。

客户端设置

edit

以下列表描述了可用的客户端设置。那些必须存储在密钥库中的设置标记为(安全可重新加载);其他设置必须存储在elasticsearch.yml文件中。默认的CLIENT_NAMEdefault,但您可以配置一个具有不同名称的客户端,并在注册存储库时通过名称指定该客户端。

azure.client.CLIENT_NAME.account (Secure, reloadable)
Azure 账户名称,由仓库的内部 Azure 客户端使用。此设置对所有客户端都是必需的。
azure.client.CLIENT_NAME.endpoint_suffix
连接到的 Azure 端点后缀。默认值是 core.windows.net
azure.client.CLIENT_NAME.key (Secure, reloadable)
Azure 密钥,由仓库的内部 Azure 客户端使用。 或者,使用 sas_token
azure.client.CLIENT_NAME.max_retries
当Azure请求失败时使用的重试次数。此设置有助于控制指数退避策略。它指定了在快照失败之前必须发生的重试次数。默认值是3。初始退避周期由Azure SDK定义为30s。因此,在第一次超时或失败后重试之前有30s的等待时间。最大退避周期由Azure SDK定义为90s
azure.client.CLIENT_NAME.proxy.host
连接到 Azure 时使用的代理主机名。默认情况下,不使用代理。
azure.client.CLIENT_NAME.proxy.port
连接到 Azure 时使用的代理端口。默认情况下,不使用代理。
azure.client.CLIENT_NAME.proxy.type
为客户端注册一个代理类型。支持的值有 directhttpsocks。例如:azure.client.default.proxy.type: http。当 proxy.type 设置为 httpsocks 时,还必须提供 proxy.hostproxy.port。默认值是 direct
azure.client.CLIENT_NAME.sas_token (Secure, reloadable)
共享访问签名 (SAS) 令牌,仓库的内部 Azure 客户端使用该令牌进行身份验证。SAS 令牌必须具有对仓库基础路径及其所有内容的读取 (r)、写入 (w)、列出 (l) 和删除 (d) 权限。这些权限必须授予给 Blob 服务 (b),并适用于服务 (s)、容器 (c) 和对象 (o) 资源类型。或者,使用 key
azure.client.CLIENT_NAME.timeout
任何单一请求到 Azure 的客户端超时时间,以 时间单位表示。例如,值为 5s 表示 5 秒的超时时间。没有默认值,这意味着 Elasticsearch 使用 Azure 客户端设置的 默认值
azure.client.CLIENT_NAME.endpoint
连接到的 Azure 端点。它必须包含用于连接到 Azure 的协议。
azure.client.CLIENT_NAME.secondary_endpoint
连接到的 Azure 辅助端点。它必须包含用于连接到 Azure 的协议。

从环境中获取凭据

如果你没有为客户端指定keysas_token设置,那么Elasticsearch将尝试使用Azure SDK内置的机制从其运行的环境中自动获取凭据。这在Azure平台上运行Elasticsearch时是理想的。

Azure 虚拟机上运行 Elasticsearch 时,您应使用 Azure 托管身份为 Elasticsearch 提供凭据。要使用 Azure 托管身份,请为运行 Elasticsearch 的 Azure 虚拟机分配一个适当授权的身份。

当在 Azure Kubernetes Service 中运行 Elasticsearch 时,例如使用 Elastic Cloud on Kubernetes,您应该使用 Azure Workload Identity 为 Elasticsearch 提供凭据。要使用 Azure Workload Identity,请将 azure-identity-token 卷挂载为 Elasticsearch 配置目录 的子目录,并将 AZURE_FEDERATED_TOKEN_FILE 环境变量设置为指向挂载卷中的名为 azure-identity-token 的文件。

Azure SDK 有几种其他机制可以从其环境中自动获取凭据,但上面描述的两种方法是唯一经过测试并在 Elasticsearch 中受支持的方法。

存储库设置

edit

Azure 仓库支持以下设置,可以在注册 Azure 仓库时按如下方式指定:

PUT _snapshot/my_backup
{
  "type": "azure",
  "settings": {
    "client": "secondary",
    "container": "my_container",
    "base_path": "snapshots_prefix"
  }
}
client
要使用的 Azure 仓库客户端的名称。默认为 default
container
容器名称。在创建仓库之前,您必须先创建azure容器。 默认为 elasticsearch-snapshots
base_path

指定容器内存储库数据的路径。默认为空(根目录)。

在为Elastic Cloud Enterprise配置快照仓库时,不要设置base_path。 Elastic Cloud Enterprise会自动为每个部署生成base_path,以便多个部署可以共享同一个存储桶。

chunk_size
在快照期间,大文件可以被分解成存储中的多个较小的blob。除非有明确的原因需要限制存储库中blob的大小,否则不建议更改此值的默认值。设置低于默认值的值可能会导致在创建快照以及恢复操作期间对Azure blob存储的API调用次数增加,与使用默认值相比,这会使操作变慢且成本更高。指定块大小为字节单位,例如:10MB5KB500B。默认值为Azure blob存储中blob的最大大小,即5TB
compress
当设置为true时,元数据文件以压缩格式存储。此设置不影响默认情况下已经压缩的索引文件。 默认为true
max_restore_bytes_per_sec
(可选, 字节值) 每个节点的最大快照恢复速率。默认为无限制。请注意,恢复也受到恢复设置的限制。
max_snapshot_bytes_per_sec
(可选, 字节值) 每个节点的最大快照创建速率。默认值为每秒 40mb。 请注意,如果设置了托管服务的恢复设置, 则默认情况下速率不受限制,并且还会通过恢复设置进行限制。
readonly

(可选,布尔值) 如果为true,则该仓库是只读的。集群可以从该仓库中检索和恢复快照,但不能向该仓库写入数据或在其中创建快照。

只有具有写访问权限的集群才能在存储库中创建快照。连接到存储库的所有其他集群应将readonly参数设置为true

如果为false,集群可以写入仓库并在其中创建快照。 默认为false

如果你在多个集群中注册相同的快照仓库,只有一个集群应该对该仓库具有写权限。多个集群同时写入仓库可能会导致仓库内容损坏。

location_mode
primary_onlysecondary_only。默认为 primary_only。请注意,如果您将其设置为 secondary_only,它将强制 readonly 为 true。

存储库验证规则

edit

根据 容器命名指南,容器名称必须是有效的DNS名称,并符合以下命名规则:

  • 容器名称必须以字母或数字开头,并且只能包含字母、数字和连字符(-)。
  • 每个连字符(-)字符的前后必须紧跟字母或数字;容器名称中不允许连续的连字符。
  • 容器名称中的所有字母必须为小写。
  • 容器名称的长度必须为3到63个字符。

支持的 Azure 存储帐户类型

Azure 仓库类型适用于所有标准存储账户

  • 标准本地冗余存储 - Standard_LRS
  • 标准区域冗余存储 - Standard_ZRS
  • 标准地理冗余存储 - Standard_GRS
  • 标准读取访问地理冗余存储 - Standard_RAGRS

高级本地冗余存储 (Premium_LRS) 不支持,因为它只能用作虚拟机磁盘存储,不能用作通用存储。

线性化寄存器实现

edit

用于Azure存储库的可线性化寄存器实现基于Azure对强一致性租约的支持。每个租约在任何时候只能由一个节点持有。节点在进行受保护的blob的读或写操作时会出示其租约。如果租约无效或已过期,受租约保护的操作将失败。为了对寄存器执行比较并交换操作,Elasticsearch首先获取blob的租约,然后在租约下读取blob内容,最后在同一租约下上传更新的blob。此过程确保读和写操作以原子方式发生。

Google Cloud Storage 存储库

edit

您可以使用Google Cloud Storage服务作为快照/恢复的存储库。

入门指南

edit

此仓库类型使用Google Cloud Java Client for Storage 连接到存储服务。如果您是第一次使用 Google Cloud Storage,您 必须连接到Google Cloud Platform Console 并创建一个新项目。在您的项目创建完成后,您必须为您的项目启用 Cloud Storage服务。

创建一个存储桶

edit

Google Cloud Storage 服务使用存储桶作为所有数据的容器。通常使用Google Cloud Platform 控制台创建存储桶。此存储库类型不会自动创建存储桶。

创建一个新存储桶:

  1. 连接到Google Cloud Platform Console
  2. 选择您的项目。
  3. 转到存储浏览器
  4. 点击创建存储桶按钮。
  5. 输入新存储桶的名称。
  6. 选择存储类别。
  7. 选择一个位置。
  8. 点击创建按钮。

有关更详细的说明,请参阅 Google Cloud 文档

服务认证

edit

存储库必须对其向 Google Cloud Storage 服务发出的请求进行身份验证。Google 客户端库通常采用一种名为 应用程序默认凭据 的策略。然而,Elasticsearch 仅 部分支持 该策略。存储库在启用了安全管理器的 Elasticsearch 进程下运行。安全管理器在使用环境变量 GOOGLE_APPLICATION_CREDENTIALS 指向磁盘上的本地文件时,会阻碍“自动”凭据发现。但是,它可以检索附加到运行 Elasticsearch 的资源的服务帐户,或者回退到 Compute Engine、Kubernetes Engine 或 App Engine 提供的默认服务帐户。或者,如果您使用的环境不支持自动凭据发现,则必须配置 服务帐户 凭据。

使用服务账户

edit

您需要手动获取并提供服务账户凭证

有关生成JSON服务帐户文件的详细信息,请参阅Google Cloud文档。 请注意,PKCS12格式不支持此仓库类型。

以下是步骤的总结:

  1. 连接到Google Cloud Platform Console
  2. 选择您的项目。
  3. 选择服务账户标签。
  4. 点击创建服务账户
  5. 账户创建后,选择它并转到密钥
  6. 选择添加密钥,然后选择创建新密钥
  7. 选择密钥类型JSON,因为P12不受支持。

一个 JSON 服务账户文件看起来像这样:

{
  "type": "service_account",
  "project_id": "your-project-id",
  "private_key_id": "...",
  "private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
  "client_email": "service-account-for-your-repository@your-project-id.iam.gserviceaccount.com",
  "client_id": "...",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/your-bucket@your-project-id.iam.gserviceaccount.com"
}

要将此文件提供给仓库,必须将其存储在Elasticsearch密钥库中。您必须使用add-file子命令添加一个名为gcs.client.NAME.credentials_filefile设置。NAME是仓库的客户端配置名称。隐式客户端名称是default,但可以在仓库设置中使用client键指定不同的客户端名称。

通过 GOOGLE_APPLICATION_CREDENTIALS 环境变量传递文件路径是支持的。

例如,如果你在密钥库中添加了一个gcs.client.my_alternate_client.credentials_file设置,你可以这样配置一个仓库来使用这些凭证:

PUT _snapshot/my_gcs_repository
{
  "type": "gcs",
  "settings": {
    "bucket": "my_bucket",
    "client": "my_alternate_client"
  }
}

credentials_file 设置是 可重新加载的。 您可以在节点启动之前定义这些设置, 或者在定义设置后调用 Nodes reload secure settings API 以将它们应用于正在运行的节点。

在您重新加载设置后,用于传输快照内容的内部 gcs 客户端将使用密钥库中的最新设置。

正在进行的快照或恢复作业不会被客户端的 credentials_file 设置的 重新加载 所抢占。它们会使用操作开始时构建的客户端完成。

客户端设置

edit

用于连接到 Google Cloud Storage 的客户端有许多可用的设置。客户端设置名称的形式为 gcs.client.CLIENT_NAME.SETTING_NAME,并在 elasticsearch.yml 中指定。默认客户端名称由 gcs 仓库查找,称为 default,但可以通过仓库设置 client 进行自定义。

例如:

PUT _snapshot/my_gcs_repository
{
  "type": "gcs",
  "settings": {
    "bucket": "my_bucket",
    "client": "my_alternate_client"
  }
}

某些设置是敏感的,必须存储在 Elasticsearch 密钥库中。服务帐户文件就是这种情况:

bin/elasticsearch-keystore add-file gcs.client.default.credentials_file /path/service-account.json

以下是可用的客户端设置。那些必须存储在密钥库中的设置被标记为安全

credentials_file (Secure, reloadable)
用于向Google Cloud Storage服务进行身份验证的服务帐户文件。
endpoint
连接到的Google Cloud Storage服务端点。这将由Google Cloud Storage客户端自动确定,但可以明确指定。
connect_timeout
建立与Google Cloud Storage服务的连接的超时时间。该值应指定单位。例如,值为5s表示5秒的超时时间。值为-1对应于无限超时。默认值为20秒。
read_timeout
从已建立的连接中读取数据的超时时间。值应指定单位。例如,值为 5s 表示 5 秒的超时时间。值为 -1 对应于无限超时。默认值为 20 秒。
application_name
客户端在使用Google Cloud Storage服务时使用的名称。设置自定义名称可以在请求统计信息记录在Google Cloud Platform中时用于验证您的集群。默认为repository-gcs
project_id
Google Cloud 项目 ID。这将从凭据文件中自动推断,但也可以显式指定。例如,当相同的凭据可用于生产和开发项目时,可以使用它在这两个项目之间切换。
proxy.host
通过代理连接到Google Cloud Storage的主机名。
proxy.port
连接到Google Cloud Storage的代理端口。
proxy.type
客户端的代理类型。支持的值为 direct(无代理)、 httpsocks。默认值为 direct

存储库设置

edit

The gcs 存储库类型支持许多设置,以自定义数据在 Google Cloud Storage 中的存储方式。

这些可以在创建仓库时指定。例如:

PUT _snapshot/my_gcs_repository
{
  "type": "gcs",
  "settings": {
    "bucket": "my_other_bucket",
    "base_path": "dev"
  }
}

支持以下设置:

bucket
用于快照的存储桶名称。(必填)
client
用于连接到 Google Cloud Storage 的客户端名称。 默认为 default
base_path

指定存储桶内用于存储仓库数据的路径。默认为存储桶的根目录。

在为Elastic Cloud Enterprise配置快照仓库时,不要设置base_path。 Elastic Cloud Enterprise会自动为每个部署生成base_path,以便多个部署可以共享同一个存储桶。

chunk_size
在快照过程中,大文件可以被分解成存储中的多个较小的blob。 除非有明确的原因需要限制存储库中blob的大小,否则不建议将其值从默认值更改。设置低于默认值的值可能会导致在创建快照以及恢复操作期间对Google Cloud Storage Service的API调用次数增加,与使用默认值相比,这会使操作变慢且成本更高。 指定块大小为一个值和单位,例如: 10MB, 5KB, 500B。默认值为Google Cloud Storage Service中blob的最大大小,即5TB
compress
当设置为true时,元数据文件以压缩格式存储。此设置不影响默认情况下已经压缩的索引文件。 默认为true
max_restore_bytes_per_sec
(可选, 字节值) 每个节点的最大快照恢复速率。默认为无限制。请注意,恢复也受恢复设置的限制。
max_snapshot_bytes_per_sec
(可选, 字节值) 每个节点的最大快照创建速率。默认值为每秒 40mb。 请注意,如果设置了托管服务的恢复设置, 则默认情况下速率不受限制,并且还会通过恢复设置进行限制。
readonly

(可选,布尔值) 如果为true,则该仓库是只读的。集群可以从该仓库中检索和恢复快照,但不能向该仓库写入数据或在其中创建快照。

只有具有写访问权限的集群才能在存储库中创建快照。连接到存储库的所有其他集群应将readonly参数设置为true

如果为false,集群可以写入仓库并在其中创建快照。 默认为false

如果你在多个集群中注册相同的快照仓库,只有一个集群应该对该仓库具有写权限。多个集群同时写入仓库可能会导致仓库内容损坏。

application_name
[6.3.0] 在6.3.0中已弃用。此设置现在定义在客户端设置中。 客户端使用Google Cloud Storage服务时使用的名称。

推荐的存储桶权限

edit

用于访问存储桶的服务帐户必须具有对存储桶的“写入者”访问权限:

  1. 连接到Google Cloud Platform Console
  2. 选择您的项目。
  3. 转到存储浏览器
  4. 选择存储桶并点击“编辑存储桶权限”。
  5. 服务帐户必须配置为具有“写入者”访问权限的“用户”。

线性化寄存器实现

edit

GCS 仓库的可线性化寄存器实现基于 GCS 对 put-blob 操作的强一致性前提条件的支持。为了在寄存器上执行比较并交换操作,Elasticsearch 会检索寄存器 blob 及其当前代数,然后使用观察到的代数作为其前提条件上传更新的 blob。该前提条件确保代数在此期间没有发生变化。

S3 仓库

edit

您可以使用 AWS S3 作为 快照/恢复 的存储库。

如果您正在寻找AWS上的Elasticsearch托管解决方案,请访问 https://www.elastic.co/cloud/

入门指南

edit

要注册一个S3仓库,在创建仓库时指定类型为s3。仓库默认使用ECS IAM角色进行身份验证。您也可以使用Kubernetes服务账户进行身份验证。

唯一必须设置的是存储桶名称:

PUT _snapshot/my_s3_repository
{
  "type": "s3",
  "settings": {
    "bucket": "my-bucket"
  }
}

客户端设置

edit

用于连接到 S3 的客户端有许多可用的设置。这些设置的形式为 s3.client.CLIENT_NAME.SETTING_NAME。默认情况下,s3 仓库使用名为 default 的客户端,但可以使用 仓库设置 client 进行修改。例如:

PUT _snapshot/my_s3_repository
{
  "type": "s3",
  "settings": {
    "bucket": "my-bucket",
    "client": "my-alternate-client"
  }
}

大多数客户端设置可以添加到 elasticsearch.yml 配置文件中,但安全设置除外,您需要将其添加到 Elasticsearch 密钥库中。有关创建和更新 Elasticsearch 密钥库的更多信息,请参阅 安全设置

例如,如果您想使用特定凭证访问 S3,请运行以下命令将这些凭证添加到密钥库中。

bin/elasticsearch-keystore add s3.client.default.access_key
bin/elasticsearch-keystore add s3.client.default.secret_key
# a session token is optional so the following command may not be needed
bin/elasticsearch-keystore add s3.client.default.session_token

如果你想要使用实例角色或容器角色来访问S3,那么你应该保留这些设置为未设置状态。你可以通过从密钥库中移除这些设置,从而从使用特定凭证切换回使用实例角色或容器角色的默认设置,如下所示:

bin/elasticsearch-keystore remove s3.client.default.access_key
bin/elasticsearch-keystore remove s3.client.default.secret_key
# a session token is optional so the following command may not be needed
bin/elasticsearch-keystore remove s3.client.default.session_token

所有此类型的存储库客户端安全设置都是 可重新加载的。 您可以在节点启动前定义这些设置, 或者在设置定义后调用节点重新加载安全设置API 以将它们应用于正在运行的节点。

在您重新加载设置后,用于传输快照内容的内部 s3 客户端将使用密钥库中的最新设置。任何现有的 s3 存储库以及任何新创建的存储库都将获取存储在密钥库中的新值。

进行中的快照/恢复任务不会被客户端安全设置的重新加载所抢占。任务将使用操作开始时构建的客户端完成。

以下列表包含可用的客户端设置。那些必须存储在密钥库中的设置被标记为“安全”,并且是可重新加载的;其他设置属于elasticsearch.yml文件。

access_key (Secure, reloadable)
一个S3访问密钥。如果设置,secret_key设置也必须指定。 如果未设置,客户端将使用实例或容器角色。
secret_key (Secure, reloadable)
S3 密钥。如果设置,则必须同时指定 access_key 设置。
session_token (Secure, reloadable)
一个S3会话令牌。如果设置,access_keysecret_key设置也必须指定。
endpoint
要连接的S3服务端点。默认值为s3.amazonaws.com,但 AWS文档列出了其他S3端点。如果您使用的是 S3兼容服务,则应将其设置为该服务的端点。
protocol
连接到 S3 时使用的协议。有效值为 httphttps。默认为 https。使用 HTTPS 时,此存储库类型使用 JVM 范围内的信任库验证存储库的证书链。确保使用 JVM 的 keytool 工具将根证书颁发机构添加到此信任库中。如果您为 S3 存储库使用自定义证书颁发机构,并且使用 Elasticsearch 捆绑的 JDK,那么每次升级 Elasticsearch 时,您都需要重新安装您的 CA 证书。
proxy.host
连接到 S3 的代理的主机名。
proxy.port
连接到S3的代理端口。
proxy.scheme
用于S3代理连接的方案。有效值为httphttps。 默认为http。此设置允许指定与代理服务器通信时使用的协议
proxy.username (Secure, reloadable)
连接到 proxy.host 的用户名。
proxy.password (Secure, reloadable)
连接到 proxy.host 所需的密码。
read_timeout
时间值)Elasticsearch在关闭连接之前,等待从已建立的开放连接的存储库接收下一个数据字节的最大时间。默认值为50秒。
max_connections
S3 的最大并发连接数。默认值是 50
max_retries
当S3请求失败时使用的重试次数。默认值是 3
use_throttle_retries
是否应该限制重试(即是否应该退避)。必须为 truefalse。默认为 true
path_style_access
是否强制使用路径样式访问模式。如果true,将使用路径样式访问模式。如果false,访问模式将由AWS Java SDK自动确定(详见AWS文档)。默认为false

在版本7.07.17.27.3中,所有存储桶操作都使用了现已弃用的路径样式访问模式。如果您的部署需要路径样式访问模式,那么在升级时应将此设置设置为true

disable_chunked_encoding
是否应禁用分块编码。如果设置为false,则启用分块编码,并在适当的情况下使用。如果设置为true,则禁用分块编码,并且不会使用,这可能意味着快照操作会消耗更多资源并需要更长时间才能完成。只有在使用不支持分块编码的存储服务时,才应将其设置为true。有关详细信息,请参阅AWS Java SDK文档。默认值为false
region
允许指定要使用的签名区域。对于大多数用例来说,手动指定此设置应该不是必要的。通常,SDK会正确猜测要使用的签名区域。这应该被视为一个专家级设置,以支持需要v4签名并使用非默认us-east-1区域的其他S3兼容API。默认为空字符串,这意味着SDK将尝试自动确定正确的签名区域。
signer_override
允许指定用于S3客户端签名请求的签名算法名称。对于大多数用例来说,指定此设置应该不是必要的。它应被视为一个专家级设置,以支持不支持SDK自动确定的签名算法的S3兼容API。 请参阅AWS Java SDK文档了解详情。默认为空字符串,这意味着不会使用签名算法覆盖。

存储库设置

edit

The s3 存储库类型支持许多设置,以自定义数据在 S3 中的存储方式。这些可以在创建存储库时指定。例如:

PUT _snapshot/my_s3_repository
{
  "type": "s3",
  "settings": {
    "bucket": "my-bucket",
    "another_setting": "setting-value"
  }
}

支持以下设置:

bucket

(必需) 用于快照的S3存储桶名称。

存储桶名称必须遵守 Amazon 的 S3 存储桶命名规则

client
要用于连接到 S3 的 S3 客户端 的名称。 默认为 default
base_path

指定存储库数据在其存储桶中的路径。默认为空字符串,表示存储库位于存储桶的根目录。此设置的值不应以 / 开头或结尾。

在为Elastic Cloud Enterprise配置快照仓库时,不要设置base_path。 Elastic Cloud Enterprise会自动为每个部署生成base_path,以便多个部署可以共享同一个存储桶。

chunk_size
(字节值) Elasticsearch在创建快照时写入仓库的对象的最大大小。大于chunk_size的文件将被分块为几个较小的对象。Elasticsearch还可能根据其他约束(如max_multipart_parts限制)将文件分割到多个对象中。默认值为5TB,这是AWS S3中对象的最大大小
compress
当设置为true时,元数据文件以压缩格式存储。此设置不影响默认情况下已经压缩的索引文件。 默认为true
max_restore_bytes_per_sec
(可选, 字节值) 每个节点的最大快照恢复速率。默认为无限制。请注意,恢复也受到恢复设置的限制。
max_snapshot_bytes_per_sec
(可选, 字节值) 每个节点的最大快照创建速率。默认值为每秒 40mb。 请注意,如果设置了托管服务的恢复设置, 则默认情况下速率不受限制,并且还会通过恢复设置进行限制。
readonly

(可选,布尔值) 如果为true,则该仓库是只读的。集群可以从该仓库中检索和恢复快照,但不能向该仓库写入数据或在其中创建快照。

只有具有写访问权限的集群才能在存储库中创建快照。连接到存储库的所有其他集群应将readonly参数设置为true

如果为false,集群可以写入仓库并在其中创建快照。 默认为false

如果你在多个集群中注册相同的快照仓库,只有一个集群应该对该仓库具有写权限。多个集群同时写入仓库可能会导致仓库内容损坏。

server_side_encryption
当设置为true时,文件在服务器端使用AES256算法进行加密。默认为false
buffer_size
(字节值) 低于此阈值的块将使用单个请求上传。 超过此阈值,S3 存储库将使用 AWS 分段上传 API 将块分割成多个部分,每个部分的长度为 buffer_size,并在其自己的请求中上传每个部分。请注意, 设置小于 5mb 的缓冲区大小是不允许的,因为它将阻止使用分段 API 并可能导致上传错误。也不可能 设置大于 5gb 的缓冲区大小,因为这是 S3 允许的最大上传大小。默认为 100mb5% 的 JVM 堆,以较小者为准。
max_multipart_parts
(整数) Elasticsearch 在单个对象的多部分上传过程中将写入的最大部分数。大于 buffer_size × max_multipart_parts 的文件将被分块为几个较小的对象。Elasticsearch 也可能将文件拆分为多个对象,以满足其他约束条件,例如 chunk_size 限制。默认值为 10000,这是 AWS S3 中多部分上传的最大部分数
canned_acl
S3 仓库支持所有 S3 预定义 ACLprivatepublic-readpublic-read-writeauthenticated-readlog-delivery-writebucket-owner-readbucket-owner-full-control。默认为 private。您可以使用 canned_acl 设置指定预定义 ACL。当 S3 仓库创建 存储桶和对象时,它会将预定义 ACL 添加到存储桶和对象中。
storage_class
设置写入仓库的对象的S3存储类别。值可以是standardreduced_redundancystandard_iaonezone_iaintelligent_tiering。默认为standard。有关更多信息,请参阅S3存储类别
delete_objects_max_size
(整数) 设置用于 DeleteObjects 请求的最大批处理大小,介于 1 和 1000 之间。默认为 1000,这是 AWS DeleteObjects API 支持的最大值。
max_multipart_upload_cleanup_size
(整数) 设置在每次快照删除批次中清理可能悬挂的多部分上传的最大数量。默认为 1000,这是AWS ListMultipartUploads API支持的最大数量。如果设置为0,Elasticsearch将不会尝试清理悬挂的多部分上传。
throttled_delete_retry.delay_increment
(时间值) 此值用作第一次重试前的延迟,以及每次后续重试时延迟的增量。默认值为50ms,最小值为0ms。
throttled_delete_retry.maximum_delay
(时间值) 这是重试之间延迟增长的上限。默认值为5秒,最小值为0毫秒。
throttled_delete_retry.maximum_number_of_retries
(整数) 设置重试限制快照删除的次数。默认值为 10,最小值为 0,这将完全禁用重试。请注意,如果在 Azure 客户端中启用了重试,这些重试中的每一个都包含那么多次客户端级别的重试。

get_register_retry_delay

(<<time-units,time value>>) Sets the time to wait before trying again if an attempt to read a
<<repository-s3-linearizable-registers,linearizable register>> fails. Defaults to `5s`.

在仓库设置中定义客户端设置的选项已被视为弃用,并将在未来的版本中移除。

除了上述设置外,您还可以在仓库设置中指定所有非安全客户端设置。在这种情况下,仓库设置中找到的客户端设置将与仓库使用的命名客户端的设置合并。客户端设置与仓库设置之间的冲突由仓库设置优先于客户端设置来解决。

例如:

PUT _snapshot/my_s3_repository
{
  "type": "s3",
  "settings": {
    "client": "my-client",
    "bucket": "my-bucket",
    "endpoint": "my.s3.endpoint"
  }
}

这设置了一个仓库,该仓库使用来自客户端my_client_name的所有客户端设置,除了endpoint被仓库设置覆盖为my.s3.endpoint

S3 存储类别

edit

Amazon S3 支持多种 存储类别,每种存储类别都提供不同的操作特性。例如,某些类别的存储成本较低,但每个请求的成本较高,而其他类别可能在可用性保证方面有所不同。

您可以使用storage_class仓库设置来指定Elasticsearch用于存储数据对象的存储类。

更改现有仓库上的 storage_class 设置只会影响新创建对象的存储类别,从而导致存储类别的混合使用。

您可以使用S3生命周期策略来调整存储库中现有对象的存储类别,但您不得将对象转换为不受支持的类别,例如Glacier类别,并且不得使对象过期。如果您使用Glacier存储类别或另一个不受支持的存储类别,或对象过期,则可能会永久失去对存储库内容的访问权限。

您可以使用intelligent_tiering存储类来自动管理对象的类别,但您不得启用可选的归档访问或深度归档访问层。如果您使用这些层级,则可能会永久失去对仓库内容的访问权限。

有关S3存储类的更多信息,请参阅 AWS 存储类指南

推荐的S3权限

edit

为了将Elasticsearch快照过程限制在所需的最少资源范围内,我们建议使用Amazon IAM与预先存在的S3存储桶结合使用。以下是一个策略示例,该策略将允许快照访问名为“snaps.example.com”的S3存储桶。这可以通过AWS IAM控制台进行配置,通过创建自定义策略并使用类似于以下内容的策略文档(将snaps.example.com更改为您的存储桶名称)。

{
  "Statement": [
    {
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation",
        "s3:ListBucketMultipartUploads",
        "s3:ListBucketVersions"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::snaps.example.com"
      ]
    },
    {
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject",
        "s3:AbortMultipartUpload",
        "s3:ListMultipartUploadParts"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::snaps.example.com/*"
      ]
    }
  ],
  "Version": "2012-10-17"
}

您可以通过在存储桶中指定一个前缀(在本例中名为“foo”)来进一步限制权限。

{
  "Statement": [
    {
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation",
        "s3:ListBucketMultipartUploads",
        "s3:ListBucketVersions"
      ],
      "Condition": {
        "StringLike": {
          "s3:prefix": [
            "foo/*"
          ]
        }
      },
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::snaps.example.com"
      ]
    },
    {
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject",
        "s3:AbortMultipartUpload",
        "s3:ListMultipartUploadParts"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::snaps.example.com/foo/*"
      ]
    }
  ],
  "Version": "2012-10-17"
}

存储桶需要存在才能为快照注册存储库。如果您没有创建存储桶,那么存储库注册将会失败。

使用IAM角色进行Kubernetes服务账户的身份验证
edit

如果您想使用Kubernetes 服务账户 进行身份验证,您需要将一个符号链接到 $AWS_WEB_IDENTITY_TOKEN_FILE 环境变量 (该变量应由 Kubernetes pod 自动设置)到 S3 仓库配置目录中,以便仓库 可以拥有对服务账户的读取权限(仓库无法读取其配置目录之外的任何文件)。 例如:

mkdir -p "${ES_PATH_CONF}/repository-s3"
ln -s $AWS_WEB_IDENTITY_TOKEN_FILE "${ES_PATH_CONF}/repository-s3/aws-web-identity-token-file"

符号链接必须在所有数据和符合主节点资格的节点上创建,并且可被elasticsearch用户读取。默认情况下,Elasticsearch以用户elasticsearch运行,使用uid:gid 1000:0

如果符号链接存在,默认情况下所有没有显式client凭据的S3存储库都会使用它。

AWS VPC 带宽设置

edit

AWS 实例将 S3 端点解析为公共 IP。如果 Elasticsearch 实例位于 AWS VPC 中的私有子网中,则所有到 S3 的流量都将通过 VPC 的 NAT 实例。如果您的 VPC 的 NAT 实例是较小的实例大小(例如 t2.micro)或正在处理大量网络流量,则您的到 S3 的带宽可能会受到该 NAT 实例的网络带宽限制。相反,我们建议创建一个 VPC 端点,该端点使位于 AWS VPC 中私有子网中的实例能够连接到 S3。这将消除由 VPC 的 NAT 实例的网络带宽施加的任何限制。

位于AWS VPC公有子网中的实例将通过VPC的互联网网关连接到S3,并且不会受到VPC的NAT实例的带宽限制。

S3兼容服务

edit

有许多存储系统提供与S3兼容的API,并且s3仓库类型允许您使用这些系统代替AWS S3。为此,您应将s3.client.CLIENT_NAME.endpoint设置为系统的端点。此设置接受IP地址和主机名,并且可以包含端口。例如,端点可能是172.17.0.2172.17.0.2:9000

默认情况下,Elasticsearch 使用 HTTPS 与您的存储系统通信,并使用 JVM 范围内的信任库验证存储库的证书链。确保 JVM 范围内的信任库包含您的存储库的条目。如果您希望使用不安全的 HTTP 通信而不是 HTTPS,请将 s3.client.CLIENT_NAME.protocol 设置为 http

MinIO 是一个提供 S3 兼容 API 的存储系统示例。s3 仓库类型允许 Elasticsearch 与 MinIO 支持的仓库以及存储在 AWS S3 上的仓库一起工作。其他 S3 兼容的存储系统也可能与 Elasticsearch 一起工作,但这些不在 Elasticsearch 测试套件的覆盖范围内。

有许多系统,包括一些来自非常知名的存储供应商的系统, 尽管未能完全模拟 S3 的行为,却声称提供与 S3 兼容的 API。 如果您正在使用这样的系统进行快照,请考虑使用基于标准化协议(如 NFS)的 共享文件系统仓库 来访问您的存储系统。 s3 仓库类型要求与 S3 完全兼容。特别是它必须支持相同的 API 端点集, 具有相同的参数,在失败时返回相同的错误,并且在多个节点同时访问时提供至少与 S3 相同的 一致性和性能。您需要与存储系统的供应商合作,解决您遇到的任何不兼容问题。 请不要报告涉及声称与 S3 兼容的存储系统的 Elasticsearch 问题,除非您能证明在使用真正的 AWS S3 仓库时也存在相同的问题。

您可以使用存储库分析API对您的存储系统进行一些基本检查,以评估其适用性。如果此API未能成功完成,或指示性能较差,则您的存储系统与AWS S3不完全兼容,因此不适合用作快照存储库。然而,这些检查并不能保证完全兼容。

大多数存储系统都可以配置为记录它们与Elasticsearch交互的详细信息。如果您正在调查与AWS S3的疑似不兼容性,通常最简单的方法是收集这些日志并将它们提供给您的存储系统供应商以进行进一步分析。如果从存储系统发出的日志中不明显看出不兼容性,请通过设置日志级别com.amazonaws.request日志记录器的日志级别设置为DEBUG,以配置Elasticsearch记录其对S3 API发出的每个请求。

为了防止在日志中泄露敏感信息,如凭证和密钥,Elasticsearch拒绝在高详细度下配置此记录器,除非启用了不安全的网络跟踪日志记录。为此,您必须在每个节点上显式启用它,通过将系统属性es.insecure_network_trace_enabled设置为true

一旦启用,您可以配置 com.amazonaws.request 日志记录器:

PUT /_cluster/settings
{
  "persistent": {
    "logger.com.amazonaws.request": "DEBUG"
  }
}

收集覆盖失败分析时间段的所有节点上的Elasticsearch日志,并将它们与分析响应一起分享给您的存储系统供应商,以便他们可以使用这些日志来确定问题。有关更多信息,包括可以使用其他日志记录器获取更详细日志的详细信息,请参阅AWS Java SDK文档。当您完成收集供应商所需的日志后,将日志记录器设置回null以恢复默认的日志记录配置并再次禁用不安全的网络跟踪日志记录。有关更多信息,请参阅日志记录器集群更新设置API

线性化寄存器实现

edit

用于S3存储库的可线性化寄存器实现基于多部分上传API的强一致性语义。Elasticsearch首先创建一个多部分上传,以表明其执行线性化寄存器操作的意图。然后,Elasticsearch列出并取消所有其他相同寄存器的多部分上传。接着,Elasticsearch尝试完成上传。如果上传成功完成,则比较并交换操作是原子的。

共享文件系统仓库

edit

此存储库类型仅在您自行在硬件上运行 Elasticsearch 时可用。如果您使用 Elasticsearch 服务,请参阅 Elasticsearch 服务存储库类型

使用共享文件系统仓库在共享文件系统上存储快照。

要注册一个共享文件系统仓库,首先将文件系统挂载到所有主节点和数据节点的相同位置。然后将文件系统的路径或父目录添加到每个主节点和数据节点的elasticsearch.yml文件中的path.repo设置中。对于正在运行的集群,这需要对每个节点进行滚动重启

支持的 path.repo 值因平台而异:

Linux 和 macOS 安装支持 Unix 风格的路径:

path:
  repo:
    - /mount/backups
    - /mount/long_term_backups

在重新启动每个节点后,使用 Kibana 或 创建快照仓库 API 来注册仓库。在注册仓库时,指定文件系统的路径:

PUT _snapshot/my_fs_backup
{
  "type": "fs",
  "settings": {
    "location": "/mount/backups/my_fs_backup_location"
  }
}

如果你指定了一个相对路径,Elasticsearch 会使用 path.repo 设置中的第一个值来解析路径。

PUT _snapshot/my_fs_backup
{
  "type": "fs",
  "settings": {
    "location": "my_fs_backup_location"        
  }
}

path.repo 设置中的第一个值是 /mount/backups。这个相对路径 my_fs_backup_location 解析为 /mount/backups/my_fs_backup_location

集群应仅注册一次特定的快照存储库桶。如果您在多个集群中注册相同的快照存储库,则只有一个集群应对该存储库具有写访问权限。在其他集群上,将存储库注册为只读。

这可以防止多个集群同时向存储库写入数据并损坏存储库的内容。它还防止Elasticsearch缓存存储库的内容,这意味着其他集群所做的更改将立即变得可见。

要使用创建快照存储库 API 将文件系统存储库注册为只读,请将 readonly 参数设置为 true。或者,您可以为文件系统注册一个 URL 存储库

PUT _snapshot/my_fs_backup
{
  "type": "fs",
  "settings": {
    "location": "my_fs_backup_location",
    "readonly": true
  }
}

仓库设置

edit
chunk_size
(可选, 字节值) 快照中文件的最大大小。在快照中,大于此大小的文件将被拆分为此大小或更小的块。默认为 null(无限制文件大小)。
compress
(可选,布尔值) 如果为true,快照中的元数据文件(如索引映射和设置)将被压缩。数据文件不会被压缩。默认为true
location
(必需,字符串) 用于存储和检索快照的共享文件系统的位置。此位置必须在集群中的所有主节点和数据节点上注册在path.repo设置中。 与path.repo不同,此设置仅支持单个文件路径。
max_number_of_snapshots
(可选, 整数) 仓库可以包含的最大快照数量。 默认为 Integer.MAX_VALUE,即 2^31-12147483647
max_restore_bytes_per_sec
(可选, 字节值) 每个节点的最大快照恢复速率。默认为无限制。请注意,恢复也受恢复设置的限制。
max_snapshot_bytes_per_sec
(可选, 字节值) 每个节点的最大快照创建速率。默认值为每秒 40mb。 请注意,如果设置了托管服务的恢复设置, 则默认情况下速率不受限制,并且还会通过恢复设置进行限制。
readonly

(可选,布尔值) 如果为true,则该仓库是只读的。集群可以从该仓库中检索和恢复快照,但不能向该仓库写入数据或在其中创建快照。

只有具有写访问权限的集群才能在存储库中创建快照。连接到存储库的所有其他集群应将readonly参数设置为true

如果为false,集群可以写入仓库并在其中创建快照。 默认为false

如果你在多个集群中注册相同的快照仓库,只有一个集群应该对该仓库具有写权限。多个集群同时写入仓库可能会导致仓库内容损坏。

排查共享文件系统仓库的问题

edit

Elasticsearch 与共享文件系统仓库交互时,使用操作系统中的文件系统抽象。这意味着每个 Elasticsearch 节点都必须能够在仓库路径中执行操作,例如创建、打开和重命名文件,以及创建和列出目录,并且一个节点执行的操作必须能够在操作完成后立即被其他节点看到。

使用验证快照仓库API仓库分析API检查常见的配置错误。当仓库正确配置时,这些API将成功完成。如果验证仓库或仓库分析API报告了问题,那么您将能够在Elasticsearch外部通过直接在文件系统上执行类似操作来重现此问题。

如果验证仓库或仓库分析API因权限不足而失败,请调整操作系统中仓库的配置,以赋予Elasticsearch适当的访问权限。要直接重现此类问题,请在Elasticsearch运行的相同安全上下文中执行相同的操作。例如,在Linux上,可以使用su命令切换到Elasticsearch运行的用户。

如果验证存储库或存储库分析API因错误而失败,该错误表明在一个节点上的操作在另一个节点上不是立即可见的,那么请调整操作系统中存储库的配置以解决此问题。如果您的存储库无法配置为提供足够强的可见性保证,则它不适合用作Elasticsearch快照存储库。

验证仓库和仓库分析API在访问仓库时,如果操作系统返回任何其他类型的I/O错误,也会失败。如果发生这种情况,请解决操作系统报告的I/O错误的原因。

许多NFS实现使用数字用户ID(UID)和组ID(GID)在节点之间匹配账户,而不是使用它们的名称。虽然可以在每个节点上使用相同名称的账户(通常是elasticsearch)运行Elasticsearch,但这些账户可能具有不同的数字用户或组ID。如果您的共享文件系统使用NFS,请确保每个节点都使用相同的数字UID和GID运行,或者更新您的NFS配置以适应节点间数字ID的差异。

线性化寄存器实现

edit

共享文件系统仓库的可线性化寄存器实现基于文件锁定。为了对寄存器执行比较和交换操作,Elasticsearch首先锁定底层文件,然后在同一锁下写入更新内容。这确保了文件在此期间没有发生变化。

只读URL仓库

edit

此存储库类型仅在您自行在硬件上运行 Elasticsearch 时可用。如果您使用 Elasticsearch 服务,请参阅 Elasticsearch 服务存储库类型

您可以使用URL仓库为集群提供对共享文件系统的只读访问权限。由于URL仓库始终是只读的,因此它们是注册只读共享文件系统仓库的一种更安全、更方便的替代方案。

使用 Kibana 或 创建快照仓库 API 来注册一个 URL 仓库。

PUT _snapshot/my_read_only_url_repository
{
  "type": "url",
  "settings": {
    "url": "file:/mount/backups/my_fs_backup_location"
  }
}

仓库设置

edit
chunk_size
(可选, 字节值) 快照中文件的最大大小。在快照中,大于此大小的文件将被分解为该大小或更小的块。默认为 null(无限制文件大小)。
http_max_retries
(可选,整数) httphttps URL 的最大重试次数。 默认为 5
http_socket_timeout
(可选,时间值) 连接上数据传输的最大等待时间。默认为 50s
compress
(可选, 布尔值) 如果为true,元数据文件(如索引映射和设置)在快照中会被压缩。数据文件不会被压缩。默认为true
max_number_of_snapshots
(可选, 整数) 仓库可以包含的最大快照数量。 默认为 Integer.MAX_VALUE,即 2^31-12147483647
max_restore_bytes_per_sec
(可选, 字节值) 每个节点的最大快照恢复速率。默认为无限制。请注意,恢复也受恢复设置的限制。
max_snapshot_bytes_per_sec
(可选, 字节值) 每个节点的最大快照创建速率。默认值为每秒 40mb。 请注意,如果设置了托管服务的恢复设置, 则默认情况下速率不受限制,并且还会通过恢复设置进行限制。
url

(必需,字符串) 共享文件系统存储库根目录的URL位置。支持以下协议:

  • file
  • ftp
  • http
  • https
  • jar

使用 httphttpsftp 协议的URL必须通过 repositories.url.allowed_urls 集群设置明确允许。此设置支持在URL的主机、路径、查询或片段部分使用通配符。

使用 file 协议的URL必须指向集群中所有主节点和数据节点都可访问的共享文件系统的位置。此位置必须在 path.repo 设置中注册。您不需要在 path.repo 设置中注册使用 ftphttphttpsjar 协议的URL。

仅源代码仓库

edit

您可以使用仅源代码仓库来获取最小化的、仅源代码的快照,这些快照比常规快照节省多达50%的磁盘空间。

与其他仓库类型不同,仅源仓库不直接存储快照。它将存储委托给另一个已注册的快照仓库。

当您使用仅源代码仓库创建快照时,Elasticsearch会在委派的存储仓库中创建一个仅源代码快照。此快照仅包含存储的字段和元数据。它不包括索引或文档值结构,并且在恢复时不能立即搜索。要搜索恢复的数据,您首先需要将其重新索引到一个新的数据流或索引中。

仅当启用了 _source 字段且未应用源过滤时,才支持仅源快照。 因此,采用合成源的索引无法恢复。当你恢复仅源快照时:

  • 恢复的索引是只读的,只能服务于match_all搜索或滚动请求以启用重新索引。
  • 不支持除match_all_get请求以外的查询。
  • 恢复的索引的映射是空的,但原始映射可以从类型的顶级meta元素中获得。
  • 由于这些索引不包含检索此类信息的相关数据结构,因此无法获取文档数量、已删除文档数量和存储大小等信息。因此,在诸如cat indices API等API中不会显示此类索引的这些信息。

在注册仅源代码库之前,使用 Kibana 或 创建快照仓库 API 注册另一种类型的快照仓库以用于存储。然后注册仅源代码库,并在请求中指定委派的存储仓库。

PUT _snapshot/my_src_only_repository
{
  "type": "source",
  "settings": {
    "delegate_type": "fs",
    "location": "my_backup_repository"
  }
}

仓库设置

edit
chunk_size
(可选, 字节值) 快照中文件的最大大小。在快照中,大于此大小的文件将被拆分为此大小或更小的块。默认为 null(无限制文件大小)。
compress
(可选,布尔值) 如果为true,快照中的元数据文件(如索引映射和设置)将被压缩。数据文件不会被压缩。默认为true
delegate_type

(可选,字符串) 委托的存储库类型。有关有效值,请参阅 type 参数

source 仓库可以使用 settings 属性来指定其委托仓库的类型。请参阅 仅源仓库

max_number_of_snapshots
(可选, 整数) 仓库可以包含的最大快照数量。 默认为 Integer.MAX_VALUE,即 2^31-12147483647
max_restore_bytes_per_sec
(可选, 字节值) 每个节点的最大快照恢复速率。默认为无限制。请注意,恢复也受恢复设置的限制。
max_snapshot_bytes_per_sec
(可选, 字节值) 每个节点的最大快照创建速率。默认值为每秒 40mb。 请注意,如果设置了托管服务的恢复设置, 则默认情况下速率不受限制,并且还会通过恢复设置进行限制。
readonly

(可选,布尔值) 如果为true,则该仓库是只读的。集群可以从该仓库中检索和恢复快照,但不能向该仓库写入数据或在其中创建快照。

只有具有写访问权限的集群才能在存储库中创建快照。连接到存储库的所有其他集群应将readonly参数设置为true

如果为false,集群可以写入仓库并在其中创建快照。 默认为false

如果你在多个集群中注册相同的快照仓库,只有一个集群应该对该仓库具有写权限。多个集群同时写入仓库可能会导致仓库内容损坏。