共享文件系统存储库编辑

此存储库类型仅在您在自己的硬件上运行 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 设置中的第一个值解析路径。

response = client.snapshot.create_repository(
  repository: 'my_fs_backup',
  body: {
    type: 'fs',
    settings: {
      location: 'my_fs_backup_location'
    }
  }
)
puts response
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 存储库

response = client.snapshot.create_repository(
  repository: 'my_fs_backup',
  body: {
    type: 'fs',
    settings: {
      location: 'my_fs_backup_location',
      readonly: true
    }
  }
)
puts response
PUT _snapshot/my_fs_backup
{
  "type": "fs",
  "settings": {
    "location": "my_fs_backup_location",
    "readonly": true
  }
}

存储库设置编辑

chunk_size
(可选,字节值) 快照中文件的大小上限。在快照中,大于此大小的文件将被分解成此大小或更小的块。默认为 null(无限制的文件大小)。
compress
(可选,布尔值) 如果为 true,则元数据文件(如索引映射和设置)将在快照中被压缩。数据文件不会被压缩。默认为 true
location
(必需,字符串) 用于存储和检索快照的共享文件系统的路径。此路径必须在集群中所有主节点和数据节点上的 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

如果您使用多个集群注册相同的快照存储库,则只有一个集群应该对存储库具有写访问权限。让多个集群同时写入存储库可能会损坏存储库的内容。

排查共享文件系统存储库问题编辑

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

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

如果验证存储库或存储库分析 API 失败并出现错误,表明权限不足,则调整操作系统中存储库的配置,以赋予 Elasticsearch 适当的访问级别。要直接重现此类问题,请在与 Elasticsearch 运行相同的安全上下文中执行与 Elasticsearch 相同的操作。例如,在 Linux 上,使用 su 等命令切换到 Elasticsearch 运行的用户。

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

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

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

线性化寄存器实现编辑

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