ES2.3基於快照的遷移上雲實錄

背景: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 .
相關文章
相關標籤/搜索