背景: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 .