ES迁移到OpenSearch

本文详细介绍了如何通过共享文件系统、Logstash迁移以及S3存储实现Elasticsearch和OpenSearch的数据备份与恢复,涉及配置、插件安装和恢复步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方式一:共享文件存储迁移

尽管可以使用 repository-s3 插件直接将快照生成到 S3,但必须在每个节点上安装此插件,调整 opensearch.yml(如果使用的是 Elasticsearch 集群,则需要调整 elasticsearch.yml),重新启动每个节点,添加 AWS 凭证,最后拍摄快照。此插件是持续使用或迁移大型集群的绝佳选择。

  1. 要将共享文件系统用作快照存储库,请将其添加到:elasticsearch.yml和opensearch.yml(如果上传到s3则不需要)

path.repo: ["/mnt/snapshots"]

  1. 如果您使用的是 Docker 安装,请在启动群集之前将文件系统添加到 中的每个节点:docker-compose.yml
volumes:
  - /Users/jdoe/snapshots:/mnt/snapshots
  1. 然后使用 REST API 注册存储库:
PUT _snapshot/my-fs-repository
{
  "type": "fs",
  "settings": {
    "location": "/mnt/snapshots"
  }
}
  1. 如果成功

{ "acknowledged": true }

  1. 接下来有两种恢复方式:
  • 将备份上传到s3上然后进行恢复
  • 如果使用的是docker且es和opensearch挂载了同一块数据卷,那么可以在opensearch中创建存储库,然后恢复。

方式二:logstash迁移

如果使用的是elastic的logstash需要下载opensearch插件。download
如果使用opensearch构建的logstash已经包含opensearch插件。download
logstash的pipeline配置:

input {
      # Read all documents from Elasticsearch matching the given query
      elasticsearch {
        hosts => "172.31.73.46:9205"
        index => "test_index"
        docinfo => true
        docinfo_target => "[@metadata][doc]"
        slices => 5
        size => 5000
      }
}

filter {
  # 去掉一些Logstash自己加的字段。
  mutate {
    remove_field => ["@timestamp", "@version"]
  }
}


output {
    opensearch {
      hosts => ["172.31.73.46:9200"]
      index => "opensearch-logstash-test"
      document_type => "%{[@metadata][doc][_type]}"
      document_id => "%{[@metadata][doc][_id]}"
      #user => "admin"
			#password => "admin"
      ssl => false
      ssl_certificate_verification => false
   }
}

$ bin/logstash -f config/pipeline.conf

方式三:S3迁移

  1. 部署minio
version: '2'

services:
  minio:
    image: bitnami/minio:latest
    ports:
      - '9000:9000'
      - '9001:9001'
    volumes:
      - 'minio_data:/data'
    environment:
      - MINIO_ROOT_USER=minio-root-user
      - MINIO_ROOT_PASSWORD=minio-root-password
      - MINIO_SKIP_CLIENT=yes
      # - MINIO_SERVER_ACCESS_KEY=minio-access-key
      # - MINIO_SERVER_SECRET_KEY=minio-secret-key
volumes:
  minio_data:
    driver: local
  1. 在minio页面创建accesskey和secretkey
  2. 在opensearch和elasticsearch环境设置accesskey和secretkey
bin/opensearch-keystore add --stdin s3.client.default.access_key
bin/opensearch-keystore add --stdin s3.client.default.secret_key
  1. 修改opensearch.yml

设置endpoint和protocol

s3.client.default.endpoint: 172.31.73.46:9000
s3.client.default.protocol: http
  1. 下载s3插件

bin/opensearch-plugin install repository-s3

  1. 重启opensearch以及elasticsearch
  2. 在opensearch和elasticsearch中创建仓库
PUT _snapshot/my_backup 
{
    "type": "s3",
    "settings": {
        "bucket": "xxxxxx"
    }
}
  1. 在elasticsearch中指定备份索引
PUT _snapshot/my_backup/snapshot_1
{
    "indices": "index_1,index_2"
}
  1. 在opensearch中恢复数据
POST _snapshot/my_backup/snapshot_1/_restore

默认行为是把这个快照里存有的所有索引都恢复。如果 snapshot_1 包括五个索引,这五个都会被恢复到我们集群里。

### OpenSearch 在 Java 环境中的集成与使用 OpenSearch 是一种开源搜索引擎,旨在提供类似于 Elasticsearch 的功能,同时支持更广泛的社区贡献。在 Java 环境下,开发者可以通过多种方式实现 OpenSearch 的集成和开发。 #### 1. 客户端库的选择 为了简化 OpenSearch 和 Java 应用程序之间的交互,官方提供了专门的客户端库 `opensearch-java`。该库允许开发者通过简单的 API 调用来执行索引操作、查询数据以及管理集群状态[^4]。以下是基本依赖项配置: 对于 Maven 用户: ```xml <dependency> <groupId>org.opensearch.client</groupId> <artifactId>opensearch-rest-high-level-client</artifactId> <version>2.9.0</version> </dependency> ``` Gradle 配置如下: ```gradle implementation 'org.opensearch.client:opensearch-rest-high-level-client:2.9.0' ``` #### 2. 基本连接设置 建立到 OpenSearch 实例的连接通常涉及创建一个 RESTful 客户端实例,并指定目标节点地址。以下是一个典型的初始化代码片段: ```java import org.opensearch.action.index.IndexRequest; import org.opensearch.action.index.IndexResponse; import org.opensearch.client.RestHighLevelClient; import org.apache.http.HttpHost; public class OpenSearchExample { public static void main(String[] args) throws Exception { RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http")) ); IndexRequest request = new IndexRequest("my-index"); String jsonString = "{" + "\"name\":\"John Doe\"," + "\"age\":30," + "\"city\":\"New York\"" + "}"; request.source(jsonString, XContentType.JSON); IndexResponse response = client.index(request, RequestOptions.DEFAULT); System.out.println(response.getId()); client.close(); } } ``` 此示例展示了如何向名为 `my-index` 的索引插入一条记录并打印其唯一 ID[^5]。 #### 3. 查询数据 除了写入外,读取也是常见的需求之一。可以利用 DSL 构建复杂的搜索条件来检索所需的数据集。下面的例子说明了基于关键字匹配获取文档的方法: ```java import org.opensearch.action.search.SearchRequest; import org.opensearch.action.search.SearchResponse; import org.opensearch.index.query.QueryBuilders; import org.opensearch.search.builder.SearchSourceBuilder; // ... SearchRequest searchRequest = new SearchRequest("my-index"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchQuery("field_name", "search_value")); searchRequest.source(sourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); System.out.println(searchResponse.getHits().getTotalHits()); ``` 这里我们构建了一个针对特定字段值进行模糊查找的操作流程[^6]。 #### 4. 数据管道与其他工具协作 正如提到过的 Kafka Connect 提供了一种高效的方式处理大规模实时流式传输任务[^3]。如果项目场景涉及到从消息队列中提取结构化日志事件并将它们存储至 OpenSearch,则可考虑采用这种方式完成自动化迁移过程而无需额外编写自定义逻辑脚本文件等等复杂工作量较大的部分。 另外值得注意的是,在某些情况下可能还需要结合其他框架比如 Spring Boot 来进一步增强应用的功能性和易维护程度等方面表现出来的优势特性等问题解决方案探讨等内容未展开讨论但同样重要值得深入研究学习实践探索发现更多可能性拓展视野增长见识积累经验提升技能水平达到更高层次成就非凡事业创造更大价值回报社会贡献力量造福人类共同进步发展繁荣昌盛美好未来! ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值