Fork me on GitHub

Elasticsearch 数据迁移

概述

使用日志服务 CLI 可以方便您快速将 Elasticsearch 中的数据导入日志服务。

配置

aliyun-log-cli.readthedocs.io 无法正常显示表格,请参阅tutorial_es_migration_cn.md

数据映射

logstore - index

CLI 默认会将 Elasticsearch index 中的数据迁移至同名的 logstore 中,当然您也可以通过参数 logstore_index_mappings 指定将多个 index 中的数据迁移至一个 logstore。

logstore 不必事先创建,如果 CLI 发现目标 logstore 未创建,会为您在指定的 project 下创建好。

数据类型映射

CLI 会根据 Elasticsearch 的数据类型 在index 对应的 logstore 中创建好索引。

  • Core datatypes
Elasticsearch 日志服务
text text
keyword text,不分词
long long
integer long
short long
byte long
double double
float double
half_float double
scaled_float double
date text
boolean text,不分词
binary n/a
integer_range json
float_range json
long_range json
double_range json
date_range json
ip_range text,不分词
  • Complex datatypes
Elasticsearch 日志服务
Array datatype n/a
Object datatype json
Nested datatype n/a
  • Geo datatypes
Elasticsearch 日志服务
Geo-point datatype text
Geo-Shape datatype text
  • Specialised datatypes
Elasticsearch 日志服务
IP datatype text,不分词
Completion datatype n/a
Token count datatype n/a
mapper-murmur3 n/a
Percolator type n/a
join datatype n/a

抓取模式

  • 为了提高吞吐量,CLI 会为每个 index 的每个 shard 创建一个数据迁移任务,并提交到内部进程池中执行。
  • 当全部任务执行完成后,CLI 才会退出。

任务执行情况展示

CLI 默认把任务执行情况存储在~/aliyunlogcli.log中, 也可以配置~/.aliyunlogcli中__loggging__来调整信息存储位置和格式:

[__logging__]
filename=~/es_migration.log
level=info
  • 单个迁移任务执行结果展示。
========Tasks Info========
...
task_id=1, slice_id=1, slice_max=10, hosts=localhost:9200, indexes=None, query=None, project=test-project, time_cost_in_seconds=128.71100688, status=CollectionTaskStatus.SUCCESS, count=129330, message=None
...

编号为 1 的迁移任务执行成功,耗时 128.7s,迁移文档数量 129330。
  • 迁移任务执行结果汇总信息。
========Summary========
Total started task count: 10
Successful task count: 10
Failed task count: 0
Total collected documentation count: 1000000

MigrationManager 总共启动了 10 个数据数据迁移任务,全部执行成功。迁移文档总数 1000000。

使用样例

  • 将 hosts 为 localhost:9200 的 Elasticsearch 中的所有文档导入日志服务的项目 project1 中。
aliyunlog log es_migration --hosts=localhost:9200 --project_name=project1
  • 指定将 Elasticsearch 中索引名以 myindex_ 开头的数据写入日志库 logstore1,将索引 index1,index2 中的数据写入日志库 logstore2 中。
aliyunlog log es_migration --hosts=localhost:9200,other_host:9200 --project_name=project1 --logstore_index_mappings='{"logstore1": "myindex_*", "logstore2": "index1,index2"}}'
  • 使用参数 query 指定从 Elasticsearch 中抓取 title 字段等于 python 的文档,并使用文档中的字段 date1 作为日志的 time 字段。
aliyunlog log es_migration --hosts=localhost:9200 --project_name=project1 --query='{"query": {"match": {"title": "python"}}}'
  • 使用 HTTP 基本认证user:secret@localhost:9200,从 Elasticserch 中迁移数据。

    aliyunlog log es_migration --hosts=user:secret@localhost:9200 --project_name=project1
    

常见问题

Q:是否支持抓取特定时间范围内的 ES 数据?

A:ES 本身并没有内置 time 字段,如果文档中某个字段代表时间,可以使用参数 query 进行过滤。

Q:如何观察迁移任务的执行状况?

A:参考任务执行情况展示部分,将日志级别配置成 info 或以下,并使用命令tail -f <your_log_file>实时观察日志的输出。