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'
相关推荐
我是天龙_绍4 小时前
用SpringMvc,实现,增删改查,api接口
后端
小蜗牛编程实录5 小时前
MAT分析内存溢出- ShardingSphere JDBC的缓存泄露问题
后端
用户68545375977695 小时前
🚀 Transformer:让AI变聪明的"读心术大师" | 从小白到入门的爆笑之旅
人工智能·后端
深圳蔓延科技5 小时前
SpringSecurity中如何接入单点登录
后端
刻意思考5 小时前
服务端和客户端之间接口耗时的差别
后端·程序员
该用户已不存在5 小时前
Python项目的5种枚举骚操作
后端·python
zjjuejin5 小时前
Maven 云原生时代面临的八大挑战
java·后端·maven
木易士心5 小时前
设计模式六大原则 — 列举反例详解各个原则的核心思想和意义
后端
间彧5 小时前
Java Optional类详解与应用实战
后端