elasticsearch 数据迁移
第一种方法 (使用elasticdump)
这是一个nodejs的插件,安装方式直接使用 npm即可
导出索引的格式
#格式:elasticdump --input {protocol}://{host}:{port}/{index} --output ./test_index.json #例子:将ES中的test_index 中的索引导出 #导出当前索引的mapping结构 $ elasticdump --input http://192.168.56.104:9200/test_index --output ./test_index_mapping.json --type=mapping #导出当前索引下的所有真实数据 $ elasticdump --input http://192.168.56.104:9200/test_index --output ./test_index.json --type=data
向新的es服务导入索引
# 创建索引 $ curl -XPUT http:192.168.56.104:9200/test_index #因为导入的是mapping,所以设置type为mapping $ elasticdump --input ./test_index_mapping.json --output http://192.168.56.105:9200/ --type=mapping #因为导入的是data(真实数据)所以设置type为data $ elasticdump --input ./test_index.json --output http://192.168.56.105:9200/ --type=data
使用 elasticdump的官方docker镜像进行数据的导入导出
# 镜像下载 $ docker pull taskrabbit/elasticsearch-dump # 下面还是例子:通过镜像导出数据到本地 # 创建一个文件夹用于保存导出数据 $ mkdir -p /root/data # 下面需要对路径进行映射并执行命令(导出mapping) $ docker run --rm -ti -v /data:/tmp taskrabbit/elasticsearch-dump \ --input=http://production.es.com:9200/my_index \ --output=/tmp/my_index_mapping.json \ --type=mapping # 导出(data) $ docker run --rm -ti -v /root/data:/tmp taskrabbit/elasticsearch-dump \ --input=http://192.168.56.104:9200/test_index \ --output=/tmp/elasticdump_export.json \ --type=data ----------------------------------------------------------------------------- # 以下内容为ES -> ES的数据迁移例子 $ docker run --rm -ti taskrabbit/elasticsearch-dump \ --input=http://production.es.com:9200/my_index \ --output=http://staging.es.com:9200/my_index \ --type=mapping $ docker run --rm -ti taskrabbit/elasticsearch-dump \ --input=http://production.es.com:9200/my_index \ --output=http://staging.es.com:9200/my_index \ --type=data
注:上面的这些导入导出都是最基本的使用,当然还有很多高级用法,参考下面所列出来的命令进行尝试或者直接访问Github官网,查看更加详细的说明,这里只作为记录!
logstash系列一使用logstash迁移ES数据
es的文档id生成方式可以是 自动的uuid,也可以是自定义的id,可以用业务中的id字段进行映射
自动的id,URL安全,base64编码,GUID,如下:
POST /test_index/test_type { "test_content": "my test" }
手动的就靠自己定义
PUT /test_index/test_type/2 { "test_content": "my test" }
那么使用logstash抽取数据是怎么做映射的?配置文件如下:
input { elasticsearch { hosts => ["192.168.0.1:9200"] index => "ddd" query => '{ "query": {"match_all" : {} } }' size => 1000 scroll => "1m" codec => "json" docinfo => true } } output { stdout { codec => rubydebug } elasticsearch { hosts => ["192.168.0.2:9200"] document_type => "messages" document_id => "%{id}" index => "ddd" } }
document_id => "%{id}" 指定 文档id 使用自己定义json 文件中的id 号映射。