es的数据迁移批量脚本

有大约几种迁移方式

snapshot
reindex
logstash
elasticsearch-dump
elasticsearch-migration
Elasticsearch-Exporter

上面的方式中 snapshot 和reindex 是es自带, snapshot适合数据量比较大
logstash 直接是工具传输, 和reindex一样,只能传数据不传mapping
dump 是一个node 下的工具,可传setting,mapping,data. 如果 目标库有这个索引了,则不会同步,所以记得迁移之前,先delete到目标库要迁移的索引
其它两个不了解

本文采用的方式及前置准备

我个人是倾向于reindex的,因为这个是自带工具且方便简单,但其不能传mapping.
传mapping用dump,其需要node环境,由于mapping都比较小,在dump来传送也OK,

reindex需要在执行此语句的es中配置下白名单
即在elasticsearch.yml中配置

 reindex.remote.whitelist: "另一台es的ip:9200"

dump则是需要 node环境进行安装

npm install elasticdump -g

脚本执行

if __name__ == '__main__':
    print("----------------")

    source_es_url = "http://xxx:9200"
    target_es_url = "http://xx:9200"

    index_name_list = ["aaa","bbb"]

    for index_name in index_name_list:
        # delete 此index

        url = "{}/{}".format(target_es_url,index_name)
        t = requests.delete(url)
        print("--------------------当前迁移索引:"+index_name)
        print(index_name+"删除结果:"+str(t.content))

        # 用dump迁移mapping
        cmd = "elasticdump --input={}/twitter --output={}/twitter --type=mapping".format(source_es_url,target_es_url)
        cmd_result = os.popen(cmd)
        print(cmd_result.read())

        # 迁移数据
        cmd3_text = """
            {"source": {
                      "remote": {
                        "host": \""""+source_es_url+"""\"
                      },                              
                      "index": \""""+index_name+"""\"
                    },
                    "dest": {
                      "index": \""""+index_name+"""\"
                    }
                  }
              """

        url = "{}/_reindex?pretty".format(target_es_url)
        t = requests.post(url,data=cmd3_text)
        print(index_name+"迁移结果:"+str(t.content))

说明:
这个脚本是自已的机器执行
迁移mapping的cmd 是要有elasiticdump工具的环境
迁移数据用reindex 是需要 源es和目标es的网络能共通,并不是由本机去做转发

为什么数据不用dump来迁移呢?dump有个问题,是要用执行dump的机器做转发,如果数据量比较可观,那传输会比较慢。但其实如果把dump工具装在其中一个es服务器上,速度也是OK的。这边由于服务器没有 node环境,所以用reindex.

如果两台机网络不通,则可以使用dump.
dump的一些简单使用:
迁移单个:

elasticdump --input=http://source_ip:port/test_index --output=http://target_ip:port/test_index --type=settings
elasticdump --input=http://source_ip:port/test_index --output=http://target_ip:port/test_index --type=mapping
elasticdump --input=http://source_ip:port/test_index --output=http://target_ip:port/test_index --type=data

批量

elasticdump --input=http://source_ip:port --output=http://target_ip:port

参考

https://www.jianshu.com/p/50ef4c9090f0

你可能感兴趣的:(elasticsearch)