ElasticSearch 8.x 使用 snapshot(快照)进行数据迁移

ElasticSearch

1、ElasticSearch学习随笔之基础介绍
2、ElasticSearch学习随笔之简单操作
3、ElasticSearch学习随笔之java api 操作
4、ElasticSearch学习随笔之SpringBoot Starter 操作
5、ElasticSearch学习随笔之嵌套操作
6、ElasticSearch学习随笔之分词算法
7、ElasticSearch学习随笔之高级检索
8、ELK技术栈介绍
9、Logstash部署与使用
10、ElasticSearch 7.x 版本使用 BulkProcessor 实现批量添加数据
11、ElasticSearch 8.x 弃用了 High Level REST Client,移除了 Java Transport Client,推荐使用 Elasticsearch Java API
12、ElasticSearch 8.x 使用 snapshot(快照)进行数据迁移
13、ElasticSearch 8.x 版本如何使用 SearchRequestBuilder 检索

ElasticSearch,创始人 Shay Banon(谢巴农)
本文主要讲解ElasticSearch 数据快速迁移。


文章目录

  • ElasticSearch
  • 前言
  • 一、什么是ES的快照
  • 二、快照生成
    • 2.1 新建仓库
      • 2.1.1 Kibana操作
      • 2.1.2 JAVA API操作
        • 2.1.2.1 引入 pom 依赖
        • 2.1.2.2 初始化客户端
        • 2.1.2.3 创建仓库(参数方式)
        • 2.1.2.3 创建仓库(配置文件方式)
    • 2.2 生成快照
      • 2.2.1 Kibana操作
      • 2.2.2 JAVA API操作
    • 2.3 删除快照
      • 2.3.1 Kibana操作
      • 2.3.2 JAVA API操作
  • 三、恢复快照
    • 3.1 Kibana操作
    • 3.2 JAVA API操作


前言

平时在工作中,很多时候都是需要搭建好几个测试平台来保证应用的运行是否流畅,有没有 Bug,数据是否正确,一般都是 dev、pre 等测试环境,通过一系列的测试之后没有什么问题,才会把 应用 和 数据 部署到 prod 环境,应用一般都是大包 prod 环境的部署包,直接部署,而数据则就需要很长的实际来同步了,如果是一些统计咨询类的企业应用,那数据上线就有可能花费掉大量的时间了。
此篇就来浅谈一下,项目中应用到了 ElasticSearch 来做数据检索,那在项目上线的时候,我们如何快速的把大量数据快速从一个 ElasticSearch索引迁移到另一个索引库。
快照和恢复
A snapshot is a backup of a running Elasticsearch cluster.
官网上说,一个快照就是一个备份在 Elasticsearch 集群上运行的时候,快照可以用于以下几点:

  • 集群服务不停的情况下定期备份数据;
  • 删除或者硬件出错后恢复数据;
  • 在两台集群中间传输数据;
  • 通过在冷和冻结数据层中使用可搜索的快照来降低存储成本;

那具体什么是快照呢?

一、什么是ES的快照

Elasticsearch 的快照就是指对数据和元数据的定期备份。因为快照中不仅包含了所有数据,也包含了所有的相关信息,比如:映射、配置等;这些快照可以保存在本地文件系统,也可以保存在共享文件系统或者专门存储快照的地方。

在快照的概念中,数据并不都是每次全部备份一遍,而是采用增量的方式进行进行备份。首次备份会进行全力备份,而后续的备份则是在上一次备份后的更新的数据,增量备份可以有效地减少备份所需的存储空间和节省时间。

对于 Elasticsearch 的迁移,快照和恢复则是很常用的一种强大的方式,在源集群上创建索引的快照,拷贝到其他集群后在恢复,也可以用 API 的方式来进行快照和恢复,这里就用 JAVA + Elasticsearch Client 实现,这样在我们后台应用就可以完成数据迁移了。

二、快照生成

2.1 新建仓库

2.1.1 Kibana操作

可以通过 Kibana 指令来注册快照,命令如下:

POST _snapshot/productInfo
{"type": "fs","settings": {"location": "/data/esbackup/product_info"}
}

执行以上指令,有可能报错,一般会报如下错误:

"caused_by": {"type": "repository_exception","reason": "[productInfo] location [/data/esbackup] doesn't match any of the locations specified by path.repo because this setting is empty"
}

报上述错误一般是 Elasticsearch 服务没有配置 path.repo 这个参数,只需要在 elasticsearch.yml 中配置 path.repo: /data/repository 即可。

如果报错如下:

"caused_by": {"type": "access_denied_exception","reason": "/data/repository/tests-gU8mf7EvREG_1qMc3ZMApQ"
}

说明你配置的 path.repo 的路径没有访问权限,赋予权限即可:
chown -R elasticsearch:elasticsearch /data/esbackup/productInfo/

2.1.2 JAVA API操作

2.1.2.1 引入 pom 依赖
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.3.2</version>
</dependency>

注意: 再次感受到 elasticsearch-rest-high-level-client 对版本的严格区分,可能是我的 ElasticSearch 配置或者是其他原因,低版本的客户端使用 BulkProcessor 是没有问题的,但是在 获取快照 操作测报错,高版本的客户端在 获取快照时没问题,但是在 BulkProcessor 批量操作数据时报错,你的是否也有这个问题呢?

2.1.2.2 初始化客户端
/*** 通过认证连接ES,获取客户端*/
public static RestHighLevelClient createClient(){String hostname = "192.168.*.*";int port = 9200;String username = "your username";String password = "your password";final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(hostname, port)).setHttpClientConfigCallback(httpAsyncClientBuilder -> httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider));return new RestHighLevelClient(restClientBuilder);
}
2.1.2.3 创建仓库(参数方式)
/*** 创建仓库*/
public static void createRepository(RestHighLevelClient client, String repositoryName) {GetRepositoriesRequest getRepositoriesRequest = new GetRepositoriesRequest(new String[]{repositoryName});boolean hasRepository = false;try {GetRepositoriesResponse repository = client.snapshot().getRepository(getRepositoriesRequest, RequestOptions.DEFAULT);List<RepositoryMetadata> repositories = repository.repositories();for (RepositoryMetadata repositoryMetadata : repositories) {if(repositoryMetadata.name().equals(repositoryName)){hasRepository = true;break;}}} catch (ElasticsearchStatusException ee) {System.out.println("仓库不存在:" + ee.getMessage());} catch (IOException ioException) {// 客户端版本略低,所以用异常捕获方式判断,索引存在会抛到这里异常System.err.println(ioException.getMessage());hasRepository = true;}if(!hasRepository){try {PutRepositoryRequest repositoryRequest = new PutRepositoryRequest();repositoryRequest.name(repositoryName);repositoryRequest.verify(false);repositoryRequest.name(repositoryName);repositoryRequest.type("fs");repositoryRequest.settings(Settings.builder().put("location", "/data/esbackup/productInfo"));AcknowledgedResponse acknowledgedResponse = client.snapshot().createRepository(repositoryRequest, RequestOptions.DEFAULT);if (acknowledgedResponse.isAcknowledged()) {System.out.println("创建仓库成功: " + repositoryName);}} catch (IOException e) {e.printStackTrace();}}try {client.close();} catch (IOException e) {throw new RuntimeException(e);}
}
2.1.2.3 创建仓库(配置文件方式)
  • 配置文件如下:
    src/main/resources/productInfo.json
{"type": "fs","settings": {"location": "/data/esbackup/productInfo","compress": true}
}
  • 读取配置,创建仓库:
    注意:仓库名称 repositoryName 必须小写
/*** 创建仓库*/
public static void createRepository(RestHighLevelClient client, String settingPath, String repositoryName) {GetRepositoriesRequest getRepositoriesRequest = new GetRepositoriesRequest(new String[]{repositoryName});boolean hasRepository = false;try {GetRepositoriesResponse repository = client.snapshot().getRepository(getRepositoriesRequest, RequestOptions.DEFAULT);List<RepositoryMetadata> repositories = repository.repositories();for (RepositoryMetadata repositoryMetadata : repositories) {if(repositoryMetadata.name().equals(repositoryName)){hasRepository = true;break;}}} catch (ElasticsearchStatusException ee) {System.out.println("仓库不存在:" + ee.getMessage());} catch (IOException ioException) {// 客户端版本略低,所以用异常捕获方式判断,索引存在会抛到这里异常System.err.println(ioException.getMessage());hasRepository = true;}if(!hasRepository){try {String jsonString = new String(Files.readAllBytes(Paths.get(settingPath)), StandardCharsets.UTF_8);// 解析 jsonPutRepositoryRequest repositoryRequest = new PutRepositoryRequest();XContentParser contentParser = XContentFactory.xContent(XContentType.JSON).createParser(NamedXContentRegistry.EMPTY, DeprecationHandler.THROW_UNSUPPORTED_OPERATION, jsonString);repositoryRequest.name(repositoryName);repositoryRequest.verify(false);repositoryRequest.source(contentParser.map());AcknowledgedResponse acknowledgedResponse = client.snapshot().createRepository(repositoryRequest, RequestOptions.DEFAULT);if (acknowledgedResponse.isAcknowledged()) {System.out.println("创建仓库成功: " + repositoryName);}} catch (IOException e) {e.printStackTrace();}}try {client.close();} catch (IOException e) {throw new RuntimeException(e);}
}

2.2 生成快照

2.2.1 Kibana操作

POST _snapshot/product_info/product_info

2.2.2 JAVA API操作

注: 快照名称 snapshotName 必须小写

/*** 生成快照*/
public static boolean createSnapshot(RestHighLevelClient client, String snapshotName, String repositoryName, String... indexes) {CreateSnapshotRequest createSnapshotRequest = new CreateSnapshotRequest();createSnapshotRequest.indices(indexes);createSnapshotRequest.snapshot(snapshotName);createSnapshotRequest.repository(repositoryName);createSnapshotRequest.waitForCompletion(true);createSnapshotRequest.includeGlobalState(false);try {CreateSnapshotResponse snapshotResponse = client.snapshot().create(createSnapshotRequest, RequestOptions.DEFAULT);SnapshotInfo snapshotInfo = snapshotResponse.getSnapshotInfo();if (snapshotInfo.status().getStatus() == 200) {System.out.println("快照创建成功:" + snapshotInfo);return true;}} catch (IOException e){e.printStackTrace();} finally {try {client.close();} catch (IOException e) {throw new RuntimeException(e);}}return false;
}

快照生成成功,如图:
快照

2.3 删除快照

2.3.1 Kibana操作

DELETE _snapshot/product_info

2.3.2 JAVA API操作

/*** 删除快照*/
public static boolean deleteSnapshot(RestHighLevelClient client, String repositoryName) {DeleteSnapshotRequest deleteSnapshotRequest = new DeleteSnapshotRequest();deleteSnapshotRequest.snapshots(repositoryName);deleteSnapshotRequest.repository(repositoryName);try {AcknowledgedResponse deleteSnapshotResponse = client.snapshot().delete(deleteSnapshotRequest, RequestOptions.DEFAULT);if (deleteSnapshotResponse.isAcknowledged()) {System.out.println("快照删除成功!");return true;}} catch (IOException e) {e.printStackTrace();} finally {try {client.close();} catch (IOException e) {throw new RuntimeException(e);}}return false;
}

三、恢复快照

3.1 Kibana操作

POST _snapshot/product_info/product_info/_restore
{"indices": "product_info"
}

3.2 JAVA API操作

/*** 恢复快照*/public static void restoreSnapshot(RestHighLevelClient client, String snapshotName, String repositoryName, String indexes){RestoreSnapshotRequest restoreSnapshotRequest = new RestoreSnapshotRequest();restoreSnapshotRequest.snapshot(snapshotName);restoreSnapshotRequest.repository(repositoryName);restoreSnapshotRequest.indices(indexes);try {RestoreSnapshotResponse restoreSnapshotResponse = client.snapshot().restore(restoreSnapshotRequest, RequestOptions.DEFAULT);System.out.println("快照恢复成功:" + restoreSnapshotResponse.getRestoreInfo().toString());} catch (IOException e) {e.printStackTrace();} finally {try {client.close();} catch (IOException e) {throw new RuntimeException(e);}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/654091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

情人节爆品出现!单周GMV暴涨6成,直冲20K美金,节庆用品赛道迎来“爆单潮”!

2024新年钟声已经敲响&#xff0c;一大波节日爆品正在疯狂涌现&#xff0c;而这只是一个开始。 开年首月电商流量一波接一波来袭&#xff0c;下一个“消费大节”已经在来的路上&#xff01;——情人节。 节日营销热点抢量&#xff0c;宜早不宜晚。商家们纷纷开始上新节庆相关…

git配置用户名和邮箱

1.git 1.配置用户名和邮箱 2.git初体验 git init 初始化git仓库 管理项目让git管理你的本次代码变更 git add .git commit -m “你完成的功能” 后续如果新增/修改/删除代码&#xff0c; 完成新功能时 重复2 3.查看日志 1.git log 4.版本回退 1.查看提交的版本记录 git l…

大数据信用报告多久查一次比较好?怎么查?

随着大数据技术的快速发展&#xff0c;大数据信用报告在个人信用评估中发挥着越来越重要的作用。然而&#xff0c;对于很多人来说&#xff0c;大数据信用报告仍然是一个相对陌生的概念。本文将就大数据信用报告的查询频率和查询方式进行探讨&#xff0c;以帮助大家更好地理解这…

ChatGPT4 比 ChatGPT3.5 强在了那里?

刚开始的时候我还在纠结&#xff0c;一个月20 刀的ChatGPT4 &#xff0c;到底值不值这个价钱&#xff1f;使用过后发现&#xff0c;诶嘛真香。因为 GPT4 比 GPT3.5 多了太多功能&#xff0c;特别是识图能力&#xff0c;用好的话效率翻倍。 1. 看图写代码 ChatGPT4 相比 ChatG…

idea docker 内网应用实践

文章目录 前言一、服务器端1.1 离线安装docker1.2 开启docker远程访问1.3 制作对应jdk镜像1.3.1 下载jdk171.3.2 Dockerfile 制作jdk17镜像1.3.3 镜像导出1.3.4 服务器引入镜像 二、Idea 配置2.1 Dockerfile2.2 pom 引入docker插件2.3 idea docker插件配置2.4 打包镜像上传2.5 …

k8s-快速部署一套k8s集群

1、前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式&#xff1a; kubeadm Kubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部署Kubernetes集群。 二进制包 从github下载发行…

基于springboot药房管理系统源码和论文

伴随着全球信息化发展&#xff0c;行行业业都与计算机技术相衔接&#xff0c;计算机技术普遍运用于药房管理行业。实施计算机系统来管理可以降低逍遥大药房管理成本&#xff0c;使整个逍遥大药房行业的发展有显著提升。 本论文主要面向逍遥大药房管理中出现的一些常见问题&…

Advanced Science |GWAS分析揭示广东桑关键农艺性状的遗传基础

桑树是养蚕和传统医药中重要的经济植物。然而&#xff0c;桑树的遗传和进化史在很大程度上仍然是未知的。 近期&#xff0c;发表在Advanced Science&#xff08;IF17.5&#xff09;上的文章“Genomic Resequencing Unravels the Genetic Basis of Domestication, Expansion, an…

盛最多水的容器[中等]

一、题目 给定一个长度为n的整数数组height。有n条垂线&#xff0c;第i条线的两个端点是(i, 0)和(i, height[i])。找出其中的两条线&#xff0c;使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。也就是求x轴与y轴的面积。 说明&#xff1a;你不能倾…

Vue2 VS Vue3 生命周期

一、生命周期的概念 Vue组件实例在创建时要经历一系列的初始化步骤&#xff0c;在此过程中Vue会在合适的时机&#xff0c;调用特定的函数&#xff0c;从而让开发者有机会在特定阶段运行自己的代码&#xff0c;这些特定的函数统称为&#xff1a;生命周期钩子&#xff08;也会叫…

【算法】BFS算法解决多源最短路问题(C++)

文章目录 前言那么什么是单源最短路 / 多源最短路呢&#xff1f;如何解决此类题&#xff1f;解法一解法二对于解法二&#xff0c;如何编写代码&#xff1f; 算法题542.01矩阵1020.飞地的数量1765.地图中的最高点1162.地图分析 前言 此前我们对 单源最短路 问题进行的讲解&…

2024年搭建幻兽帕鲁服务器价格多少?如何自建Palworld?

自建幻兽帕鲁服务器租用价格表&#xff0c;2024阿里云推出专属幻兽帕鲁Palworld游戏优惠服务器&#xff0c;配置分为4核16G和4核32G服务器&#xff0c;4核16G配置32.25元/1个月、3M带宽96.75元/1个月、8核32G配置10M带宽90.60元/1个月&#xff0c;8核32G配置3个月271.80元。ECS…

[ESP32 IDF] wifi 的应用

目录 背景知识 wifi的基本连接使用 WiFi篇—— WiFi两种模式文章中二、WiFi 的启动&#xff08;STA 及 AP 模式&#xff09; 输出现象 通过websocket控制LED 实践验证 实验现象 背景知识 WIFI是ESP32非常重要的一个功能&#xff0c;想要使用一下IDF的API实现将ESP32连…

Ubuntu中安装OpenSSL

Ubuntu中安装OpenSSL 参考&#xff1a;linux上安装Openssl步骤详解_linux安装openssl-CSDN博客 下载&#xff1a; https://www.openssl.org/source/openssl-3.0.1.tar.gz 解压&#xff1a; tar -xzvf xxxx.tar.gz 安装&#xff1a; cd openssl-3.0.12 ./config make -j3…

关于如何利用ChatGPT提高编程效率的

自从去年ChatGPT3.5推出以后&#xff0c;这一年时间在编程过程中我也在慢慢熟悉人工智能的使用&#xff0c;目前来看即使是免费的ChatGPT3.5对于编程效率的提升也是有很大帮助的&#xff0c;虽然在使用过程中确实出现了一些问题&#xff0c;本文记录下我的一些心得体会和用法。…

开发工具之GIT协同开发流程和微服务部署实践与总结

GIT协同开发流程和微服务部署的实践&#xff0c;并总结经验和教训。通过合理的GIT协同开发流程和良好的微服务部署策略&#xff0c;团队可以更高效地开发和部署软件。 ## 引言 在当今快节奏的软件开发环境中&#xff0c;采用合适的工具和流程对于实现高效协同开发和可靠部署至…

iOS 包含行间距计算富文本size

在一次开发过程中&#xff0c;发现带有行间距的富文本计算高度&#xff0c;会有不准确的情况&#xff0c;富文本内容明明很长&#xff0c;但是计算出的高度只有不到20像素&#xff0c;导致整个cell的高度计算异常。 需求上是文字固定宽度&#xff0c;最多显示3行&#xff0c;超…

FPGA高端项目:Xilinx Zynq7020系列FPGA多路视频拼接 工程解决方案 提供6套工程源码和技术支持

目录 1、前言版本更新说明给读者的一封信FPGA就业高端项目培训计划免责声明 2、相关方案推荐我已有的FPGA视频拼接叠加融合方案本方案在Xilinx Kintex7 系列FPGA上的应用本方案在Xilinx Artix7 系列FPGA上的应用 3、设计思路框架视频源选择ov5640 i2c配置及采集动态彩条多路视频…

精通Python第13篇—数据之光:Pyecharts旭日图的魔法舞台

文章目录 引言准备工作绘制基本旭日图调整颜色和样式添加交互功能定制标签和标签格式嵌套层级数据高级样式与自定义进阶主题&#xff1a;动态旭日图数据源扩展&#xff1a;外部JSON文件总结 引言 数据可视化在现代编程中扮演着重要的角色&#xff0c;而Pyecharts是Python中一个…

黑群晖使用SynologyDrive同步家庭和公司电脑文件

文章目录 前言一、黑群晖安装SynologyDrive服务二、樱花frp内网穿透2.1、创建一个隧道2.2、在群晖里面下载、安装、开启樱花frp 三、本地电脑安装SynologyDrive 前言 最近看b站学习视频&#xff0c;发现里面老师喜欢文件都是使用坚果云同步到云盘里面&#xff0c;以前我是瞧不…