Elasticsearch快照备份之physical contents错误

2024-07-08 15:20:18 浏览数 (1)

问题背景:

在正常进行索引快照备份的过程中,快照备份任务突然失败。查询仓库,发现仓库不可用,并返回以下异常日志信息。

代码语言:txt复制
[xxxx_backup] Could not read repository data because the contents of the repository do not match its expected state. 
This is likely the result of either concurrently modifying the contents of the repository by a process other than this cluster or an issue with the repository's underlying storage. 
The repository has been disabled to prevent corrupting its contents. 
To re-enable it and continue using it please remove the repository from the cluster and add it again to make the cluster recover the known state of the repository from its physical contents.
异常状态示意图异常状态示意图

此时仓库的状态为:各节点连接仓库均正常,但是仓库无法检索快照,也无法继续向该仓库进行快照备份。

问题原因:

在快照进行写入时,由于其他服务进程也对该仓库进行了修改,导致仓库状态与Elasticsearch集群中存储的状态不一致,造成了仓库不可用。

1. 仓库内容被其他进程并发修改:这可能导致仓库状态与 Elasticsearch 预期的状态不一致。

2. 底层存储问题:可能是由于底层存储(如 NFS、S3 等)的问题导致。

解决思路:

当前项目集群使用的是NFS作为仓库存储介质,基于es构建类型为“Shared file system”的仓库。

1.移除并重新添加该快照仓库。

这样操作可以让Elasticsearch集群从物理内容恢复已知的仓库状态。

  • 删除仓库
代码语言:json复制
DELETE _snapshot/my_backup
  • 重建该仓库
代码语言:json复制
PUT _snapshot/my_backup
{
 "type": "fs", // 或其他仓库类型,例如 "s3"
 "settings": {
 "location": "/path/to/repository" // 或 S3 存储桶名称等
 }
}

这里我们删除仓库并进行重建一个相同的仓库,相当于让Elasticsearch重新刷新了对于该仓库的状态,同时该操作不会对仓库内的快照进行删除。

2.检查底层存储问题

主要排查底层存储如(NFS,S3等)存储介质没有任何问题。

  • nfs存储

如果使用nfs存储,检查nfs挂在是否正常,是否存在权限问题。

代码语言:bash复制
mount | grep nfs

可以在nfs挂载点上进行读写操作测试。

代码语言:bash复制
touch /path/to/repository/testfile
echo "test" > /path/to/repository/testfile

以确保没有任何权限错误。

  • S3存储

如果使用S3存储,需要确保存储桶与凭证没有任何问题。使用AWS CLI检查S3存储桶的可访问性。

代码语言:bash复制
aws s3 ls s3://my-bucket

3.检查并发访问

确保没有其他进程或集群在并发访问或修改快照仓库。如果有多个 Elasticsearch 集群在使用相同的快照仓库,可能会导致数据不一致问题。每个快照仓库应仅由一个集群使用。

4.检查Elasticsearch日志

通过日志,排查导致问题的可能原因。

代码语言:bash复制
sudo tail -f /var/log/elasticsearch/elasticsearch.log

如果上述方式都无法解决仓库错误,在考虑使用以下方式。

5.清理并初始化仓库

在某些情况下,可能需要手动清理仓库内容并重新初始化。注意,这会导致现有的快照数据丢失,请谨慎操作。

  • 1. 停止 Elasticsearch 集群:

在进行清理操作前,确保停止 Elasticsearch 集群,避免并发访问。

  • 2. 清理仓库内容:

手动删除仓库目录中的内容(如 NFS 挂载点中的文件):

代码语言:bash复制
sudo rm -rf /path/to/repository/*
  • 3. 重新初始化仓库:

启动 Elasticsearch 集群,并重新添加快照仓库。

0 人点赞