共享文件系统存储库

编辑

仅当您在自己的硬件上运行 Elasticsearch 时,此存储库类型才可用。如果您使用 Elasticsearch Service,请参阅Elasticsearch Service 存储库类型

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

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

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

Linux 和 macOS 安装支持 Unix 样式路径

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

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

resp = client.snapshot.create_repository(
    name="my_fs_backup",
    repository={
        "type": "fs",
        "settings": {
            "location": "/mount/backups/my_fs_backup_location"
        }
    },
)
print(resp)
const response = await client.snapshot.createRepository({
  name: "my_fs_backup",
  repository: {
    type: "fs",
    settings: {
      location: "/mount/backups/my_fs_backup_location",
    },
  },
});
console.log(response);
PUT _snapshot/my_fs_backup
{
  "type": "fs",
  "settings": {
    "location": "/mount/backups/my_fs_backup_location"
  }
}

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

resp = client.snapshot.create_repository(
    name="my_fs_backup",
    repository={
        "type": "fs",
        "settings": {
            "location": "my_fs_backup_location"
        }
    },
)
print(resp)
response = client.snapshot.create_repository(
  repository: 'my_fs_backup',
  body: {
    type: 'fs',
    settings: {
      location: 'my_fs_backup_location'
    }
  }
)
puts response
const response = await client.snapshot.createRepository({
  name: "my_fs_backup",
  repository: {
    type: "fs",
    settings: {
      location: "my_fs_backup_location",
    },
  },
});
console.log(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 存储库

resp = client.snapshot.create_repository(
    name="my_fs_backup",
    repository={
        "type": "fs",
        "settings": {
            "location": "my_fs_backup_location",
            "readonly": True
        }
    },
)
print(resp)
response = client.snapshot.create_repository(
  repository: 'my_fs_backup',
  body: {
    type: 'fs',
    settings: {
      location: 'my_fs_backup_location',
      readonly: true
    }
  }
)
puts response
const response = await client.snapshot.createRepository({
  name: "my_fs_backup",
  repository: {
    type: "fs",
    settings: {
      location: "my_fs_backup_location",
      readonly: true,
    },
  },
});
console.log(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 设置中注册。与 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 报告问题,那么您可以通过直接在文件系统上执行类似操作来在 Elasticsearch 外部重现此问题。

如果验证存储库或存储库分析 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 首先锁定基础文件,然后在同一锁下写入更新后的内容。这确保了文件在此期间没有被更改。