通过SnapShot迁移静态ES索引

迁移规划

由于规划,目前需要将北京ElasticSearch 迁移至 上海 ElasticSearch, 原则上迁移应尽可能的快,同时迁移期间应不影响现有业务数据,最好不要对待迁移资源有过多的访问,以及业务代码层面应该维持不变,

仅对底层数据源做切换。

迁移流程

迁移过程中将数据区分为增量数据,存量数据,并进行区别对待。针对数据的类型,通过不同的方式,介质迁移至上海新ElasticSearch 集群。

存量数据

存量数据使用ElasticSearch本身的备份机制,将备份存储至OSS 对象存储, 同时在上海集群中通过OSS 对象存储 执行索引恢复动作,从而达到迁移的目的。

主要步骤如下:

1.在待备份ElasticSearch集群创建备份仓库,指定备份仓库的存储地址为OSS,并配置指定的信息。

PUT _snapshot/bj_es_snapshot
{
    "type": "oss",  //仓库存储类型为 oss, 也可以指定其他的类型,fs, s3....
    "settings": {
        "endpoint": "http://oss-cn-beijing.aliyuncs.com", // 根据不同的 type, 配置不同的参数即可
        "access_key_id": "***",
        "secret_access_key": "***",
        "bucket": "bj-es-transfer-sh",
        "compress": true 
    }
}

2.在待备份ElasticSearch集群备份指定索引, 同时指定在指定仓库(bj_es_snapshot)中,当前备份的名字(snapshot_20200722_note_comment)

PUT _snapshot/bj_es_snapshot/snapshot_20200722_note_comment
{
   "indices": "note_comment"
}

3.查看备份的状态,需要指定在指定仓库,指定备份。

GET /_snapshot/bj_es_snapshot/snapshot_20200722_note_comment/_status

返回值大概如下所示

{
  "snapshots": [
    {
      "snapshot": "snapshot_20200722_note_comment",
      "repository": "bj_es_snapshot",
      "uuid": "_aU8yiywSmSgA6YluetXoA",
      "state": "SUCCESS",
      "shards_stats": {
        "initializing": 0,
        "started": 0,
        "finalizing": 0,
        "done": 5,
        "failed": 0,
        "total": 5
      },
      "stats": {
        "number_of_files": 573,
        "processed_files": 573,
        "total_size_in_bytes": 6055684624,
        "processed_size_in_bytes": 6055684624,
        "start_time_in_millis": 1595399266865,
        "time_in_millis": 116151
      },
      "indices": {
        "note_comment": {
          "shards_stats": {
            "initializing": 0,
            "started": 0,
            "finalizing": 0,
            "done": 5,
            "failed": 0,
            "total": 5
          },
          "stats": {
            "number_of_files": 573,
            "processed_files": 573,
            "total_size_in_bytes": 6055684624,
            "processed_size_in_bytes": 6055684624,
            "start_time_in_millis": 1595399266865,
            "time_in_millis": 116151
          },
          "shards": {
            "0": {
              "stage": "DONE",
              "stats": {
                "number_of_files": 129,
                "processed_files": 129,
                "total_size_in_bytes": 1188725503,
                "processed_size_in_bytes": 1188725503,
                "start_time_in_millis": 1595399267060,
                "time_in_millis": 111677
              }
            },
            "1": {
              "stage": "DONE",
              "stats": {
                "number_of_files": 126,
                "processed_files": 126,
                "total_size_in_bytes": 1305824139,
                "processed_size_in_bytes": 1305824139,
                "start_time_in_millis": 1595399267062,
                "time_in_millis": 115954
              }
            },
            "2": {
              "stage": "DONE",
              "stats": {
                "number_of_files": 90,
                "processed_files": 90,
                "total_size_in_bytes": 1113769915,
                "processed_size_in_bytes": 1113769915,
                "start_time_in_millis": 1595399267024,
                "time_in_millis": 105830
              }
            },
            "3": {
              "stage": "DONE",
              "stats": {
                "number_of_files": 115,
                "processed_files": 115,
                "total_size_in_bytes": 1253077381,
                "processed_size_in_bytes": 1253077381,
                "start_time_in_millis": 1595399267044,
                "time_in_millis": 114764
              }
            },
            "4": {
              "stage": "DONE",
              "stats": {
                "number_of_files": 113,
                "processed_files": 113,
                "total_size_in_bytes": 1194287686,
                "processed_size_in_bytes": 1194287686,
                "start_time_in_millis": 1595399266865,
                "time_in_millis": 31435
              }
            }
          }
        }
      }
    }
  ]
}

主要观察,shards_stats 中, total 和 done 是不是相等,同时需要关注是否有失败的 shard, 如果done < total, 那么需要等待,或者存在 failed 那么需要排查失败的原因,同时再次进行备份,直至完全成功为止。

4.当观察到索引的所有shard都备份完毕,同时不存在失败的时候,那么就可以在新集群中执行恢复动作了。

4.1首先需要在新集群中新建相应的仓库,其中仓库的配置以及相关信息需要和源集群中创建的配置相同,因为之后需要从该仓库中进行恢复。也就是和集群中创建的仓库相同即可。

4.2执行回放动作即可, 需要指定 仓库名称,备份名称。

4.3.持续观察回放进度,待回放完成即可。即该命令的返回值中 percent 达到 100% 即可。

展开原码

4.4抽查相关数据,进行对比,以及查看数据条数总量,占用存储大小。无误即可。

增量数据

在备份开始前,可以将操作动作,同步至mq,同时原有索引正常使用,存量使用备份进行迁移,迁移完毕之后,消费mq, 待消费完积压数据,索引双写,

查询切换索引,进行数据验证,验证无误之后,迁移完毕,后续可停掉mq, 废弃原有索引。迁移完成。

相关点

备份,以及回放,总有一端可以使用oss 的内网进行传输,可以进行权衡利弊,在哪一个方向需要更快的网速。

耗时相关

迁移 algorithm_cluster_experiment doc数量 4200W+, 48GB, 备份耗时 308455 Millis

posted @ 2020-09-04 15:15  jzczer  阅读(415)  评论(0编辑  收藏  举报