马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在当今的数据驱动期间,搜索引擎的快照功能在数据掩护和劫难规复中至关告急。本文将对 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 参数的一些常见缘故起因:
- 支持大型数据集:
应用步伐(如 Elasticsearch)在处理处罚大型数据集时大概必要大量内存映射地区。增长 vm.max_map_count 可以确保这些应用步伐有富足的内存映射地区来处理处罚数据。
- 防止内存错误:
如果 vm.max_map_count 设置得太低,当应用步伐实验创建高出限定的内存映射时,会出现错误,导致应用步伐瓦解或无法正常工作。
- 优化性能:
适当地设置 vm.max_map_count 可以优化应用步伐的性能,确保内存映射操纵顺遂举行。
查抄当前的 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.2
- container_name: es01
- environment:
- - 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: -1
- hard: -1
- volumes:
- - data01:/usr/share/elasticsearch/data
- ports:
- - 9200:9200
- networks:
- - elastic
- es02:
- image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
- container_name: es02
- environment:
- - 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: -1
- hard: -1
- volumes:
- - data02:/usr/share/elasticsearch/data
- networks:
- - elastic
- es03:
- image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
- container_name: es03
- environment:
- - 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: -1
- hard: -1
- volumes:
- - data03:/usr/share/elasticsearch/data
- networks:
- - elastic
- volumes:
- data01:
- driver: local
- data02:
- driver: local
- data03:
- driver: local
- networks:
- 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 assRole。
创建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 哀求中,如许就只有一个集群具有对存储库的写入权限。
如果Bucket在中国区,那么还必要加上endpoint: https://s3.< region >.amazonaws.com.cn如许的参数。
- PUT /_snapshot/snapshot-repo-name
- {
- "type": "s3",
- "settings": {
- "bucket": "<bucket-name>",
- "base_path": "<bucket-prefix>",
- "readonly": true,
- }
- }
复制代码 对于OpenSearch来说,还必要实验passrole,以是还必要添加role_arn这个字段,由于IAM assRole必要对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
:这个下令返回全部已注册的快照存储库列表及其根本信息。
- {
- "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。
乐成创建快照之后,就可以在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",
- }
复制代码 各个集群的还原
- Elasticsearch 7.10.2 的快照可以还原到Easysearch和Amazon OpenSearch
- 从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
- }
复制代码
- 从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
- }
复制代码
- 从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
- }
复制代码
- Amazon OpenSearch还原到Easysearch同样失败
- {
- "error": {
- "root_cause": [
- {
- "type": "snapshot_restore_exception",
- "reason": "[aoss:2/D-oyYSscSdCbZFcmPZa_yg] cannot restore index [aos] because it cannot be upgraded"
- }
- ],
- "type": "snapshot_restore_exception",
- "reason": "[aoss:2/D-oyYSscSdCbZFcmPZa_yg] cannot restore index [aos] because it cannot be upgraded",
- "caused_by": {
- "type": "illegal_state_exception",
- "reason": "The index [[aos/864WjTAXQCaxJ829V5ktaw]] was created with version [36.34.78-beta2] but the minimum compatible version is [6.0.0]. It should be re-indexed in Easysearch 6.x before upgrading to 1.8.2."
- }
- },
- "status": 500
- }
复制代码 Elasticsearch8.14.3迁徙到Amazon OpenSearch大概Elasticsearch都是有这个报错:
- {
- "error": {
- "root_cause": [
- {
- "type": "parsing_exception",
- "reason": "Failed to parse object: unknown field [uuid] found",
- "line": 1,
- "col": 25
- }
- ],
- "type": "repository_exception",
- "reason": "[snap] Unexpected exception when loading repository data",
- "caused_by": {
- "type": "parsing_exception",
- "reason": "Failed to parse object: unknown field [uuid] found",
- "line": 1,
- "col": 25
- }
- },
- "status": 500
- }
复制代码 这是由于Elasticsearch8在创建快照的时间会默认加上一个UUID的字段,以是我们低版本的Easysearch、Amazon OpenSearch中会找不到这个字段,在实验GET _cat/snapshots/snap?v的时间就报错,及时在注册存储库的时间表现加上UUID的字段也无事无补。
- {
- "snapshot-repo-name": {
- "type": "s3",
- "uuid": "qlJ0uqErRmW6aww2Fyt4Fg",
- "settings": {
- "bucket": "<bucket-name>",
- "base_path": "<bucket-prefix>",
- }
- },
复制代码 以下是兼容性对比,每行第一列代表源集群,第一行代表目标集群:
快照兼容对比Easysearch 1.8.2Elasticsearch 7.10.2OpenSearch 2.13Easysearch 1.8.2兼容不兼容不兼容Elasticsearch 7.10.2兼容兼容兼容OpenSearch 2.13不兼容不兼容兼容Elasticsearch的兼容列表官方的列表如下:
参考文献
开始使用 Elastic Stack 和 Docker Compose:第 1 部门
https://www.elastic.co/cn/blog/getting-started-with-the-elastic-stack-and-docker-compose
Docker Compose 摆设多节点Elasticsearch
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/docker.html#docker-compose-file
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
snapshot-restore
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/snapshot-restore.html
在亚马逊 OpenSearch 服务中创建索引快照
https://docs.amazonaws.cn/zh_cn/opensearch-service/latest/developerguide/managedomains-snapshots.html#managedomains-snapshot-restore
教程:迁徙至 Amazon OpenSearch Service
https://docs.amazonaws.cn/zh_cn/opensearch-service/latest/developerguide/migration.html
|