千家信息网

ES2.3基于快照的迁移上云实录

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,背景:1、根据公司上云规划,需要将目前生产环境的N套ES2.3集群搬迁到阿里云ES环境。但是生产环境的ES因为磁盘空间有限,没有启用 _source ,因此无法通过reindex进行数据迁移。这里只能
千家信息网最后更新 2026年11月02日ES2.3基于快照的迁移上云实录

背景:

1、根据公司上云规划,需要将目前生产环境的N套ES2.3集群搬迁到阿里云ES环境。但是生产环境的ES因为磁盘空间有限,没有启用 _source ,因此无法通过reindex进行数据迁移。这里只能锁写然后通过快照方式进行迁移。



前置步骤:

1、对机房的es节点安装oss插件

阿里云提供了es的oss插件,地址 https://github.com/aliyun/elasticsearch-repository-oss 需要注意的是,安装这个插件需要滚动重启es集群的。

安装oss插件的这个前置操作我这里就跳过了,没啥好说的。参考官方文档提出的滚动重启操作步骤进行就行。

2、开通阿里云oss的bucket,并记录下accesskey相关授权信息

3、我们快照数据通过内网直接打到阿里云oss的专用的bucket里面(TIPS:拉了专线,走内网,需要加个路由才能用oss的内网域名地址)



下面是我执行快照和恢复的全流程:


step1_idc_reg_oss.sh 注册idc的es快照仓库地址到阿里云oss

#!/bin/bash# 传参1 为 es集群的 lb地址 (用后端真实节点地址也行) echo "作用:"echo "注册快照地址到阿里云到oss仓库"echo# 找出集群的名称CLUSTER_NAME=$(curl -s http://$1:9200/ | grep cluster_name | awk -F ':' '{print $2}' | awk -F '"' '{print $2}')echo "ES集群名称:" $CLUSTER_NAMEecho# 注册快照仓库 ,走专线 oss内网地址curl -s -XPUT  http://$1:9200/_snapshot/$CLUSTER_NAME -d "{\"type\": \"oss\",\"settings\": {\"base_path\": \"$CLUSTER_NAME\",\"endpoint\": \"http://oss-cn-hangzhou-internal.aliyuncs.com\",\"access_key_id\": \"thisismyaccesskeyid\",\"secret_access_key\": \"thisismykey\",\"bucket\": \"snapshot-es\",\"compress\": true}}"# 确认仓库是否okcurl -s -XGET http://$1:9200/_snapshot/$CLUSTER_NAME | jq .




step2_first_snapshot.sh 对idc的es打一个全量快照到阿里云oss

#!/bin/bash# 传参1 为 es集群的 lb地址 (用后端真实节点地址也行) echo "作用:"echo "后台打快照存到阿里云oss仓库"echo# 找出集群的名称CLUSTER_NAME=$(curl -s http://$1:9200/ | grep cluster_name | awk -F ':' '{print $2}' | awk -F '"' '{print $2}')echo "ES集群名称:" $CLUSTER_NAMEecho# 在后台打快照echo "开始在后台打快照"curl -s -XPUT http://$1:9200/_snapshot/$CLUSTER_NAME/$(date +%Y_%m_%d_%H_%M) | jq .echoecho "查看快照的进度方法: curl -XGET http://$1:9200/_snapshot/$CLUSTER_NAME/_all?pretty"echo


注意:step2 这个脚本第一次跑通后,我们可以在上云前1-2天加个cronjob每小时跑一次,这样在最后上云迁移的时候,增量快照需要的时间就会很短暂。大幅度减少不可用时间。



step3_aliyun_reg_oss.sh 注册阿里云的es快照仓库地址到阿里云oss

#!/bin/bash# 传参1 为 机房es集群的LB地址# 传参2 为 阿里云es集群的域名echo "作用:"echo "注册阿里云es到阿里云的oss仓库"echo# 找出集群的名称CLUSTER_NAME=$(curl -s http://$1:9200/ | grep cluster_name | awk -F ':' '{print $2}' | awk -F '"' '{print $2}')echo "ES集群名称:" $CLUSTER_NAMEecho# 阿里云关联oss仓库curl -s -XPUT http://$2:9200/_snapshot/$CLUSTER_NAME -d "{\"type\": \"oss\",\"settings\": {\"base_path\": \"$CLUSTER_NAME\",\"endpoint\": \"http://oss-cn-hangzhou-internal.aliyuncs.com\",\"access_key_id\": \"thisismyaccesskeyid\",\"secret_access_key\": \"thisismykey\",\"bucket\": \"snapshot-es\",\"compress\": true}}"# 确认快照仓库是否okcurl -s -XGET http://$2:9200/_snapshot/$CLUSTER_NAME?pretty | jq .echo "curl -s -XGET http://$2:9200/_snapshot/$CLUSTER_NAME?pretty | jq ."



step4 开始,需要在割接当晚操作

step4_stop_write_idc_index.sh 关闭idc 的es索引的写权限,保留只读权限

#!/bin/bash# 传参1 为 es集群的 lb地址 (用后端真实节点地址也行) echo "作用:"echo "关闭机房es的索引的写权限,以便后续进行最后一次的快照操作"echo#找出集群的名称CLUSTER_NAME=$(curl -s http://$1:9200/ | grep cluster_name | awk -F ':' '{print $2}' | awk -F '"' '{print $2}')echo $CLUSTER_NAME# 关闭全部索引的写权限,保留读权限echo "开始关闭全部索引的写权限,保留读权限..."curl -s -XPUT http://$1:9200/_all/_settings -d '{  "index": {    "blocks": {      "write": "true"    }  }}'# 官方文档 https://www.elastic.co/guide/en/elasticsearch/reference/2.3/index-modules.html# index.blocks.read_only# Set to true to make the index and index metadata read only, false to allow writes and metadata changes.(设置为true 可以禁止对索引和索引的metadata进行修改,控制的更严格些)# index.blocks.write#Set to true to disable write operations against the index.(设置为 true 来禁止对索引的写操作。但索引的 metadata 可以正常写。)# 注意:index.blocks.read_only 和 index.blocks.write 这2个参数,不能同时使用,只能选其一



step5_increase_snapshot.sh 再人工执行一次快照脚本(这时候打的是增量快照,耗时不会太久)

#!/bin/bash# 传参1 为 es集群的 lb地址 (用后端真实节点地址也行) echo "作用:"echo "关闭机房es写权限后,后台再打一次快照存到阿里云oss仓库"echo# 找出集群的名称CLUSTER_NAME=$(curl -s http://$1:9200/ | grep cluster_name | awk -F ':' '{print $2}' | awk -F '"' '{print $2}')echo "ES集群名称:" $CLUSTER_NAMEecho# 在后台打快照echo "开始在后台打快照"echo "查看快照的进度方法: curl -XGET http://$1:9200/_snapshot/$CLUSTER_NAME/_all?pretty"curl -s -XPUT http://$1:9200/_snapshot/$CLUSTER_NAME/$(date +%Y_%m_%d_%H_%M) | jq .


注意: 确保step5的快照进度完成后,才能执行下面的step6操作!!


step6_restore_into_aliyun.sh 将oss上面的最新快照恢复到阿里云ES环境

#!/bin/bash# 从阿里云oss恢复数据到阿里云es# 参数1 为 idc 的es 的lb地址 (不用带端口号)# 参数2 为 阿里云es 的域名  (不用带端口号)echo "作用:"echo "从oss仓库恢复数据到阿里云es"echo# 找出集群的名称CLUSTER_NAME=$(curl -s http://$1:9200/ | grep cluster_name | awk -F ':' '{print $2}' | awk -F '"' '{print $2}')echo "ES集群名称:" $CLUSTER_NAMEecho# 找到最新的快照名称:SNAPSHOT_NAME=$(curl -s  -XGET http://$2:9200/_snapshot/$CLUSTER_NAME/_all?pretty | egrep snapshot | tail -1 | awk -F ':' '{print $2}' | awk -F '"' '{print $2}')echo "最后一个snapshot的名称:" ${SNAPSHOT_NAME}# 调整阿里云ES参数 加快恢复速度echo "调整阿里云ES参数 加快恢复速度"curl -s -XPUT  http://$2:9200/_cluster/settings?flat_settings=true -d '{  "transient": {    "indices.recovery.concurrent_streams": "10",    "indices.recovery.concurrent_small_file_streams": "10",    "indices.recovery.max_bytes_per_sec": "100mb",    "cluster.routing.allocation.node_concurrent_recoveries": "24"  }}' | jq .# 执行阿里云ES数据恢复操作echo "开始阿里云ES数据恢复"curl -s -XPOST http://$2:9200/_snapshot/$CLUSTER_NAME/$SNAPSHOT_NAME/_restore -d '{  "index_settings": {     "index.number_of_replicas": 0  }}'echoechoecho "查看恢复的进度 curl -s -X GET http://$2:9200/_recovery/ | jq ."


等阿里云ES集群变绿后(通过_cat api 或者 cerebro观察),开始执行step7操作


step7_aliyun_open_index_increase_replica.sh 打开阿里云es的写功能,并调整index副本为1

#!/bin/bash# 调整阿里云es 增加副本数# 参数1 为 阿里云es 的域名 (不用带端口号)echo "作用:"echo "阿里云es打开写,并调整副本改为1"echoecho "打开阿里云ES的写权限"curl -s -XPUT http://$1:9200/_all/_settings -d '{  "index": {    "blocks": {      "write": "false"    }  }}'sleep 1 echo "调整全部index的副本为1"curl -s -XPUT http://$1:9200/_all/_settings -d '{  "number_of_replicas": 1}'


至此, 我们就可以通知开发测试 发版后跟进测试了。



可选步骤

step8_close_idc_index.sh 建议在完成迁移后,关闭老的es的索引,这样如果有连接连到老es,就会报错便于及时发现问题

#!/bin/bash# 传参1 为 es集群的 lb地址 (用后端真实节点地址也行) echo "作用:"echo "关闭机房es的索引"echo# 列出打开状态的索引idx=$(curl -s -XGET http://$1:9200/_cat/indices?h=index,status| grep -v close)indices=$(echo $idx| sed 's/ /,/g'| sed 's/,open//g')echo "当前打开的索引如下:" echo $indicesechoechoecho "开始执行close index 操作 ...."curl -s -XPOST http://$1:9200/$indices/_close?pretty | jq .






阿里 快照 集群 地址 名称 索引 仓库 权限 作用 参数 后台 数据 节点 调整 机房 副本 域名 插件 环境 进度 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海卓越科技互联网 广州紫鲸互联网科技有限公司 金融科技 互联网金融 嘟嘟瓜互联网科技 宜安科技 互联网金融 致聘互联网科技 奔汉互联网科技 互联网科技美容 互联网 科技服务平台 老年人脱离互联网科技的作文 须眉科技是互联网公司吗 互联网为啥属于高科技 厦门比较好的科技互联网公司 青岛科技大学互联网大赛研究生 深圳市优智互联网科技有限公司 深圳育鹏互联网科技有限公司招聘 玉溪新华互联网科技好不好 中和天地互联网科技有限公司 互联网对科技影响 优雇互联网科技有限公司 腾讯阿里互联网科技 互联网汽车科技小镇 互联网经济与金融科技 武汉健翔互联网络科技有限公司 深圳艾果互联网通讯科技 互联网安防科技感 有人说阿里系是互联网科技企业 山东大美朱楼互联网科技有限公司 青岛易易互联网科技 如何强化互联网金融科技
0