【问题标题】:Elasticsearch snapshots弹性搜索快照
【发布时间】:2020-10-23 11:13:32
【问题描述】:

我有很多 (10+) 个 Elasticsearch 集群,这些集群用于不同的目的(存储日志、存储一些业务和分析数据) 例如,我有一个 3 节点的弹性搜索集群,用于一些业务数据(电子商务网站中的用户购物车),我每天拍摄快照 这个集群为 NFS 共享创建快照,我的管理员告诉我,我必须从快照存储库中清除最后 10 个快照以释放磁盘空间。 例如,某人/或我不小心启动了curl -XDELETE/*,它删除了我集群中的所有索引,我必须恢复这里的所有业务数据,而我最近 10 天只有 10 个快照,我可以恢复所有数据吗?还是仅从上次快照日期恢复数据?因为在文件中说 Snapshots are incremental: each snapshot only stores data that is not part of an earlier snapshot 例如,我网站上的客户 Joe 在 2020 年 1 月 9 日向购物车添加了一些东西,然后在 2020 年 9 月 15 日,我从集群中删除了所有数据,我在快照存储库中的最后一个快照是 /03/09/2020 所以如果我从这个快照恢复,这个快照是否会包含旧数据? 对不起我的英语不好

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    了解这一点的一个有趣的测试是执行以下过程:

    1. 创建索引
    2. 索引一个文档
    3. 创建第一个快照 A
    4. 索引第二个文档
    5. 创建第二个快照 B
    6. 删除第一个快照A
    7. 删除索引
    8. 恢复快照 B

    你认为第一个文件已经消失了吗?让我们找出来......这里是重现上述过程的所有步骤:

    # 1. create an index
    PUT test
    
    # 2. index one document
    PUT test/_doc/1
    {
      "id": 1
    }
    
    # 3. create a first snapshot A
    PUT /_snapshot/my-snapshots/snapshot_a?wait_for_completion=true
    {
      "indices": "test",
      "ignore_unavailable": true,
      "include_global_state": false
    }
    
    # 4. index a second document
    PUT test/_doc/2
    {
      "id": 2
    }
    
    # 5. create a second snapshot B
    PUT /_snapshot/my-snapshots/snapshot_b?wait_for_completion=true
    {
      "indices": "test",
      "ignore_unavailable": true,
      "include_global_state": false
    }
    
    # 6. delete the first snapshot A
    DELETE /_snapshot/my-snapshots/snapshot_a
    
    # 7. delete the index
    DELETE test
    
    # 8. restore the snapshot B
    POST /_snapshot/found-snapshots/snapshot_b/_restore
    
    # 9. And now check the content of the index
    GET test/_search
    
    =>
        "hits" : [
          {
            "_index" : "test",
            "_type" : "_doc",
            "_id" : "1",
            "_score" : 1.0,
            "_source" : {
              "id" : 1
            }
          },
          {
            "_index" : "test",
            "_type" : "_doc",
            "_id" : "2",
            "_score" : 1.0,
            "_source" : {
              "id" : 2
            }
          }
        ]
    

    因此,最重要的是旧文档仍包含在较新的快照中,删除旧快照并不意味着删除旧文档。

    快照包含创建快照时存在的所有分片段文件的精确副本。随着时间的推移,较小的段文件会得到merged into bigger ones。当下一个快照发生时,它将复制较新的较大段文件,而较旧的快照仍将包含较旧的较小段文件。

    但是,这并不意味着只保留最新的快照并认为所有数据都在其中总是安全的,但是如果您每天进行快照,我认为只保留最后 10 个快照是安全的,并且期望所有数据都在那里。

    最后值得注意的是,当你delete a snapshot时,ES 会删除所有与快照关联的未被其他快照使用的文件,这基本上使删除快照本质上是安全的。

    【讨论】:

    • 谢谢!但我真的不清楚,因为如果你从集群中删除所有数据以及所有快照,数据将如何存在?快照是增量的,并且只包含以前的快照没有的数据
    • 如果你删除了所有的快照,那么你就没有任何东西可以恢复了。
    • 快照是增量的,但也有点重叠,因为段是如何合并的......绝对有可能(并且大多数情况下)T+1 的快照包含已经存在的数据在快照 T 和 T-1 中
    • 位重叠意味着备份不会复制相同的段,而是引用相同的段,如果已经作为早期备份的一部分存在?感谢您的回答。
    • 有点重叠意味着旧快照中存在的段可能包含也包含在来自较新快照的合并段中的数据。在某些时候,随着段的合并,冗余数据会被清理
    【解决方案2】:

    Elasticsearch 快照是触发创建快照时集群数据的精确副本。

    所以是的,如果您恢复 2020 年 3 月 9 日拍摄的快照将包含旧数据。恢复快照后集群的内容将与您在 2020 年 3 月 9 日触发创建快照时完全相同

    你问了很多问题,我来一一解答吧:

    第一季度。我的管理员告诉我,我必须从 快照存储库以释放磁盘空间。例如 某人/或我不小心启动 curl -XDELETE/* 删除所有 我的集群中的索引,我必须恢复所有业务数据 在这里,我只有前 10 天的 10 张快照,我可以 恢复所有数据?

    A1。如果您删除了所有 10 个可用快照,那么您的存储库中将没有快照。由于您的存储库中没有任何快照,因此您将无法恢复。 要从快照中恢复,您必须在存储库中有快照。您可以通过GET /_cat/snapshots/<repository> 查看存储库中可用快照的列表

    第二季度。它仅从上次快照日期恢复数据?

    A2。 否。无论您尝试从哪个快照还原,如果该快照存在于您的存储库中,那么它将从给定的快照中恢复数据。如果是全集群还原,那么正如我之前提到的,集群的内容将与您触发创建快照时完全相同。

    第三季度。例如,我网站上的客户 Joe 添加了一些内容 购物车于 2020 年 1 月 9 日,然后在 2020 年 9 月 15 日,我删除了所有数据 集群,我在快照存储库中的最后一个快照是 /03/09/2020 所以 如果我从这个快照恢复,这个快照将包含旧数据 还是不行?

    A3。 是的,此快照也将包含 01/09/2020 的旧数据,因为当您在 03/09/2020 创建快照时,集群中存在 01/09/2020 的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 2020-02-22
      • 2021-11-23
      相关资源
      最近更新 更多