温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-08-06 12:51:13 来源:网络 阅读:368 作者:我的二狗呢 栏目:系统运维

背景:

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_NAME
echo

# 注册快照仓库 ,走专线 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
}
}"

# 确认仓库是否ok
curl -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_NAME
echo

# 在后台打快照
echo "开始在后台打快照"
curl -s -XPUT http://$1:9200/_snapshot/$CLUSTER_NAME/$(date +%Y_%m_%d_%H_%M) | jq .

echo
echo "查看快照的进度方法: 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_NAME
echo

# 阿里云关联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
}
}"

# 确认快照仓库是否ok
curl -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_NAME
echo

# 在后台打快照
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_NAME
echo

# 找到最新的快照名称:
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
  }
}'

echo
echo
echo "查看恢复的进度 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"
echo
echo "打开阿里云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 $indices
echo
echo

echo "开始执行close index 操作 ...."
curl -s -XPOST http://$1:9200/$indices/_close?pretty | jq .






向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI