Elasticsearch跨集群数据迁移

112 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

下载并安装HDFS插件

所有ES节点均需要安装该插件

①下载插件:artifacts.elastic.co/downloads/e…

②将插件上传到对应的服务器上

③安装插件:sudo sh bin/elasticsearch-plugin install file:////path/to/plugin.zip

如果需要卸载插件则使用 remove命令

sudo sh bin/elasticsearch-plugin remove repository-hdfs

④安装完插件后,集群的各个节点需要重启,以此来让插件生效

HDFS的存储库

我们需要先创建一个(或多个)存储库,才能进行快照。

①创建仓库

PUT _snapshot/my_hdfs_repository
{
  "type": "hdfs",
  "settings": {
    "uri": "hdfs://namenode:8020/",
    "path": "elasticsearch/repositories/my_hdfs_repository"
  }
}

其中,my_hdfs_repository为我们自定义的 HDFS 存储库的名称,hdfs://namenode:8020/为访问 HDFS 集群的地址。如果上述命令执行成功,则会返回

{
	acknowledge: ture
}

除此之外,在创建 HDFS 存储库的时候,还可以指定其他参数,如快照的速度等,具体可参考「Configuration Properties」文档。

②查询仓库

GET  _snapshot

③注销仓库

DELETE _snapshot/仓库名称

快照

①创建快照

PUT _snapshot/仓库名称/快照名称?wait_for_completion=true
{
  "indices": "index_1,index_2",
  "ignore_unavailable": true,
  "include_global_state": false,
  "metadata": {
    "taken_by": "kimchy",
    "taken_because": "backup test"
  }
}

其中:

  • wait_for_completion=true参数表示阻塞该操作,直到该操作执行完成之后在返回。
  • indices参数标识给哪些索引拍摄快照,如果不写,则是给所有索引拍摄快照
  • ignore_unavailable将其设置为true将会在创建快照时忽略不存在的索引。默认情况下,当ignore_unavailable选项未设置且索引丢失时,快照请求将失败。
  • include_global_state设置为false,可以防止集群全局状态存储为快照的一部分
  • metadata可用于将任意元数据附加到快照。这可能是谁拍摄了快照的记录,为什么拍摄,或任何其他可能有用的数据。

②查询快照

GET _snapshot/仓库名称/快照名称

③查询快照状态

GET _snapshot/快照名称/_status

④删除快照

DELETE _snapshot/仓库名称/快照名称

还原

索引快照的还原,可以分为两种情况,分别是:

  • 在同一个集群还原快照;
  • 在不同的集群还原快照。

无论是否跨集群还原快照,其操作命令都是一样,即

POST _snapshot/仓库名称/快照名称/_restore?wait_for_completion=true
{
  "indices": "cars",    //指定索引恢复,不指定就是所有
  "ignore_unavailable": true,     //忽略恢复时异常索引
  "include_global_state": false    //是否存储全局转态信息,fasle代表有一个或几个失败,不会导致整个任务失败
}

此外,还可以在恢复的过程中,修改index的一些设置,比如下面的命令:

POST /_snapshot/my_hdfs_repository/snapshot_2/_restore
{
  "indices": "index_1",
  "index_settings": {
    "index.number_of_replicas": 0,
    "index.routing.allocation.include._name": "node-1,node-2,node-3,node-4,node-5,node-6"
  },
  "ignore_index_settings": [
    "index.refresh_interval"
  ]
}

由于快照包含构成索引的磁盘上数据结构的副本,因此快照只能还原到可以读取索引的 Elasticsearch 版本:

  • 6.x中创建的索引快照可以还原到7.0.0
  • 5.x中创建的索引快照可以还原到6.x
  • 2.x中创建的索引快照可以还原到5.x
  • 1.x中创建的索引快照可以还原到2.x

5.x及之前版本的索引快照不能还原到7.0.0版本,具体可以参阅「Snapshot And Restore」,其给出了最新版本的兼容性说明。要注意,每个快照可以包含在不同版本的 Elasticsearch 中创建的索引,并且在还原快照时,必须确定能够将所有索引还原到目标集群中;否则的话,如果快照中的任何索引是在不兼容的版本中创建的,则无法还原快照。

除此之外,在跨集群还原索引快照的时候,我们需要在目标集群中创建与原始集群具体相同名称的存储库。例如,

PUT localhost1:9200: _snapshot/my_hdfs_repository
{
  "type": "hdfs",
  "settings": {
    "uri": "hdfs://namenode:8020/",
    "path": "elasticsearch/repositories/my_hdfs_repository"
  }
}

如上述命令所示,假设我们在原始集群中创建了名为my_hdfs_repository的存储库,并且想将其存储的索引快照还原到目标集群,则需要在目标集群中创建如下存储库:

PUT localhost2:9200: _snapshot/my_hdfs_repository
{
  "type": "hdfs",
  "settings": {
    "uri": "hdfs://namenode:8020/",
    "path": "elasticsearch/repositories/my_hdfs_repository"
  }
}

如果我们仔细观察上面的两条命令,我们会发现,两者的区别仅在于localhost1localhost2的不同。但是有一点需要我们特别注意,那就是:两个集群的节点配置一定要相同,如果原始集群在节点中使用node.attr.rack划分了hotwarm属性,那么在目标集群也需要划分对应的属性,否则会还原失败

【补充】

在数据还原的过程中,可能会出现意料之外的情况。所以需要了解一下用来帮助我们排查问题的相关查询

①查看分配失败的原因

GET _cluster/allocation/explain?pretty

②查看未分配的分片

GET _cat/shards?v=true&h=index,shard,prirep,state,node,unassigned.reason&s=state

几个参数解释如下:

  • v=true, 代表显示字段含义;否则首行内容不显示。
  • h=*,代表列名;
  • s=state,代表基于state方式排序。等价于:s=state:asc,默认升序方式排序。
  • prirep,代表分片类型。p:代表主分片;r:代表副本分片。

③查看未分配的分片原因

GET _cluster/allocation/explain?filter_path=index,node_allocation_decisions.node_name,node_allocation_decisions.deciders.*
{
  "index": "order_info",
  "shard": 0,
  "primary": false
}

上面的几个参数解释如下:

  • index:索引名称,建议结合前一步指定。
  • shard:分片序号。从 0 开始计数。
  • primary:是否主分片;true 代表false 代表

③分片重新分配

POST _cluster/reroute?retry_failed=true