一、背景

  • 有一个已经在A机器建立的100+G的es索引数据文件,需要将这份数据文件直接复制到B机器的elasticsearch中
  • B机器的节点是在一个集群中,有多个数据节点。
  • 没有原始数据,不重新构建新的索引。
  • 节点数据存放在es源文件的data文件夹中,索引数据存放目录结构依次为:/data/集群名/nodes/0/indices/索引名/分片数据,分片数据就是我们要移植的数据本体
  • 这个索引数据之前只在一个es上使用且出于写入速度考虑,只设置了分片,未设置副本
  • 要求能在B中识别和检索出这个索引 要复制的文件如下:

将es的数据保存到mysql中 es数据保存在哪里_数据

二、步骤

1、如果当前elasticsearch是以集群形式存在,只保留要数据所在的elasticsearch数据节点,其余数据节点关闭。

  • 例如:集群中有3台ip分别为192.168.2.1 ; 192.168.2.2 ; 192.168.2.3的数据节点机器,我们要往192.168.2.1的es中直接复制数据文件,先将.2和.3的es关闭。
  • 原因: 直接复制索引数据有时不会被识别出来,而当集群中有多个数据节点时,未被识别出来的分片数据仍旧会被分散到各个节点中,这样如果出现复制后索引未正确识别的情况,仍能从一个es中拿回完整的索引数据。
  • 保留所有数据节点直接复制个人有成功也有失败,但是一旦失败切片分布在各个机器会很难处理。

2、创建一个空白的,不设置mapping的索引

例如:

# 要复制过来的数据文件中本身就包含mapping,不需要再次设置。
settings = {
        'settings':
            {
                "number_of_shards": 5,  # 分片数量
                "number_of_replicas": 0,  # 副本数量
                "max_result_window": 10000000,  # 一次es查询的数量上限
                "track_total_hits": True,  # 设置数量上限需要的参数
            }
    }
if es.indices.exists(index_name):
    print(u"%s 已存在" % index_name)
else:
    es.indices.create(index=index_name, body=settings)

3、保证要复制索引的集群只有一个数据节点。若当前运行为一个小集群,关停其他集群,只运行分片数据所在的es

  • 分片直接复制不一定百分百被索引识别,在没有数据交互的情况下,各个分片不会被修改
  • 只保留一个数据节点能保证要复制的切片全在一台机器上,防止出错切片转移到别的节点导致不完整或者让重建索引变难

4、复制索引数据文件

  • 找到第2步建立的索引的数据存放位置/data/集群名/nodes/0/indices/索引名/,删除原来的文件
  • 复制目标数据

5、重启es,查看索引数据是否被识别

  • 用elasticsearch-head查看
  • http://ip:port/_cat/indices?v&pretty看每个索引的docs.count