Elasticsearch集群数据备份与恢复 Snapshot & Restore

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Elasticsearch集群数据备份与恢复 Snapshot & Restore

简介

  • Elasticsearch 拥有副本机制来保障集群的高可用,然而无法解决如下情况的数据丢失:
  • 主副本所在机器存储全部损坏。
  • 误删除索引数据。
  • 升级失败,数据无法回滚。
  • 定期对数据做备份,按需恢复可以很好的解决如上问题。
  • Elasticsearch 提供了 Snapshot 和 Restore API 用于对集群数据完成备份与恢复。
  • 数据备份的过程可以简单理解成将本地数据文件同步到远程仓库(repository) 的过程。
  • 支持全量和增量备份。
  • repository 常见有如下类型: fs / S3 / HDFS / Azure / Google Cloud Storage。

实战

1 创建原始索引并导入数据

PUT _template/blog-template
{
  "index_patterns": [
    "blog-*"
  ],
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  },
  "mappings": {
    "dynamic_templates": [
      {
        "integers": {
          "match": "int_*",
          "mapping": {
            "type": "integer"
          }
        }
      },
      {
        "strings": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }
    ],
    "properties": {
      "title": {
        "type": "text"
      }
    }
  }
}
PUT blog-test
POST blog-test/_bulk
{"index":{}}
{"title":"elasticsearch best practice","author_firstname":"tony","author_lastname":"song","tags":"elasticsearch ,logstash","int_age":18,"locale":"zh,en"}
{"index":{}}
{"title":"elastic stack release V5","author_firstname":"shay","author_lastname":"banon","tags":"elk ,elasticsearch,release","int_age":28,"locale":"zhc,en"}
{"index":{}}
{"title":"kibana tutorial","author_firstname":"zen","author_lastname":"wei","tags":"","int_age":38,"locale":"zhc,en"}
GET blog-test
GET blog-test/_search

2 修改elasticsearch配置文件

修改 elasticsearch.yml 配置文件,增加如下配置:

path.repo: ["/home/elastic/backup"]

重启elasticsearch进程,查看创建的repo:

GET _cluster/settings?include_defaults&filter_path=*.path.repo
#输出结果:
{
  "defaults" : {
    "path" : {
      "repo" : [
        "/home/elastic/backup"
      ]
    }
  }
}

3 创建关联 repository

#创建关联 repository
PUT /_snapshot/my_fs_backup
{
    "type": "fs",
    "settings": {
        "location": "/home/elastic/backup/my_fs_backup",
        "compress": true
    }
}

查看创建的关联:

GET _snapshot/my_fs_backup
#输出结果:
{
  "my_fs_backup" : {
    "type" : "fs",
    "settings" : {
      "compress" : "true",
      "location" : "/home/elastic/backup/my_fs_backup"
    }
  }
}

查看在哪个node上创建了关联:

POST _snapshot/my_fs_backup/_verify
#输出结果
{
  "nodes" : {
    "pMrJwVGSQcSgeTZdh61QRw" : {
      "name" : "node1"
    }
  }
}

4 执行 snapshot

  • indices:做快照的索引。
  • wait_for_completion=true:是否等待完成快照后再响应,如果为true会等快照完成后才响应。(默认为false,不等快照完成立即响应)
  • ignore_unavailable: 设置为true时,当创建快照时忽略不存在的索引。
  • include_global_state: 设置为false时,当某个索引所有的主分片不是全部的都可用时,可以完成快照。
#创建snapshot_1对blog-test索引做快照
PUT /_snapshot/my_fs_backup/snapshot_1?wait_for_completion=true
{
  "indices": "blog-test",
  "ignore_unavailable": true,
  "include_global_state": false
}

查看创建的快照:

GET /_snapshot/my_fs_backup/snapshot_*
#GET /_snapshot/my_fs_backup/_all 看所有的
#输出结果:
{
  "snapshots" : [
    {
      "snapshot" : "snapshot_1",
      "uuid" : "FEbAt3BiR1SAiBkO7pfoZg",
      "version_id" : 7020199,
      "version" : "7.2.1",
      "indices" : [
        "blog-test"
      ],
      "include_global_state" : false,
      "state" : "SUCCESS",
      "start_time" : "2021-02-06T03:28:40.001Z",
      "start_time_in_millis" : 1612582120001,
      "end_time" : "2021-02-06T03:28:40.213Z",
      "end_time_in_millis" : 1612582120213,
      "duration_in_millis" : 212,
      "failures" : [ ],
      "shards" : {
        "total" : 3,
        "failed" : 0,
        "successful" : 3
      }
    }
  ]
}

查看快照状态:

GET _snapshot/my_fs_backup/snapshot_1/_status
#输出结果:
{
  "snapshots" : [
    {
      "snapshot" : "snapshot_1",
      "repository" : "my_fs_backup",
      "uuid" : "FEbAt3BiR1SAiBkO7pfoZg",
      "state" : "SUCCESS",
      "include_global_state" : false,
      "shards_stats" : {
        "initializing" : 0,
        "started" : 0,
        "finalizing" : 0,
        "done" : 3,
        "failed" : 0,
        "total" : 3
      },
      "stats" : {
        "incremental" : {
          "file_count" : 12,
          "size_in_bytes" : 15608
        },
        "total" : {
          "file_count" : 12,
          "size_in_bytes" : 15608
        },
        "start_time_in_millis" : 1612582120074,
        "time_in_millis" : 108
      },
      "indices" : {
        "blog-test" : {
          "shards_stats" : {
            "initializing" : 0,
            "started" : 0,
            "finalizing" : 0,
            "done" : 3,
            "failed" : 0,
            "total" : 3
          },
          "stats" : {
            "incremental" : {
              "file_count" : 12,
              "size_in_bytes" : 15608
            },
            "total" : {
              "file_count" : 12,
              "size_in_bytes" : 15608
            },
            "start_time_in_millis" : 1612582120074,
            "time_in_millis" : 108
          },
          "shards" : {
            "0" : {
              "stage" : "DONE",
              "stats" : {
                "incremental" : {
                  "file_count" : 4,
                  "size_in_bytes" : 5104
                },
                "total" : {
                  "file_count" : 4,
                  "size_in_bytes" : 5104
                },
                "start_time_in_millis" : 1612582120143,
                "time_in_millis" : 39
              }
            },
            "1" : {
              "stage" : "DONE",
              "stats" : {
                "incremental" : {
                  "file_count" : 4,
                  "size_in_bytes" : 5265
                },
                "total" : {
                  "file_count" : 4,
                  "size_in_bytes" : 5265
                },
                "start_time_in_millis" : 1612582120074,
                "time_in_millis" : 25
              }
            },
            "2" : {
              "stage" : "DONE",
              "stats" : {
                "incremental" : {
                  "file_count" : 4,
                  "size_in_bytes" : 5239
                },
                "total" : {
                  "file_count" : 4,
                  "size_in_bytes" : 5239
                },
                "start_time_in_millis" : 1612582120113,
                "time_in_millis" : 21
              }
            }
          }
        }
      }
    }
  ]
}

5 恢复 snapshot

  • rename_pattern: 正则匹配原索引名
  • rename_replacement: 将匹配到的字段用于重命名新索引
POST _snapshot/my_fs_backup/snapshot_1/_restore
{
  "indices": "blog-test",
  "ignore_unavailable": true,
  "rename_pattern": "(.+)",
  "rename_replacement": "restored_$1"
}

查询新索引的数据:

GET restored_blog-test/_search
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
2月前
|
存储 负载均衡 Java
Elasticsearch集群面试系列文章一
【9月更文挑战第9天】Elasticsearch(简称ES)是一种基于Lucene构建的分布式搜索和分析引擎,广泛用于全文搜索、结构化搜索、分析以及日志实时分析等场景。
107 7
|
3月前
|
存储 缓存 监控
|
10天前
|
存储 监控 安全
Elasticsearch 集群
【11月更文挑战第3天】
86 54
|
3月前
|
存储 监控 负载均衡
检索服务elasticsearch集群(Cluster)
【8月更文挑战第23天】
63 3
|
6天前
|
监控 API 索引
Elasticsearch集群健康检查
【11月更文挑战第4天】
22 3
|
1月前
|
存储 缓存 监控
深入解析:Elasticsearch集群性能调优策略与最佳实践
【10月更文挑战第8天】Elasticsearch 是一个分布式的、基于 RESTful 风格的搜索和数据分析引擎,它能够快速地存储、搜索和分析大量数据。随着企业对实时数据处理需求的增长,Elasticsearch 被广泛应用于日志分析、全文搜索、安全信息和事件管理(SIEM)等领域。然而,为了确保 Elasticsearch 集群能够高效运行并满足业务需求,需要进行一系列的性能调优工作。
84 3
|
1月前
|
SQL 分布式计算 NoSQL
大数据-170 Elasticsearch 云服务器三节点集群搭建 测试运行
大数据-170 Elasticsearch 云服务器三节点集群搭建 测试运行
41 4
|
2月前
|
存储 自然语言处理 关系型数据库
ElasticSearch基础3——聚合、补全、集群。黑马旅游检索高亮+自定义分词器+自动补全+前后端消息同步
聚合、补全、RabbitMQ消息同步、集群、脑裂问题、集群分布式存储、黑马旅游实现过滤和搜索补全功能
ElasticSearch基础3——聚合、补全、集群。黑马旅游检索高亮+自定义分词器+自动补全+前后端消息同步
|
3月前
|
存储 监控 负载均衡
Elasticsearch 集群副本
【8月更文挑战第24天】
73 13
|
3月前
|
存储 负载均衡 监控
Elasticsearch 集群分片
【8月更文挑战第24天】
84 12