Easysearch、Elasticsearch、Amazon OpenSearch 快照兼容对比

news/2024/11/15 11:18:51/文章来源:https://www.cnblogs.com/infinilabs/p/18329107

在当今的数据驱动时代,搜索引擎的快照功能在数据保护和灾难恢复中至关重要。本文将对 Easysearch、Elasticsearch 和 Amazon OpenSearch 的快照兼容性进行比较,分析它们在快照创建、恢复、存储格式和跨平台兼容性等方面的特点,帮助大家更好地理解这些搜索引擎的差异,从而选择最适合自己需求的解决方案。

启动集群

Easysearch

服务器一般情况下默认参数都是很低的,而 Easysearch/Elasticsearch 是内存大户,所以就需要进行系统调优。

sysctl -w vm.max_map_count=262144

vm.max_map_count 是一个 Linux 内核参数,用于控制单个进程可以拥有的最大内存映射区域(VMA,Virtual Memory Areas)的数量。内存映射区域是指通过内存映射文件或匿名内存映射创建的虚拟内存区域。

这个参数在一些应用程序中非常重要,尤其是那些需要大量内存映射的应用程序,比如 Elasticsearch。Elasticsearch 使用内存映射文件来索引和搜索数据,这可能需要大量的内存映射区域。如果 vm.max_map_count 设置得太低,Elasticsearch 可能无法正常工作,并会出现错误信息。

调整 vm.max_map_count 参数的一些常见原因:

  1. 支持大型数据集
    应用程序(如 Elasticsearch)在处理大型数据集时可能需要大量内存映射区域。增加 vm.max_map_count 可以确保这些应用程序有足够的内存映射区域来处理数据。

  2. 防止内存错误
    如果 vm.max_map_count 设置得太低,当应用程序尝试创建超过限制的内存映射时,会出现错误,导致应用程序崩溃或无法正常工作。

  3. 优化性能
    适当地设置 vm.max_map_count 可以优化应用程序的性能,确保内存映射操作顺利进行。

检查当前的 vm.max_map_count 值:

sysctl vm.max_map_count

或者查看 /proc/sys/vm/max_map_count 文件:

cat /proc/sys/vm/max_map_count

Elasticsearch 官方建议将 vm.max_map_count 设置为至少 262144。对于其他应用程序。

Easysearch 具体安装步骤见 INFINI Easysearch 尝鲜 Hands on

Amazon OpenSearch

使用 Amazon Web Services 控制台进行创建。

Elasticsearch

使用如下 docker compose 部署一个三节点的 ES 集群:

version: "2.2"
services:es01:image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2container_name: es01environment:- node.name=es01- cluster.name=es-docker-cluster- discovery.seed_hosts=es02,es03- cluster.initial_master_nodes=es01,es02,es03- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms512m -Xmx512m"ulimits:memlock:soft: -1hard: -1volumes:- data01:/usr/share/elasticsearch/dataports:- 9200:9200networks:- elastices02:image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2container_name: es02environment:- node.name=es02- cluster.name=es-docker-cluster- discovery.seed_hosts=es01,es03- cluster.initial_master_nodes=es01,es02,es03- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms512m -Xmx512m"ulimits:memlock:soft: -1hard: -1volumes:- data02:/usr/share/elasticsearch/datanetworks:- elastices03:image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2container_name: es03environment:- node.name=es03- cluster.name=es-docker-cluster- discovery.seed_hosts=es01,es02- cluster.initial_master_nodes=es01,es02,es03- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms512m -Xmx512m"ulimits:memlock:soft: -1hard: -1volumes:- data03:/usr/share/elasticsearch/datanetworks:- elasticvolumes:data01:driver: localdata02:driver: localdata03:driver: localnetworks:elastic:driver: bridge

由于这个 docker compose 没有关于 kibana 的配置,所以我们还是用 Console 添加原生的 Elasticsearch 集群!

集群信息

快照还原的步骤

快照前的准备

插件安装

本次测试选择把索引快照备份到 Amazon S3,所以需要使用 S3 repository plugin,这个插件添加了对使用 Amazon S3 作为快照/恢复存储库的支持。

Easysearch 和 OpenSearch 集群自带了这个插件,所以无需额外安装。

对于自己部署的三节点 Elasticsearch 则需要进入每一个节点运行安装命令然后再重启集群,建议使用自动化运维工具来做这步,安装命令如下:

sudo bin/elasticsearch-plugin install repository-s3

如果不再需要这个插件,可以这样删除。

sudo bin/elasticsearch-plugin remove repository-s3

由于需要和 Amazon Web Services 打交道,所以我们需要设置 IAM 凭证,这个插件可以从 EC2 IAM instance profile,ECS task role 以及 EKS 的 Service account 读取相应的凭证。

对于托管的 Amazon OpenSearch 来说,我们无法在托管的 EC2 上绑定我们的凭证,所以需要新建一个 OpenSearchSnapshotRole,然后通过当前的用户把这个角色传递给服务,也就是我们说的 IAM:PassRole。

创建 OpenSearchSnapshotRole,策略如下:

{"Version": "2012-10-17","Statement": [{"Action": ["s3:ListBucket"],"Effect": "Allow","Resource": ["arn:aws:s3:::bucket-name"]},{"Action": ["s3:GetObject","s3:PutObject","s3:DeleteObject"],"Effect": "Allow","Resource": ["arn:aws:s3:::bucket-name/*"]}]
}

信任关系如下:

{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": {"Service": "es.amazonaws.com"},"Action": "sts:AssumeRole"}]
}

然后在我们的 IAM user 上加上 PassRole 的权限,这样我们就可以把 OpenSearchSnapshotRole 传递给 OpenSearch 集群。

{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": "iam:PassRole","Resource": "arn:aws:iam::123456789012:role/OpenSearchSnapshotRole"}]
}

注册存储库

在源集群执行注册

PUT /_snapshot/snapshot-repo-name
{"type": "s3","settings": {"bucket": "<bucket-name>","base_path": "<bucket-prefix>",

在目标集群同样执行这个语句,为了防止覆盖源集群存储库的数据,将 "readonly": true 添加到"settings" PUT 请求中,这样就只有一个集群具有对存储库的写入权限。

PUT /_snapshot/snapshot-repo-name
{"type": "s3","settings": {"bucket": "<bucket-name>","base_path": "<bucket-prefix>","readonly": true,

对于 OpenSearch 来说,还需要执行 passrole,所以还需要添加role_arn这个字段,由于 IAM:PassRole 需要对 HTTP 请求做 signV4 日签名,所以这部常常使用 Postman 来完成。把角色传递过去之后,接下来的快照还原操作就可以在 OpenSearch Dashboard 中进行操作了。

需要注意的是,需要在 auth 这里输入 AccessKey,SecretKey,AWS Region,Service Name(es)来做 SignV4 的签名。

请求体如下:

{"type": "s3","settings": {"bucket": "<bucket-name>","base_path": "<bucket-prefix>","readonly": true,"role_arn": "arn:aws:iam::123456789012:role/OpenSearchSnapshotRole"}
}

  • 查看所有注册的存储库
    • GET _snapshot:这个命令返回所有已注册的快照存储库列表及其基本信息。
GET _snapshot
{"es_repository": {"type": "s3","settings": {"bucket": "your-s3-bucket-name","region": "your-s3-bucket-region"}}
}
  • 查看特定存储库的详细信息
    GET _snapshot/es_repository:这个命令返回名为es_repository的存储库的详细配置信息,包括存储桶名称、区域和其他设置。
GET _snapshot/es_repository
{"es_repository": {"type": "s3","settings": {"bucket": "your-s3-bucket-name","region": "your-s3-bucket-region","access_key": "your-access-key","secret_key": "your-secret-key"}}
}
  • 查看特定存储库中的快照
    GET _cat/snapshots/es_repository?v:这个命令返回es_repository存储库中的所有快照及其详细信息,包括快照 ID、状态、开始时间、结束时间、持续时间、包含的索引数量、成功和失败的分片数量等。
GET _cat/snapshots/es_repository?v
id                     status start_epoch start_time end_epoch end_time duration indices successful_shards failed_shards total_shards
snapshot_1             SUCCESS 1628884800 08:00:00   1628888400 09:00:00 1h       3       10                0             10
snapshot_2             SUCCESS 1628971200 08:00:00   1628974800 09:00:00 1h       3       10                0             10

创建索引快照

# PUT _snapshot/my_repository/<my_snapshot_{now/d}>
PUT _snapshot/my_repository/my_snapshot
{"indices": "my-index,logs-my_app-default",
}

根据快照的大小不同,完成快照可能需要一些时间。默认情况下,create snapshot API 只会异步启动快照过程,该过程在后台运行。要更改为同步调用,可以将 wait_for_completion 查询参数设置为 true

PUT _snapshot/my_repository/my_snapshot?wait_for_completion=true

另外还可以使用 clone snapshot API 克隆现有的快照。要监控当前正在运行的快照,可以使用带有 _current 请求路径参数的 get snapshot API。

GET _snapshot/my_repository/_current

如果要获取参与当前运行快照的每个分片的完整详细信息,可以使用 get snapshot status API。

GET _snapshot/_status

成功创建快照之后,就可以在 S3 上看到备份的数据块文件,这个是正确的快照层级结构:

需要注意的是, "base_path": ""这里最好不要加/,虽然不影响同集群迁移,这个会为我们在不同厂商的搜索引擎中迁移遇到问题,可能是这样的,所以需要注意。

所以在 Open Search 中还原 Elasticsearch 就遇到了这个问题:

{"error": {"root_cause": [{"type": "snapshot_missing_exception","reason": "[easy_repository:2/-jOQ0oucQDGF3hJMNz-vKQ] is missing"}],"type": "snapshot_missing_exception","reason": "[easy_repository:2/-jOQ0oucQDGF3hJMNz-vKQ] is missing","caused_by": {"type": "no_such_file_exception","reason": "Blob object [11111/indices/7fv2zAi4Rt203JfsczUrBg/meta-YGnzxZABRBxW-2vqcmci.dat] not found: The specified key does not exist. (Service: S3, Status Code: 404, Request ID: R71DDHX4XXM0434T, Extended Request ID: d9M/HWvPvMFdPhB6KX+wYCW3ZFqeFo9EoscWPkulOXWa+TnovAE5PlemtuVzKXjlC+rrgskXAus=)"}},"status": 404
}

恢复索引快照

POST _snapshot/my_repository/my_snapshot_2099.05.06/_restore
{"indices": "my-index,logs-my_app-default",
}

各个集群的还原

  1. Elasticsearch 7.10.2 的快照可以还原到 Easysearch 和 Amazon OpenSearch

  2. 从 Easysearch 1.8.2 还原到 Elasticsearch 7.10.2 报错如下:

{"error": {"root_cause": [{"type": "snapshot_restore_exception","reason": "[s3_repository:1/a2qV4NYIReqvgW6BX_nxxw] cannot restore index [my_indexs] because it cannot be upgraded"}],"type": "snapshot_restore_exception","reason": "[s3_repository:1/a2qV4NYIReqvgW6BX_nxxw] cannot restore index [my_indexs] because it cannot be upgraded","caused_by": {"type": "illegal_state_exception","reason": "The index [[my_indexs/ALlTCIr0RJqtP06ouQmf0g]] was created with version [1.8.2] but the minimum compatible version is [6.0.0-beta1]. It should be re-indexed in Elasticsearch 6.x before upgrading to 7.10.2."}},"status": 500
}
  1. 从 Amazon OpenSearch 2.1.3 还原到 Elasticsearch 7.10.2 报错如下(无论是否开启兼容模式):
{"error": {"root_cause": [{"type": "snapshot_restore_exception","reason": "[aos:2/D-oyYSscSdCbZFcmPZa_yg] the snapshot was created with Elasticsearch version [36.34.78-beta2] which is higher than the version of this node [7.10.2]"}],"type": "snapshot_restore_exception","reason": "[aos:2/D-oyYSscSdCbZFcmPZa_yg] the snapshot was created with Elasticsearch version [36.34.78-beta2] which is higher than the version of this node [7.10.2]"},"status": 500
}
  1. 从 Easysearch 1.8.2 还原到 Amazon OpenSearch2.13 报错如下(无论是否开启兼容模式):
{"error": {"root_cause": [{"type": "snapshot_restore_exception","reason": "[easy_repository:2/LE18AWHlRJu9rpz9BJatUQ] cannot restore index [my_indexs] because it cannot be upgraded"}],"type": "snapshot_restore_exception","reason": "[easy_repository:2/LE18AWHlRJu9rpz9BJatUQ] cannot restore index [my_indexs] because it cannot be upgraded","caused_by": {"type": "illegal_state_exception","reason": "The index [[my_indexs/VHOo7yfDTRa48uhQvquFzQ]] was created with version [1.8.2] but the minimum compatible version is OpenSearch 1.0.0 (or Elasticsearch 7.0.0). It should be re-indexed in OpenSearch 1.x (or Elasticsearch 7.x) before upgrading to 2.13.0."}},"status": 500
}

以下是兼容性对比,每行第一列代表源集群,第一行代表目标集群:

快照兼容对比 Easysearch 1.8.2 Elasticsearch 7.10.2 OpenSearch 2.13
Easysearch 1.8.2 兼容 不兼容 不兼容
Elasticsearch 7.10.2 兼容 兼容 兼容
OpenSearch 2.13 不兼容 不兼容 兼容

Elasticsearch 的兼容列表官方的列表如下:

参考文献

  1. 开始使用 Elastic Stack 和 Docker Compose:第 1 部分
    https://www.elastic.co/cn/blog/getting-started-with-the-elastic-stack-and-docker-compose

  2. Docker Compose 部署多节点 Elasticsearch
    https://www.elastic.co/guide/en/elasticsearch/reference/7.10/docker.html#docker-compose-file

  3. repository-s3 教程
    https://www.elastic.co/guide/en/elasticsearch/reference/8.14/repository-s3.html
    https://www.elastic.co/guide/en/elasticsearch/plugins/7.10/repository-s3.html

  4. snapshot-restore
    https://www.elastic.co/guide/en/elasticsearch/reference/7.10/snapshot-restore.html

  5. 在亚马逊 OpenSearch 服务中创建索引快照
    https://docs.amazonaws.cn/zh_cn/opensearch-service/latest/developerguide/managedomains-snapshots.html#managedomains-snapshot-restore

  6. 教程:迁移至 Amazon OpenSearch Service
    https://docs.amazonaws.cn/zh_cn/opensearch-service/latest/developerguide/migration.html

作者:韩旭,亚马逊云技术支持,亚马逊云科技技领云博主,目前专注于云计算开发和大数据领域。

关于 Easysearch 有奖征文活动

黑神话悟空

无论你是 Easysearch 的老用户,还是第一次听说这个名字,只要你对 INFINI Labs 旗下的 Easysearch 产品感兴趣,或者是希望了解 Easysearch,都可以参加这次活动。

详情查看:Easysearch 征文活动

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

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

相关文章

管理项目更高效:顶级进度管理系统大比拼

国内外主流的10款项目进度管理网站对比:PingCode、Worktile、滴答清单(TickTick)、Todoist、NarTick、Teambition、Monday.com、Asana、ClickUp、Trello。在选择合适的项目进度管理工具时,许多项目经理面临着如何找到既能满足团队需求又易于操作的系统的难题。市场上众多的…

05 详细的中断讲解

目录前言一、什么是中断二、如何使用中断1.stm32中断结构1.1 AFIO中断引脚选择1.2 EXTI边缘检测1.3 NVIC优先级配置2.配置stm32的中断1.打开时钟2.配置GPIO口3.配置AFIO控制4.配置EXTI功能5.配置NVIC6.配置完整代码3.书写中断服务函数总结 前言 又鸽了几天的文章,最近在做一个…

VS2022创建C C++ GTEST工程

原因 需要对带代码进行单元测试,选择在Visual studio 中使用GTEST 框架。 实施 创建一个常规的控制台可执行程序。然后使用NUGET安装包 安装GTEST 头文件和动态库,同时安装GTEST ADAPTER。安装可能提示找不到包源,此时需要根据提示配置一下,注意通配符很关键,不要问为甚吗…

攻防世界-简单的图片

攻防世界-简单的图片 1 首先拿到图片是一张非常朴实的图片用010打开发现没什么特别之处因为是png图片猜测是lsb隐写,这里一开始我用的zsteg发现提取不全用Stegsolve打开看看,尝试了半天发现什么特殊信息,最后发现位平面顺序即bit plane order这一选项要选择BGR,得到下图发现…

Logisim-006-2路选择器16位

仓库地址 https://gitee.com/gitliang/logisim-to-cpu

安装系统时没有网络无法完成设置进入系统

按下键盘上的 shift+f10 打开 命令提示符。在命令提示符中输入: oobe\bypassnro 然后按下回车(Enter按键),将重启电脑。根据指引进行设置。进行到下述界面时点击“我没有Internet链接”。然后点击“继续执行受限设置”。根据指引完成设置,进入系统。出处:微软社区问答 h…

工时管理必备:年度最佳软件推荐

国内外主流的10款工时软件对比:PingCode、Worktile、Monday.com、Todoist、GanttPro、TimeCamp、MyBatis、U8+ ERP、金蝶、用友软件。在选择合适的工时软件时,许多企业面临着如何从众多选项中找到最适合自己需求的系统的挑战。这个选择过程往往令人头疼,因为一个不合适的决定…

羽毛球比赛积分系统02

羽毛球比赛积分系统 1、产品愿景目标用户 学校的体育工作人员(老师、教练、裁判),学生和教师选手,赛事组织者,志愿者等羽毛球比赛的参与者。他们的需要或机会简化赛事安排和管理。 提高比赛的公正性和透明度。 实时掌握比赛成绩和排名。 增强赛事互动和参与体验。产品名称…

to do list

数学 图论 数据结构李超线段树dp动态dp字符串manacher语法科技(永远不嫌多)应该没人看吧,那我挂张奇怪的图本文来自博客园,作者:CuFeO4,转载请注明原文链接:https://www.cnblogs.com/hzoi-Cu/p/18328919

CQOI2024AFO记——一半的奇迹

假的退役记居然那么多人看,吓得我赶紧把真的传上来了。我依然可以骄傲地说,我从未后悔过选择OI。一些微不足道的小事 day -?????? tyl:你会写退役记吗? 我:肯定会的。 day -????? 那个心碎的下午。我是最后一个离开的。Chery:唉,多好的孩子。少了点什么呢? (停…

vs2015+Qt环境问题汇总

1、出现一下莫名奇妙的qt头文件编译报错可能原因是Qt版本太高,建议降低版本,VS2015与Qt5.12.9可以编译通过 2、出现无法运行rc.exe错误左边项目资源管理器中右击-->属性-->常规->>目标平台选择8.13、打开.ui界面文件后提示打开错误  1、右击ui文件,然后点【添…