背景:html
一、根据公司上云规划,须要将目前生产环境的N套ES2.3集群搬迁到阿里云ES环境。可是生产环境的ES由于磁盘空间有限,没有启用 _source ,所以没法经过reindex进行数据迁移。这里只能锁写而后经过快照方式进行迁移。node
前置步骤:git
一、对机房的es节点安装oss插件github
阿里云提供了es的oss插件,地址 https://github.com/aliyun/elasticsearch-repository-oss 须要注意的是,安装这个插件须要滚动重启es集群的。后端
安装oss插件的这个前置操做我这里就跳过了,没啥好说的。参考官方文档提出的滚动重启操做步骤进行就行。api
二、开通阿里云oss的bucket,并记录下accesskey相关受权信息bash
三、咱们快照数据经过内网直接打到阿里云oss的专用的bucket里面(TIPS:拉了专线,走内网,须要加个路由才能用oss的内网域名地址)curl
下面是我执行快照和恢复的全流程:elasticsearch
step1_idc_reg_oss.sh 注册idc的es快照仓库地址到阿里云osside
#!/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 .