如何在不同版本的 Elasticsearch 之间以及集群之间迁移数据

news2025/4/18 10:17:58

作者:来自 Elastic Kofi Bartlett

当你想要升级一个 Elasticsearch 集群时,有时候创建一个新的独立集群并将数据从旧集群迁移到新集群会更容易一些。这让用户能够在不冒任何停机或数据丢失风险的情况下,在新集群上使用所有应用程序测试其所有数据和配置。

这种方法的缺点是需要一些硬件的重复配置,并且在尝试平稳地传输和同步所有数据时可能会带来困难。

如果你需要将应用程序从一个数据中心迁移到另一个数据中心,也可能需要执行类似的操作。

在本文中,我们将讨论并详细介绍三种在 Elasticsearch 集群之间传输数据的方法。

如何在 Elasticsearch 集群之间迁移数据?

有三种方式可以在 Elasticsearch 集群之间传输数据:

  • 从远程集群重新索引

  • 使用快照传输数据

  • 使用 Logstash 传输数据

使用快照通常是最快且最可靠的数据传输方式。然而,请记住,你只能将快照恢复到相同版本或更高版本的集群,且版本差异不能超过一个主版本。这意味着你可以将一个 6.x 的快照恢复到 7.x 的集群,但不能恢复到 8.x 的集群。

如果你需要升级超过一个主版本,你将需要重新索引或使用 Logstash。

现在,让我们详细了解在 Elasticsearch 集群之间传输数据的三种选项。

1. 从远程集群重新索引数据

在开始重新索引之前,请记住你需要为新集群上的所有索引设置合适的映射。为此,你必须直接使用合适的映射创建索引,或使用索引模板。

从远程重新索引 — 所需配置

为了从远程集群重新索引,你需要在接收数据的集群中将以下配置添加到 elasticsearch.yml 文件中,该文件在 Linux 系统中通常位于:
/etc/elasticsearch/elasticsearch.yml。需要添加的配置如下:

reindex.remote.whitelist: "192.168.1.11:9200"

如果你正在使用 SSL,你应该将 CA 证书添加到每个节点,并在每个节点的 elasticsearch.yml 中加入以下命令:

reindex.ssl.certificate_authorities: “/path/to/ca.pem”

或者,你也可以在所有 Elasticsearch 节点中添加以下这一行,以禁用 SSL 验证。不过,这种方式不太推荐,因为它相比前一种方式安全性较低:

reindex.remote.whitelist: "192.168.1.11:9200"
reindex.ssl.verification_mode: none
systemctl restart elasticsearch service 

你需要在每个节点上进行这些修改,并执行滚动重启。有关如何进行的更多信息,请参阅我们的指南。

重新索引命令

在你已经在 elasticsearch.yml 文件中定义了远程主机并在需要时添加了 SSL 证书之后,你可以使用以下命令开始重新索引数据:

POST _reindex
{
  "source": {
    "remote": {
      "host": "http://192.168.1.11:9200",
      "username": "elastic",
      "password": "123456",
     "socket_timeout": "1m",
      "connect_timeout": "1m"

    },
    "index": "companydatabase"
  },
  "dest": {
    "index": "my-new-index-000001"
  }
}

在执行此操作时,你可能会遇到超时错误,因此,设置较大的超时时间值可能会比依赖默认值更为有用。

现在,让我们看看在从远程重新索引时你可能遇到的一些常见错误。

从远程重新索引时的常见错误

1. 重新索引未被列入白名单

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "[192.168.1.11:9200] not whitelisted in reindex.remote.whitelist"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "[192.168.1.11:9200] not whitelisted in reindex.remote.whitelist"
  },
  "status": 400
}

如果你遇到这个错误,说明你没有像上面所述那样在 Elasticsearch 中定义远程主机的 IP 地址或节点名称的 DNS,或者忘记重启 Elasticsearch 服务。

为了解决这个问题,你需要将远程主机添加到所有 Elasticsearch 节点中,并重启 Elasticsearch 服务。

2. SSL 握手异常

{
  "error": {
    "root_cause": [
      {
        "type": "s_s_l_handshake_exception",
        "reason": "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target"
      }
    ],
    "type": "s_s_l_handshake_exception",
    "reason": "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target",
    "caused_by": {
      "type": "validator_exception",
      "reason": "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target",
      "caused_by": {
        "type": "sun_cert_path_builder_exception",
        "reason": "unable to find valid certification path to requested target"
      }
    }
  },
  "status": 500
}

这个错误意味着你忘记在 elasticsearch.yml 中添加 reindex.ssl.certificate_authorities,如上所述。要解决此问题,请添加以下内容:

#elasticsearch.yml
reindex.ssl.certificate_authorities: "/path/to/ca.pem"

2. 使用快照传输数据

记住,如上所述,你只能将快照恢复到相同版本或更高版本的集群,且版本差异不能超过一个主版本。

如果你需要升级超过一个主版本,你将需要重新索引或使用 Logstash。

通过快照传输数据的步骤如下:

步骤 1. 将 repository 插件添加到第一个 Elasticsearch 集群 — 为了通过快照在集群之间传输数据,你需要确保 repository 可以从新集群和旧集群都能访问。像 AWS、Google 和 Azure 这样的云存储仓库通常是理想的选择。要创建快照,请参阅我们的指南并按照其中描述的步骤操作。

步骤 2. 重启 Elasticsearch 服务(滚动重启)。

步骤 3. 为第一个 Elasticsearch 集群创建 repository。

步骤 4. 将 repository 插件添加到第二个 Elasticsearch 集群。

步骤 5. 将 repository 设置为只读模式并添加到第二个 Elasticsearch 集群 — 你需要通过重复创建第一个 Elasticsearch 集群时采取的相同步骤来添加 repository。

重要提示: 当将第二个 Elasticsearch 集群连接到相同的 AWS S3 仓库时,你应该将该仓库定义为只读仓库:

PUT _snapshot/my_s3_repository
{
  "type": "s3",
  "settings": {
    "bucket": "my-analytic-data",
    "endpoint": "s3.eu-de.cloud-object-storage.appdomain.cloud",
    "readonly": "true"
  }
}

这很重要,因为你需要防止在同一个快照仓库中混合不同版本的 Elasticsearch。

步骤 6. 将数据恢复到第二个 Elasticsearch 集群 — 在完成上述步骤后,你可以恢复数据并将其传输到新集群。请按照本文中描述的步骤将数据恢复到新集群。

3. 使用 Logstash 传输数据

在开始使用 Logstash 传输数据之前,请记住你需要为新集群上的所有索引设置合适的映射。为此,你需要直接创建索引或使用索引模板。

为了在两个 Elasticsearch 集群之间传输数据,你可以设置一个临时的 Logstash 服务器,并使用它在两个集群之间传输数据。对于小型集群,2GB 内存的实例应该足够。对于较大的集群,你可以使用四核 CPU 和 8GB 内存的实例。

有关安装 Logstash 的指导,请参阅此处。

从一个集群到另一个集群的 Logstash 配置

一个基本的配置,复制单个索引从集群 A 到集群 B,如下所示:

iinput
{
elasticsearch
      {
        hosts => ["192.168.1.11:9200"]
        index => "index_name"
       docinfo => true      
      }
}

output 
{
  elasticsearch {
        hosts => "https://192.168.1.12:9200"
        index => "index_name"
        
  }
}

对于安全的 Elasticsearch,你可以使用以下配置:

input
{
  elasticsearch
      {
        hosts => ["192.168.1.11:9200"]
        index => "index_name"
        docinfo => true 
        user => "elastic"
        password => "elastic_password"
        ssl => true
        ssl_certificate_verification => false
            
      }
}

output 
{
  elasticsearch {
        hosts => "https://192.168.1.12:9200"
        index => "index_name"
        user => "elastic"
        password => "elastic_password"
        ssl => true
        ssl_certificate_verification => false
  }
}

索引元数据

上述命令将写入一个单独命名的索引。如果你想要传输多个索引并保留索引名称,则需要在 Logstash 输出中添加以下行:

index => "%{[@metadata][_index]}"

如果你还想保留文档的原始 ID,那么你需要添加:

document_id => "%{[@metadata][_id]}"

请记住,设置文档 ID 会使数据传输显著变慢,因此只有在需要时才保留原始 ID。

更新同步

上述所有方法都会花费相对较长的时间,你可能会发现,在等待过程完成的过程中,原始集群中的数据已经被更新。

有多种策略可以使在数据传输过程中发生的任何更新得以同步,在开始此过程之前,你应该考虑这些问题。特别是,你需要考虑以下问题:

  • 你有什么方法来识别自数据传输过程开始以来已更新/添加的数据(例如,数据中的 “last_update_time” 字段)?

  • 你可以使用什么方法来传输最后一部分数据?

  • 是否存在记录重复的风险?通常是有的,除非你使用的方法在重新索引时将文档 ID 设置为已知值。

下面描述了不同的方法来启用更新的同步。

  1. 使用队列系统
    一些摄取/更新系统使用队列,使你能够 “重放” 在过去 x 天内接收到的数据修改。这可能提供一种同步所有更改的方法。

  2. 从远程重新索引
    对所有 “last_update_time” > x 天前的项目重复重新索引过程。你可以通过在重新索引请求中添加 “query” 参数来实现这一点。

  3. Logstash
    在 Logstash 输入中,你可以添加一个查询来过滤所有 “last_update_time” > x 天前的项目。然而,除非你设置了 document_id,否则这个过程会导致非时间序列数据的重复。

  4. 快照
    无法仅恢复部分索引,因此你必须使用上述其他数据传输方法之一(或脚本)来更新数据传输过程执行以来的任何更改。

然而,快照恢复比重新索引/Logstash 过程要快得多,因此可以在快照传输期间暂停更新,短时间内避免问题的发生。

想要获得 Elastic 认证吗?了解下一期 Elasticsearch 工程师培训的时间!

Elasticsearch 拥有众多新功能,帮助你为你的用例构建最佳搜索解决方案。深入了解我们的示例笔记本,开始免费的云试用,或者现在就尝试在本地机器上使用 Elastic。

原文:How to migrate data between different versions of Elasticsearch & between clusters - Elasticsearch Labs

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

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

相关文章

Day08【基于预训练模型分词器实现交互型文本匹配】

基于预训练模型分词器实现交互型文本匹配 目标数据准备参数配置数据处理模型构建主程序测试与评估总结 目标 本文基于预训练模型bert分词器BertTokenizer,将输入的文本以文本对的形式,送入到分词器中得到文本对的词嵌入向量,之后经过若干网络…

npm和npx的作用和区别

npx 和 npm 是 Node.js 生态系统中两个常用的工具,它们有不同的作用和使用场景。 1. npm(Node Package Manager) 作用: npm 是 Node.js 的包管理工具,主要用于: 安装、卸载、更新项目依赖(包&a…

C++学习之金融类安全传输平台项目git

目录 1.知识点概述 2.版本控制工具作用 3.git和SVN 4.git介绍 5.git安装 6.工作区 暂存区 版本库概念 7.本地文件添加到暂存区和提交到版本库 8.文件的修改和还原 9.查看提交的历史版本信息 10.版本差异比较 11.删除文件 12.本地版本管理设置忽略目录 13.远程git仓…

CCF CSP 第36次(2024.12)(1_移动_C++)

CCF CSP 第36次(2024.12)(1_移动_C) 解题思路:思路一: 代码实现代码实现(思路一): 时间限制: 1.0 秒 空间限制: 512 MiB 原题链接 解题思路&…

7.thinkphp的路由

一.路由简介 1. 路由的作用就是让URL地址更加的规范和优雅,或者说更加简洁; 2. 设置路由对URL的检测、验证等一系列操作提供了极大的便利性; 3. 路由是默认开启的,如果想要关闭路由,在config/app.php配置…

(五)机器学习---决策树和随机森林

在分类问题中还有一个常用算法:就是决策树。本文将会对决策树和随机森林进行介绍。 目录 一.决策树的基本原理 (1)决策树 (2)决策树的构建过程 (3)决策树特征选择 (4&#xff0…

【项目管理】第16章 项目采购管理-- 知识点整理

项目管理-相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应&…

从图像“看出动作”

📘 第一部分:运动估计(Motion Estimation) 🧠 什么是运动估计? 简单说: 👉 给你一段视频,计算机要“看懂”里面什么东西动了、往哪动了、有多快。 比如: 一…

鸿蒙案例---生肖抽卡

案例源码: Zodiac_cards: 鸿蒙生肖抽奖卡片 效果演示 初始布局 1. Badge 角标组件 此处为语雀内容卡片,点击链接查看:https://www.yuque.com/kevin-nzthp/lvl039/rccg0o4pkp3v6nua 2. Grid 布局 // 定义接口 interface ImageCount {url:…

宿舍管理系统(servlet+jsp)

宿舍管理系统(servletjsp) 宿舍管理系统是一个用于管理学生宿舍信息的平台,支持超级管理员、教师端和学生端三种用户角色登录。系统功能包括宿舍管理员管理、学生管理、宿舍楼管理、缺勤记录、添加宿舍房间、心理咨询留言板、修改密码和退出系统等模块。宿舍管理员…

驱动-兼容不同设备-container_of

驱动兼容不同类型设备 在 Linux 驱动开发中,container_of 宏常被用来实现一个驱动兼容多种不同设备的架构。这种设计模式在 Linux 内核中非常常见,特别 是在设备驱动模型中。linux内核的主要开发语言是C,但是现在内核的框架使用了非常多的面向…

MySQLQ_数据库约束

目录 什么是数据库约束约束类型NOT NULL 非空约束UNIQUE 唯一约束PRIMARY KEY主键约束FOREIGN KEY外键约束CHECK约束DEFAULT 默认值(缺省)约束 什么是数据库约束 数据库约束就是对数据库添加一些规则,使数据更准确,关联性更强 比如加了唯一值约束&#…

责任链设计模式(单例+多例)

目录 1. 单例责任链 2. 多例责任链 核心区别对比 实际应用场景 单例实现 多例实现 初始化 初始化责任链 执行测试方法 欢迎关注我的博客!26届java选手,一起加油💘💦👨‍🎓😄😂 最近在…

林纳斯·托瓦兹:Linux系统之父 Git创始人

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 林纳斯托瓦兹:Linux之父、Git创始人 一、传奇人物的诞生 1. 早年生活与家…

8. RabbitMQ 消息队列 + 结合配合 Spring Boot 框架实现 “发布确认” 的功能

8. RabbitMQ 消息队列 结合配合 Spring Boot 框架实现 “发布确认” 的功能 文章目录 8. RabbitMQ 消息队列 结合配合 Spring Boot 框架实现 “发布确认” 的功能1. RabbitMQ 消息队列 结合配合 Spring Boot 框架实现 “发布确认” 的功能1.1 回退消息 2.备用交换机3. API说…

维港首秀!沃飞长空AE200亮相香港特别行政区

4月13日-16日,第三届香港国际创科展在香港会议展览中心盛大举办。 作为国内领先、国际一流的eVTOL主机厂,沃飞长空携旗下AE200批产构型登陆国际舞台,以前瞻性的创新技术与商业化应用潜力,吸引了来自全球17个国家及地区的行业领袖…

redis6.2.6-prometheus监控

一、软件及系统信息 redis:redis-6.2.6 redis_exporter:redis_exporter-v1.50.0.linux-amd64.tar.gz # cat /etc/anolis-release Anolis OS release 8.9 granfa; 7.5.3 二、下载地址 https://github.com/oliver006/redis_exporter/releases?page…

如何在idea中快速搭建一个Spring Boot项目?

文章目录 前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热启动(热部署)结语 前言 Spring Boot 凭借其便捷的开发特性,极大提升了开发效率,为 Java 开发工作带来诸多便利。许多大伙伴希望快速…

itext7 html2pdf 将html文本转为pdf

1、将html转为pdf需求分析 经常会看到爬虫有这样的需求,将某一个网站上的数据,获取到了以后,进行分析,然后将需要的数据进行存储,也有将html转为pdf进行存储,作为原始存档,当然这里看具体的需求…

docker compose搭建博客wordpress

一、前言 docker安装等入门知识见我之前的这篇文章 https://blog.csdn.net/m0_73118788/article/details/146986119?fromshareblogdetail&sharetypeblogdetail&sharerId146986119&sharereferPC&sharesourcem0_73118788&sharefromfrom_link 1.1 docker co…