es离线部署与配置

Elasticsearch快照迁移是一种非常可靠、高效的数据迁移方案,特别适合大数据量、跨版本迁移或作为数据备份的场景。它通过将数据备份到共享仓库,再从中恢复的方式来完成迁移。

为了帮助您清晰地了解并执行整个流程,我为您梳理了以下详细的步骤和说明。

🔍 快照迁移流程概览

阶段 关键步骤 执行集群 核心目标
1. 准备阶段 配置共享存储/仓库 源集群 & 目标集群 建立一个双方都能访问的存储位置,用于存放快照。
2. 备份阶段 创建快照 源集群 将源索引的数据状态保存到共享仓库中。
3. 恢复阶段 从快照恢复 目标集群 从共享仓库中的快照,将数据还原到目标集群。
4. 验证阶段 检查数据完整性 目标集群 验证索引是否成功恢复,数据是否一致。

🛠️ 详细操作步骤

阶段一:准备共享仓库

这是最关键的一步。您需要一个源集群和目标集群所有节点都能访问的共享存储

1. 选择并设置共享存储

假设我们使用NFS,并将其挂载到了所有节点的 /mnt/es_snapshots 目录下。

2. 在源集群注册快照仓库

  • 修改配置 :在源集群每个节点elasticsearch.yml 文件中添加仓库路径,然后重启集群。

    yaml 复制代码
    path.repo: ["/mnt/es_snapshots"]
  • 注册仓库 :通过API告诉ES这个仓库的位置。

    bash 复制代码
    # 在源集群执行
    curl -X PUT "http://<您的ES地址>:9200/_snapshot/my_migration_repo"
    {
      "type": "fs",
      "settings": {
        "location": "/mnt/es_snapshots",
        "compress": true
      }
    }
    • my_migration_repo:是您为仓库取的名字。
    • type: "fs":表示使用共享文件系统。

阶段二:在源集群创建快照

现在,您可以将数据备份到刚创建的仓库中。

bash 复制代码
# 在源集群执行
  curl -X PUT "http://<您的ES地址>:9200/_snapshot/my_migration_repo/my_snapshot_20240527?wait_for_completion=true
{
  "indices": "index1,index2",        # 指定要备份的索引,用逗号分隔。不指定则备份所有。
  "ignore_unavailable": true,        # 如果某个索引不存在,忽略它
  "include_global_state": false      # 不建议迁移集群全局状态,以免冲突
}
  • my_snapshot_20240527:是快照的名称,建议包含日期。
  • wait_for_completion=true:参数会让请求一直等待,直到快照完成。对于大数据量,可以设为 false 让它在后台运行,然后通过 GET /_snapshot/my_migration_repo/my_snapshot_20240527 来查询状态。

阶段三:在目标集群恢复快照

1. 同样配置目标集群

我们需要源集群创建快照文件复制到目标集群的path.repo目录中,当执行_restore的时候会从对应的仓库下获取对应名称的快照,这个名称源集群创建的时候是什么就是什么。

  • 在目标集群每个节点elasticsearch.yml 中配置相同的 path.repo,并重启集群。

    yaml 复制代码
    path.repo: ["/mnt/es_snapshots"]
  • 在目标集群上注册同一个仓库 (使用相同的名称和配置)。

    bash 复制代码
    # 在目标集群执行
    curl -X PUT "http://<您的ES地址>:9200/_snapshot/my_migration_repo"
    {
      "type": "fs",
      "settings": {
        "location": "/mnt/es_snapshots",
        "compress": true
      }
    }

2. 执行恢复操作

bash 复制代码
# 在目标集群执行
curl POST "http://<您的ES地址>:9200/_snapshot/my_migration_repo/my_snapshot_20240527/_restore?wait_for_completion=true"
{
  "indices": "index1,index2",        # 指定要恢复的索引
  "ignore_unavailable": true,
  "include_global_state": false,
  "rename_pattern": "(.+)",          # 可选:使用正则表达式重命名索引
  "rename_replacement": "restored_$1" # 例如,给所有恢复的索引加上前缀
}

阶段四:验证恢复状态

恢复完成后,进行数据验证。

bash 复制代码
# 1. 检查索引是否存在
curl GET "http://<您的ES地址>:9200/_cat/indices/index1,index2?v

# 2. 对比文档数量
GET _cat/count/index1
GET _cat/count/index2

# 3. 检查恢复状态(如果恢复过程较长)
curl GET "http://<您的ES地址>:9200/_recovery?pretty

⚠️ 重要注意事项

  • 版本兼容性 :目标集群的Elasticsearch主版本号必须大于或等于源集群的版本。例如,可以从 7.x 恢复到 8.x,但不能从 8.x 恢复到 7.x。
  • 停止写入 :为了确保数据一致性,建议在创建快照前,停止对源索引的写操作,或将索引设置为只读模式。
  • 存储空间:确保共享存储(如NFS)有足够的空间存放快照。
  • 权限问题 :确保ES进程有权限在共享目录(如 /mnt/es_snapshots)中读写。

💎 总结

快照迁移方案的优势在于其稳定性和对大数据量的友好性。虽然初次设置共享存储可能需要一些步骤,但一旦配置完成,它就是最可靠的迁移方式之一,尤其适合作为生产环境的迁移方案。

⚠️ 常见问题

  • 确认快照仓库 : curl -XGET 'http://<您的ES地址>:9200/_snapshot/my_migration_repo',请确保 my_migration_repo 是您之前创建并用于存储快照的仓库名称。
  • 查看仓库中的所有快照 : curl -XGET 'http://<您的ES地址>:9200/_snapshot/my_migration_repo/_all?pretty',可以查看快照的名称以及仓库的名称。
  • 创建的分片处于 UNASSIGNED 状态 ,意味着分片无法分配到任何节点。这是常见的集群问题。 我们查看分片的情况:curl -XGET 'http://<您的ES地址>:9200/_cat/indices?v,发现目标索引的health是red状态。curl -XGET 'http://<您的ES地址>:9200/_cat/allocation?v,发现节点处于UNASSIGNED状态,没有分配,然后查看分配情况。
  • 启动发现缺少了插件 : curl -X POST "localhost:9200/_cluster/reroute?pretty",提示缺少analyzer [ik_max_word_]has not been configured in mappings.
  • 安装analyzer ik插件 : https://release.infinilabs.com/analysis-ik/stable/下载与es版本对应的插件,上传到es目录的plugins下,创建一个plugins/ik目录,使用unzip解压即可,然后验证:./bin/elasticsearch-plugin list,可以看到新装的插件。

常见指令

  • 手动管理 Elasticsearch 分片分配的利器:curl -X POST "localhost:9200/_cluster/reroute?pretty"
  • ES查看索引状态:curl -XGET 'http://<您的ES地址>:9200/_cat/indices?v'
  • ES创建索引:curl -X PUT "localhost:9200/my_index"

ik 分词设置

  • 索引分词设置curl -XGET 'http://<您的ES地址>:9200/my_index/_setting'
  • 查看字段的分词映射curl -XGET 'http://<您的ES地址>:9200/my_index/_mapping'
相关推荐
LSL666_11 小时前
SpringBoot自动配置类
java·spring boot·后端·自动配置类
q***783711 小时前
Spring Boot 3.X:Unable to connect to Redis错误记录
spring boot·redis·后端
t***265911 小时前
SpringBoot + vue 管理系统
vue.js·spring boot·后端
qq_124987075312 小时前
基于springboot的疾病预防系统的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·毕业设计
q***25113 小时前
Spring Boot 集成 Kettle
java·spring boot·后端
码事漫谈14 小时前
阿里《灵光》生成的视频下载不带水印的极简方法
后端
舒一笑14 小时前
信息的建筑学:MyBatis Log Panda 如何重构开发者的认知地图
后端·sql·intellij idea
码事漫谈14 小时前
WPF入门指南:解析默认项目结构
后端
iOS开发上架哦14 小时前
7种常见的源代码混淆技术详解:网络安全中的重要防线
后端
回家路上绕了弯14 小时前
单体架构拆微服务:从评估到落地的全流程指南
后端·微服务