阅读 372

Elasticsearch数据迁移

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

今天换了新集群,要把原集群的ES数据库的数据迁移到新的集群上,经过查找elasticdump使用的人不少,所以今天大家和我一起来学学elasticdump做数据迁移吧。

1、安装

官方提供了两种方式安装,一种是npm,另一种是docker。我们这里使用其中的一种npm安装。

## 安装npm
yum install npm
## 全局安装elasticdump
npm install elasticdump -g
复制代码

为什么全局安装呢?当然是方便使用,如果你不想全局安装的话就去掉参数-g,那么你想使用elasticdump的话需要去安装路径下。这里推荐全局安装。

2、验证安装结果

elasticdump --version
复制代码

如果能正确提示版本信息,那么恭喜你安装完毕。但是如果你的提示错误信息,如下:

SYNTAXERROR: UNEXPECTED IDENTIFIER
  at createScript (vm.js:56:10)
  at Object.runInThisContext (vm.js:97:10)
  at Module._compile (module.js:549:28)
  at Object.Module._extensions..js (module.js:586:10)
  at Module.load (module.js:494:32)
  at tryModuleLoad (module.js:453:12)
  at Function.Module._load (module.js:445:3)
  at Module.require (module.js:504:17)
  at require (internal/module.js:20:19)
  at Object.<anonymous> (/opt/node_modules/elasticdump/elasticdump.js:3:28)
复制代码

这个错误是由于nodejs版本过低导致的,所以我们要升级nodejs的版本。

3、升级nodejs

如果上一步你的elasticdump没报错,请忽略此步,直接执行下一步。

npm install -g n
n latest
复制代码

升级完成之后,再次重试

elasticdump --version
复制代码

如果出现版本信息,那么接下来就可以大展身手了。

4、复制mapping

上一节Docker如何自定义host文件,我们提到我们的数据库都是部署在内网的,那么原来的es和新的es就无法直接连接。那么该怎么迁移呢?

  • 公司的IP可以访问这两个集群的公网(公网可以针对某一IP放行)

    那么elasticdump就可以安装在你公司的服务器上,执行以下命令

    elasticdump --input=http://原ES的IP:9200/db_customer --output=http://新ES的IP:9200/db_customer --type=mapping
    复制代码
  • 就只有内网可以访问,公网一点不开放

    这种情况你就麻烦些了,首先得把原来的ES的数据导出成文件,然后把文件复制到新的ES所在集群,再执行导入操作。

    # 原es的服务器
    elasticdump --input=http://原ES的IP:9200/db_customer --output=/data/db_customer.json --type=mapping
    复制代码

    将/data/my_index_mapping.json文件复制到新es

    # 新es的服务器
    elasticdump --input=./db_customer.json --output=http://新ES的IP:9200 --type=mapping
    复制代码

    这种方式相对来说,比较麻烦,最好结合命令写脚本吧。如果你的索引比较多那不累死。

  • 有密码的ES集群

    以第一种方式为例。

    • 创建认证文件auth.ini,内容如下

      user=elastic
      password=password
      复制代码
    • 执行命令

      elasticdump --httpAuthFile auth.ini --input=http://原ES的IP:9200/db_customer --output=http://新ES的IP:9200/db_customer --type=mapping
      复制代码

    也有人说可以直接在地址栏输入用户名密码,想连接数据库的url一样,我在浏览器测试是可以的。你们可以试一试。

    elasticdump --input=http://elastic:password@原ES的IP:9200/db_customer --output=http://elastic:password@新ES的IP:9200/db_customer --type=mapping
    复制代码

5、复制data

将上述的type修改为data即可。

elasticdump --httpAuthFile auth.ini --input=http://原ES的IP:9200/db_customer --output=http://新ES的IP:9200/db_customer --type=data
复制代码

6、其他类型

type说明
settings--type=settings
alias--type=alias
analyzer--type=analyzer
template--type=template

写在最后

目测1s可以导100个文档,我这文档比较小,而且数据不多,因为我是两个服务器的公网导入,可能也受限于带宽。数据量大的话不知道效果怎么样,以后有机会对测试看看。

来都来了,点个赞再走呗!

关注WangScaler,祝你升职、加薪、不提桶!

文章分类
后端