诊断损坏的存储库
编辑诊断损坏的存储库
编辑多个 Elasticsearch 部署正在写入同一个快照存储库。Elasticsearch 不支持这种配置,只允许一个集群写入同一个存储库。有关存储库内容损坏的潜在副作用,请参阅存储库内容,以下指南可能无法解决这些副作用。要纠正这种情况,请将存储库标记为只读,或将其从所有其他部署中删除,然后在当前部署中重新添加(重新创建)该存储库。
修复损坏的存储库需要在写入同一快照存储库的多个部署中进行更改。只有一个部署必须写入存储库。我们将保持写入存储库的部署称为“主要”部署(当前集群),而将我们要将存储库标记为只读的其他部署称为“次要”部署。
首先在次要部署上将存储库标记为只读
使用 Kibana
- 登录到 Elastic Cloud 控制台。
-
在 Elasticsearch 服务 面板上,单击你的部署名称。
如果你的部署名称被禁用,则你的 Kibana 实例可能不健康,在这种情况下,请联系 Elastic 支持。如果你的部署不包括 Kibana,你需要做的就是先启用它。
-
打开你的部署的侧边导航菜单(位于左上角的 Elastic 徽标下),然后转到 堆栈管理 > 快照和还原 > 存储库。
- 现在应该可以看到存储库表。单击要标记为只读的存储库右侧的铅笔图标。在打开的“编辑”页面上,向下滚动并选中“只读存储库”。单击“保存”。或者,如果更希望完全删除存储库,请在存储库表中选中存储库名称左侧的复选框,然后单击表左上角的“删除存储库”红色按钮。
此时,只有主要(当前)部署的存储库被标记为可写。Elasticsearch 将其视为损坏,因此需要删除该存储库并重新添加,以便 Elasticsearch 可以恢复使用它
请注意,我们现在正在配置主要(当前)部署。
-
打开主要部署的侧边导航菜单(位于左上角的 Elastic 徽标下),然后转到 堆栈管理 > 快照和还原 > 存储库。
- 单击存储库右侧的铅笔图标。在打开的“编辑”页面上,向下滚动并单击“保存”,而无需对现有设置进行任何更改。
修复损坏的存储库需要在写入同一快照存储库的多个集群中进行更改。只有一个集群必须写入存储库。让我们将要保持写入存储库的集群称为“主要”集群(当前集群),而将我们要将存储库标记为只读的其他集群称为“次要”集群。
让我们首先处理次要集群
-
获取存储库的配置
resp = client.snapshot.get_repository( name="my-repo", ) print(resp)
response = client.snapshot.get_repository( repository: 'my-repo' ) puts response
const response = await client.snapshot.getRepository({ name: "my-repo", }); console.log(response);
GET _snapshot/my-repo
响应将如下所示
-
使用上面检索到的设置,添加
readonly: true
选项将其标记为只读resp = client.snapshot.create_repository( name="my-repo", repository={ "type": "s3", "settings": { "bucket": "repo-bucket", "client": "elastic-internal-71bcd3", "base_path": "myrepo", "readonly": True } }, ) print(resp)
const response = await client.snapshot.createRepository({ name: "my-repo", repository: { type: "s3", settings: { bucket: "repo-bucket", client: "elastic-internal-71bcd3", base_path: "myrepo", readonly: true, }, }, }); console.log(response);
-
或者,使用以下命令删除存储库也是一种选择
resp = client.snapshot.delete_repository( name="my-repo", ) print(resp)
response = client.snapshot.delete_repository( repository: 'my-repo' ) puts response
const response = await client.snapshot.deleteRepository({ name: "my-repo", }); console.log(response);
DELETE _snapshot/my-repo
响应将如下所示
{ "acknowledged": true }
此时,只有主要(当前)集群的存储库被标记为可写。但是,Elasticsearch 认为它已损坏,因此让我们重新创建它,以便 Elasticsearch 可以恢复使用它。请注意,我们现在正在配置主要(当前)集群
-
获取存储库的配置并保存其配置,因为我们将使用它来重新创建存储库
resp = client.snapshot.get_repository( name="my-repo", ) print(resp)
response = client.snapshot.get_repository( repository: 'my-repo' ) puts response
const response = await client.snapshot.getRepository({ name: "my-repo", }); console.log(response);
GET _snapshot/my-repo
-
使用我们上面获得的配置,让我们重新创建存储库
resp = client.snapshot.create_repository( name="my-repo", repository={ "type": "s3", "settings": { "bucket": "repo-bucket", "client": "elastic-internal-71bcd3", "base_path": "myrepo" } }, ) print(resp)
const response = await client.snapshot.createRepository({ name: "my-repo", repository: { type: "s3", settings: { bucket: "repo-bucket", client: "elastic-internal-71bcd3", base_path: "myrepo", }, }, }); console.log(response);
PUT _snapshot/my-repo { "type": "s3", "settings": { "bucket": "repo-bucket", "client": "elastic-internal-71bcd3", "base_path": "myrepo" } }
响应将如下所示
{ "acknowledged": true }