Elasticsearch 索引复制 reindex
一、概述
Reindex 要求为源索引中的所有文档启用 _source
Reindex 不尝试设置目标索引。它不会复制源索引的设置。您应该在运行 _reindex 操作之前设置目标索引,包括设置映射、碎片计数、副本等。
二、直接复制索引到新的索引名称
POST localhost:9200/_reindex
{
"source":{
"index":"indexName"
},
"dest":{
"index":"newIndexName"
}
}
三、查询复制索引到新的索引名称
POST localhost:9200/_reindex
{
"source":{
"index":"indexName",
"type":"typeName",
"query":{
"term":{
"user":"kimchy"
}
}
},
"dest":{
"index":"newIndexName"
}
}
四、数据迁移reindex
4.1 应用背景
- 当你的数据量过大,而你的索引最初创建的分片数量不足,导致数据入库较慢的情况,此时需要扩大分片的数量,此时可以尝试使用 Reindex。
- 当数据的 mapping 需要修改,但是大量的数据已经导入到索引中了,重新导入数据到新的索引太耗时;但是在ES中,一个字段的mapping在定义并且导入数据之后是不能再修改的, 所以这种情况下也可以考虑尝试使用 Reindex。
4.2 reindex
ES 提供了 _reindex 这个 API。相对于我们重新导入数据肯定会快不少,实测速度大概是 bulk 导入数据的 5-10 倍。
4.3 数据迁移步骤:
1、创建新的索引(可以通过java程序也可以直接在 head 插件上创建)
注意:在创建索引的时候要把表结构也要创建好(也就是 mapping )
2、复制数据
POST _reindex
{
"source": {
"index": "old_index"
},
"dest": {
"index": "new_index"
}
}
4.4 数据迁移效率
常规的如果我们只是进行少量的数据迁移利用普通的 reindex 就可以很好的达到要求,但是当我们发现我们需要迁移的数据量过大时,我们会发现 reindex 的速度会变得很慢 数据量几十个 G 的场景下,elasticsearch reindex 速度太慢,从旧索引导数据到新索引,当前最佳方案是什么?
原因分析:
reindex 的核心做跨索引、跨集群的数据迁移。慢的原因及优化思路无非包括:
- 批量大小值可能太小。需要结合堆内存、线程池调整大小;
- reindex 的底层是 scroll 实现,借助 scroll 并行优化方式,提升效率;
- 跨索引、跨集群的核心是写入数据,考虑写入优化角度提升效率。
可行方案:
1)提升批量写入大小值
默认情况下,_reindex 使用 1000 进行批量操作,您可以在 source 中调整 batch_size。
POST _reindex
{
"source": {
"index": "source",
"size": 5000
},
"dest": {
"index": "dest",
"routing": "=cat"
}
}
批量大小设置的依据:
1、使用批量索引请求以获得最佳性能。
批量大小取决于数据、分析和集群配置,但一个好的起点是每批处理 5-15 MB。
注意,这是物理大小。文档数量不是度量批量大小的好指标。例如,如果每批索引 1000 个文档:
- 每个 1kb 的 1000 个文档是 1mb。
- 每个 100kb 的 1000 个文档是 100 MB。
这些是完全不同的体积大小。
2、逐步递增文档容量大小的方式调优。
- 从大约 5-15 MB 的大容量开始,慢慢增加,直到你看不到性能的提升。然后开始增加批量写入的并发性(多线程等等)。
- 使用 kibana、cerebro 或 iostat、top 和 ps 等工具监视节点,以查看资源何时开始出现瓶颈。如果您开始接收 EsRejectedExecutionException,您的集群就不能再跟上了,至少有一个资源达到了容量。
要么减少并发性,或者提供更多有限的资源(例如从机械硬盘切换到ssd固态硬盘),要么添加更多节点。
2)借助 scroll 的 sliced 提升写入效率
Reindex 支持 Sliced Scroll 以并行化重建索引过程。 这种并行化可以提高效率,并提供一种方便的方法将请求分解为更小的部分。
sliced 原理(from medcl)
- 用过Scroll接口吧,很慢?如果你数据量很大,用Scroll遍历数据那确实是接受不了,现在Scroll接口可以并发来进行数据遍历了。
- 每个Scroll请求,可以分成多个Slice请求,可以理解为切片,各Slice独立并行,利用Scroll重建或者遍历要快很多倍。
slicing 使用举例
slicing 的设定分为两种方式:手动设置分片、自动设置分片。手动设置分片参见官网。
自动设置分片如下:
POST _reindex?slices=5&refresh
{
"source": {
"index": "twitter"
},
"dest": {
"index": "new_twitter"
}
}
slices 大小设置注意事项:
- slices 大小的设置可以手动指定,或者设置 slices 设置为 auto,auto 的含义是:针对单索引,slices 大小=分片数;针对多索引,slices = 分片的最小值。
- 当 slices 的数量等于索引中的分片数量时,查询性能最高效。slices 大小大于分片数,非但不会提升效率,反而会增加开销。
- 如果这个slices数字很大,例如:500,建议选择一个较低的数字,因为过大的 slices 会影响性能。
效果
实践证明,比默认设置 reindex 速度能提升 10 倍+。
最终版本:
POST _reindex?slices=4&refresh
{
"source": {
"index": "source",
"size": 5000
},
"dest": {
"index": "dest"
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论