共享文件系统存储库
编辑共享文件系统存储库
编辑仅当您在自己的硬件上运行 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);
|
集群应仅注册一个特定的快照存储库存储桶一次。如果将同一个快照存储库注册到多个集群,则只有一个集群应具有对该存储库的写访问权限。在其他集群上,将存储库注册为只读。
这可以防止多个集群同时写入存储库并损坏存储库的内容。它还可以防止 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 } }
Windows 安装同时支持 DOS 和 Microsoft UNC 路径。转义路径中的任何反斜杠。对于 UNC 路径,请提供服务器和共享名称作为前缀。
在重启每个节点后,使用 Kibana 或创建快照存储库 API 注册存储库。注册存储库时,请指定文件系统的路径
resp = client.snapshot.create_repository( name="my_fs_backup", repository={ "type": "fs", "settings": { "location": "E:\\Mount\\Backups\\My_fs_backup_location" } }, ) print(resp)
response = client.snapshot.create_repository( repository: 'my_fs_backup', body: { type: 'fs', settings: { location: 'E:\\Mount\\Backups\\My_fs_backup_location' } } ) puts response
const response = await client.snapshot.createRepository({ name: "my_fs_backup", repository: { type: "fs", settings: { location: "E:\\Mount\\Backups\\My_fs_backup_location", }, }, }); console.log(response);
PUT _snapshot/my_fs_backup { "type": "fs", "settings": { "location": "E:\\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);
|
集群应仅注册一个特定的快照存储库存储桶一次。如果将同一个快照存储库注册到多个集群,则只有一个集群应具有对该存储库的写访问权限。在其他集群上,将存储库注册为只读。
这可以防止多个集群同时写入存储库并损坏存储库的内容。它还可以防止 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-1
或2147483647
。 -
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 首先锁定基础文件,然后在同一锁下写入更新后的内容。这确保了文件在此期间没有被更改。