elasticsearch 索引_Elasticsearch 索引乾坤大挪移

99096a3b3367d4d8d0b95a40f9c3e3aa.png

25eef3d085e5164c6a9e6100e6c89628.png f36d8bcc9c6cb843d3e68506340bbe23.png

您好 请教一个问题 es存储的数据需要从一个es库迁移到其他服务器上的es库能否直接通过拷贝本地的某个文件实现?我看网上有很多数据迁移的方法都很麻烦

可以的哈

32be7756d55a7f22b23c5e71a431b87c.png 25eef3d085e5164c6a9e6100e6c89628.png f36d8bcc9c6cb843d3e68506340bbe23.png

直接拷贝的话 是拷贝那个文件呢

要以整个目录来进行拷贝,es是以分片为单位的,一个分片对应一个目录

32be7756d55a7f22b23c5e71a431b87c.png 25eef3d085e5164c6a9e6100e6c89628.png f36d8bcc9c6cb843d3e68506340bbe23.png

具体怎么做呢? 

有办法! 35b98681c3a9e36445ae3453942af267.gif

Elasticsearch 集群内的数据备份和迁移是一个日常的运维动作,Elasticsearch 提供了多种方案可供选择:

Snapshot 快照法

通过将索引数据生成快照文件,保存到外部存储,支持全量和增量;使用快照需要事先配置好快照的仓库,支持的快照仓库有常见的 Amazon S3, HDFS, Azure, Google Cloud Storage, 本地文件系统和共享文件存储系统等等。Snapshot 适合对重要的索引数据定期进行阶段性的、周期性的备份,保留的每个历史状态都可以被恢复还原到当时的那个数据状态。具体的自己看文档。

优点是备份策略和恢复都很灵活,适合长期归档,缺点是时效性不好,有可能丢失两次快照间的数据变化。

Reindex 重建法

可以将一个索引里面的数据导出到另一个索引里面,也支持拉取其他集群的一个索引或者一批索引到本地集群进行数据的重建,支持通配符的方式选择多个索引。适合索引 Mapping 数据结构变化之后的快速重建,且重建的时候可以指定将数据重建到一个新的索引里面,还可以在重建过程中对数据进行加工和过滤。具体的自己看文档。

优点是使用方便,操作简单,缺点是不适应大数据量的重建,不支持进度的控制和重建故障的恢复,外部可控性差。

CCR 复制法

Elasticsearch 商业特性,主要用于多集群间的数据复制,提供索引级别的数据复制订阅,常用于异地灾备。适合对数据复制实时性要求比较高的场景,长期的双向同步和多活的需求,也可以用来将数据从各地集中到中心做统一的数据分析。具体的自己看文档。

优点是同步的实时性比较高,缺点对已有集群的初始化同步代价高,受限于网络带宽,对于大吞吐数据量的场景也不适用。

工具法

除上述 Elasticsearch 内置的功能之外,目前市面上还有很多第三方工具可以实现数据的迁移需求,比如通过读取 Elasticsearch 的 Scroll API 来遍历数据进行数据的导出,然后再使用 Bulk 接口进行数据的导入,而 Elasticsearch 内置的 Reindex API 本质上也是调用的 Scroll 和 Bulk API 进行数据的迁移。具体的自己找去。

Reindex 通过 Scroll 遍历索引内的 Segment 段文件数据,再通过 Bulk 进行索引数据的批量导入。

文件拷贝法

最后,我们再来看看一种最直接的迁移索引数据的方法,也就是直接拷贝索引文件的方式。

在 5.0 之前,Elasticsearch 的索引和磁盘上的索引目录名称是一样的,也就是直接可以通过索引名找到磁盘上对应的一个文件目录,拷贝这个目录就拷贝了这个索引的数据,备份也就只需要备份这个目录就可以了。

一个 Elasticsearch 的分片就是一个独立的 Lucene 仓库,一个分片也就是独立完整的搜索单元,一个分片在磁盘上对应于一个单独的文件目录。而一个索引往往有多个分片,所以备份的时候,这些分片也都需要备份。这个今天讲讲。

Snapshot 快照的原理其实就是采用的直接备份索引内主分片所包含的 Lucene 文件的办法。 

从 5.0 起,分片的实际目录名不再绑定使用索引的名称,而是采用 UUID 的方式来命名,这样的好处是解耦,方便对逻辑层面的索引进行更灵活的操作,比如重命名、迁移和还原等,同时也避免依赖物理目录避免冲突和锁的问题。

更进一步,我们还能将多个分片的 Segment 段文件手动合并到一个目录进行索引数据的合并。假如你有一个包含 5 个分片的索引,没有开启副本,因为异常的服务器异常丢失了一个分片的数据,索引的状态变成了 Red,这个时候这个索引已经不能进行使用了,而你希望继续保留剩余分片的数据,那么你可以将剩下 4 个分片的数据手动拷贝合并到一个新的只有一个分片的索引里面;当然还有一种方案就是强制分配丢失的分片,这样分片状态也会变正常。

实战案例

这里以手动升级 5.x 的 .security 索引为例, 现有一个 5.x 集群,.security 里面包含若干重要的用户名和权限设置信息,因为集群要升级到 6.x 新集群,现有集群不能动,无缝原地升级,需要将 5.x 的 .security 索引进行导出,同时因为 5.x 和 6.x 的 .security 索引已经发生了变化,索引无缝直接做 reindex,怎么办?

解决办法:将 .security 索引文件直接从线上集群拷贝到离线环境,做原地升级然后拷贝再索引到新集群。

1. 先拿到 .security 所在的 uuid,访问索引的设置就能看到 uuid 是多少了

28092c557f67702e12a8cc30d803445a.png

2.可以看到 uuid 是 -a9zgoTATyiq8sfp9943xg,拷贝一下,到对应的服务器上找到索引文件,连目录一起拷贝了,这个索引只有一个分片,我们只需要拷贝一个文件夹,如果是其它的有多个分片的索引,则需要找到所有服务器和服务器上对应的文件目录。

3efdd9348c4649a0a5b5446e44687402.png

3.在本地的相同版本的 5.x 集群,应该也会有一个 .security 索引,如果没有可以单独创建一个,用相同方法,定位到这个索引的目录。

4.关闭该 5.x 本地集群。

5.将线上的这个文件夹的内容打包拷贝到本地的 5.x 相同版本的集群的这个索引目录内。

6.启动该本地 5.x 集群。

7.执行本地 .security 的索引升级。

3a394118144b3ff86b2e1abdab747a54.png

8.现在这个本地集群的 .security-6 应该已经是最新的结果了,我们想办法导入导出到线上新的 6.x 集群就大功告成了。

这里使用我的 esm 工具,新版本的还在路上,旧版本的先顶着:https://github.com/medcl/esm-abandoned

➜  7.0 ./bin/esm -s http://localhost:9200 -x ".security-6" -y ".security-6"  -d https://远程集群节点:9200 -m elastic:changeme -n elastic:changeme -c 10000 

9.现在新集群应该就能看到导入成功的所有数据了。

10.搞定。

好的,有关Elasticsearch 数据迁移的一些方法,今天的分享就到这里,希望对大家有帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值