溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ES通過快照方式進(jìn)行數(shù)據(jù)遷移

發(fā)布時(shí)間:2020-06-05 11:35:56 來源:億速云 閱讀:490 作者:Leah 欄目:系統(tǒng)運(yùn)維

這篇文章給大家分享的是有關(guān)ES通過快照方式進(jìn)行數(shù)據(jù)遷移的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí)。如下資料是關(guān)于數(shù)據(jù)遷移的步驟。

1、對(duì)機(jī)房的es節(jié)點(diǎn)安裝oss插件

        阿里云提供了es的oss插件,地址 https://github.com/aliyun/elasticsearch-repository-oss  需要注意的是,安裝這個(gè)插件需要滾動(dòng)重啟es集群的。

        安裝oss插件的這個(gè)前置操作我這里就跳過了,沒啥好說的。參考官方文檔提出的滾動(dòng)重啟操作步驟進(jìn)行就行。

2、開通阿里云oss的bucket,并記錄下accesskey相關(guān)授權(quán)信息

3、我們快照數(shù)據(jù)通過內(nèi)網(wǎng)直接打到阿里云oss的專用的bucket里面(TIPS:拉了專線,走內(nèi)網(wǎng),需要加個(gè)路由才能用oss的內(nèi)網(wǎng)域名地址)

下面是我執(zhí)行快照和恢復(fù)的全流程:

step1_idc_reg_oss.sh    注冊(cè)idc的es快照倉(cāng)庫(kù)地址到阿里云oss

#!/bin/bash
# 傳參1 為 es集群的 lb地址 (用后端真實(shí)節(jié)點(diǎn)地址也行) 
echo "作用:"
echo "注冊(cè)快照地址到阿里云到oss倉(cāng)庫(kù)"
echo

# 找出集群的名稱
CLUSTER_NAME=$(curl -s http://$1:9200/ | grep cluster_name | awk -F ':' '{print $2}' | awk -F '"' '{print $2}')
echo "ES集群名稱:" $CLUSTER_NAME
echo

# 注冊(cè)快照倉(cāng)庫(kù) ,走專線 oss內(nèi)網(wǎng)地址
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
}
}"

# 確認(rèn)倉(cāng)庫(kù)是否ok
curl -s -XGET http://$1:9200/_snapshot/$CLUSTER_NAME | jq .




step2_first_snapshot.sh   對(duì)idc的es打一個(gè)全量快照到阿里云oss

#!/bin/bash
# 傳參1 為 es集群的 lb地址 (用后端真實(shí)節(jié)點(diǎn)地址也行) 

echo "作用:"
echo "后臺(tái)打快照存到阿里云oss倉(cāng)庫(kù)"
echo

# 找出集群的名稱
CLUSTER_NAME=$(curl -s http://$1:9200/ | grep cluster_name | awk -F ':' '{print $2}' | awk -F '"' '{print $2}')
echo "ES集群名稱:" $CLUSTER_NAME
echo

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

echo
echo "查看快照的進(jìn)度方法: curl -XGET http://$1:9200/_snapshot/$CLUSTER_NAME/_all?pretty"
echo


注意:step2 這個(gè)腳本第一次跑通后,我們可以在上云前1-2天加個(gè)cronjob每小時(shí)跑一次,這樣在最后上云遷移的時(shí)候,增量快照需要的時(shí)間就會(huì)很短暫。大幅度減少不可用時(shí)間。



step3_aliyun_reg_oss.sh   注冊(cè)阿里云的es快照倉(cāng)庫(kù)地址到阿里云oss

#!/bin/bash
# 傳參1 為 機(jī)房es集群的LB地址
# 傳參2 為 阿里云es集群的域名

echo "作用:"
echo "注冊(cè)阿里云es到阿里云的oss倉(cāng)庫(kù)"
echo

# 找出集群的名稱
CLUSTER_NAME=$(curl -s http://$1:9200/ | grep cluster_name | awk -F ':' '{print $2}' | awk -F '"' '{print $2}')
echo "ES集群名稱:" $CLUSTER_NAME
echo

# 阿里云關(guān)聯(lián)oss倉(cāng)庫(kù)
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
}
}"

# 確認(rèn)快照倉(cāng)庫(kù)是否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 開始,需要在割接當(dāng)晚操作

step4_stop_write_idc_index.sh  關(guān)閉idc 的es索引的寫權(quán)限,保留只讀權(quán)限 

#!/bin/bash
# 傳參1 為 es集群的 lb地址 (用后端真實(shí)節(jié)點(diǎn)地址也行) 

echo "作用:"
echo "關(guān)閉機(jī)房es的索引的寫權(quán)限,以便后續(xù)進(jìn)行最后一次的快照操作"
echo

#找出集群的名稱
CLUSTER_NAME=$(curl -s http://$1:9200/ | grep cluster_name | awk -F ':' '{print $2}' | awk -F '"' '{print $2}')
echo $CLUSTER_NAME

# 關(guān)閉全部索引的寫權(quán)限,保留讀權(quán)限
echo "開始關(guān)閉全部索引的寫權(quán)限,保留讀權(quán)限..."
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.(設(shè)置為true 可以禁止對(duì)索引和索引的metadata進(jìn)行修改,控制的更嚴(yán)格些)
# index.blocks.write
#Set to true to disable write operations against the index.(設(shè)置為 true 來禁止對(duì)索引的寫操作。但索引的 metadata 可以正常寫。)
# 注意:index.blocks.read_only 和 index.blocks.write 這2個(gè)參數(shù),不能同時(shí)使用,只能選其一



step5_increase_snapshot.sh   再人工執(zhí)行一次快照腳本(這時(shí)候打的是增量快照,耗時(shí)不會(huì)太久)

#!/bin/bash
# 傳參1 為 es集群的 lb地址 (用后端真實(shí)節(jié)點(diǎn)地址也行) 

echo "作用:"
echo "關(guān)閉機(jī)房es寫權(quán)限后,后臺(tái)再打一次快照存到阿里云oss倉(cāng)庫(kù)"
echo

# 找出集群的名稱
CLUSTER_NAME=$(curl -s http://$1:9200/ | grep cluster_name | awk -F ':' '{print $2}' | awk -F '"' '{print $2}')
echo "ES集群名稱:" $CLUSTER_NAME
echo

# 在后臺(tái)打快照
echo "開始在后臺(tái)打快照"
echo "查看快照的進(jìn)度方法: 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的快照進(jìn)度完成后,才能執(zhí)行下面的step6操作?。?/strong>


step6_restore_into_aliyun.sh    將oss上面的最新快照恢復(fù)到阿里云ES環(huán)境

#!/bin/bash
# 從阿里云oss恢復(fù)數(shù)據(jù)到阿里云es
# 參數(shù)1 為 idc 的es 的lb地址 (不用帶端口號(hào))
# 參數(shù)2 為 阿里云es 的域名  (不用帶端口號(hào))

echo "作用:"
echo "從oss倉(cāng)庫(kù)恢復(fù)數(shù)據(jù)到阿里云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 "最后一個(gè)snapshot的名稱:" ${SNAPSHOT_NAME}

# 調(diào)整阿里云ES參數(shù) 加快恢復(fù)速度
echo "調(diào)整阿里云ES參數(shù) 加快恢復(fù)速度"
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 .

# 執(zhí)行阿里云ES數(shù)據(jù)恢復(fù)操作
echo "開始阿里云ES數(shù)據(jù)恢復(fù)"
curl -s -XPOST http://$2:9200/_snapshot/$CLUSTER_NAME/$SNAPSHOT_NAME/_restore -d '{
  "index_settings": {
     "index.number_of_replicas": 0
  }
}'

echo
echo
echo "查看恢復(fù)的進(jìn)度 curl -s -X GET http://$2:9200/_recovery/ | jq ."


等阿里云ES集群變綠后(通過_cat api 或者 cerebro觀察),開始執(zhí)行step7操作  


step7_aliyun_open_index_increase_replica.sh   打開阿里云es的寫功能,并調(diào)整index副本為1

#!/bin/bash
# 調(diào)整阿里云es 增加副本數(shù)
# 參數(shù)1 為 阿里云es 的域名 (不用帶端口號(hào))

echo "作用:"
echo "阿里云es打開寫,并調(diào)整副本改為1"
echo
echo "打開阿里云ES的寫權(quán)限"
curl -s -XPUT http://$1:9200/_all/_settings -d '{
  "index": {
    "blocks": {
      "write": "false"
    }
  }
}'
sleep 1 
echo "調(diào)整全部index的副本為1"
curl -s -XPUT http://$1:9200/_all/_settings -d '{
  "number_of_replicas": 1
}
'


至此, 我們就可以通知開發(fā)測(cè)試 發(fā)版后跟進(jìn)測(cè)試了。



可選步驟

step8_close_idc_index.sh    建議在完成遷移后,關(guān)閉老的es的索引,這樣如果有連接連到老es,就會(huì)報(bào)錯(cuò)便于及時(shí)發(fā)現(xiàn)問題

#!/bin/bash
# 傳參1 為 es集群的 lb地址 (用后端真實(shí)節(jié)點(diǎn)地址也行) 

echo "作用:"
echo "關(guān)閉機(jī)房es的索引"
echo

# 列出打開狀態(tài)的索引
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 "當(dāng)前打開的索引如下:" 
echo $indices
echo
echo

echo "開始執(zhí)行close index 操作 ...."
curl -s -XPOST http://$1:9200/$indices/_close?pretty | jq .

關(guān)于ES通過快照方式進(jìn)行數(shù)據(jù)遷移就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI