1. 說明
以文件拷貝方式跨集群遷移索引润樱,會完整保留源集群上的索引的setting脉幢、mapping齿诉、aliase等所有完整配置,遷移過程中無法進行修改顶猜;
2. 源集群上備份索引
2.1 獲取待遷移索引信息
包括索引setting沧奴、mapping、shard數(shù)量以及每個shard所在的節(jié)點信息驶兜;
獲取索引信息
curl -XGET 'http://XX.XX.XX.XX:9200/_cat/indices/shakespeare?v'
?
health status index ? ? ? uuid ? ? ? ? ? ? ? ? ? pri rep docs.count pri.store.size
green? open ? shakespeare kEr6n5PJQ1COdhgXDpApnA ? 1 ? 1 ? ? 335901 ? ? ?? 202.6mb
獲取索引相關的shard信息
curl -XGET 'http://XX.XX.XX.XX:9200/_cat/shards/shakespeare?v'
?
index ? ? ? shard prirep state ? ? docs ? store ip ? ? ? ? ? node
shakespeare 0 ? ? r ? ?? STARTED 335901 201.8mb 10.31.10.160 node-02
shakespeare 0 ? ? p ? ?? STARTED 335901 202.6mb 10.31.10.160 node-03
? 可以看到待遷移的索引 song_proj_ae_20200304105959的id為kEr6n5PJQ1COdhgXDpApnA扼仲,有1個主分片,在節(jié)點10.31.10.160上抄淑,總文檔數(shù) 335901屠凶,后續(xù)需要用到這些信息;
2.2 停止索引寫入
索引備份之前肆资,需要確保索引已經停止寫入矗愧,最好停止索引寫入的程序運行;
2.3 確保緩存寫入磁盤
索引備份之前郑原,需要確保緩存中的索引數(shù)據(jù)已經保存在磁盤上唉韭,否則會發(fā)生數(shù)據(jù)丟失,使用如下命令犯犁,強制緩存中的所有數(shù)據(jù)寫入磁盤属愤,待命令執(zhí)行成功后繼續(xù)下一步;
curl -XPOST "http://XX.XX.XX.XX:9200/shakespeare/_flush/synced"
2.4 備份索引
根據(jù)第一步上獲取到的索引的每個分片的節(jié)點信息酸役,登陸到對應的節(jié)點上對應的索引目錄下住诸,將索引uuid的目錄,完整進行備份操作涣澡。
/opt/huawei/data2/nodes/0/indices/kEr6n5PJQ1COdhgXDpApnA
?
drwx------ 5 es users 4096 Mar? 4 11:37 0
drwx------ 2 es users 4096 Mar? 4 12:06 _state
?
scp -r kEr6n5PJQ1COdhgXDpApnA XX.XX.XX.XX:/opt/huawei/data_bak/shakespeare/0/
建議:如果源集群和目的集群之間的網絡是互通的贱呐,可以直接兩臺機器之間直接拷貝;
2.5 多分片的備份方式
如果索引中包含多個主分片入桂,并且分片分布在不同的服務器上奄薇,則需要分別備份到備份服務器上,不可以人為進行合并抗愁;
建議:有條件的話馁蒂,可以將多個分片通過reroute的move命令呵晚,移動到同一個節(jié)點上,可以簡化備份和恢復操作远搪;
3. 目的集群上恢復索引
3.1 準備
恢復索引就是從備份服務器上劣纲,將備份的索引恢復到新集群的Datanode節(jié)點上,恢復過程中需要的Datanode節(jié)點的數(shù)量谁鳍,和源集群上索引分布的Datanode節(jié)點數(shù)量相等癞季,即如果索引只有1個分片,或者所有分片都集中在1個Datanode節(jié)點倘潜,則只需要恢復到1個Datanode節(jié)點即可绷柒,如果索引有4個分片,分布到3臺Datanode上涮因,則需要分別恢復到新集群上的3臺Datanode上废睦,依次類推;
3.2 恢復索引文件
下面以恢復一個索引的一個分片為例進行說明:
登陸到新集群的一臺Datanode服務器上养泡,進入ES Data目錄下的indices子目錄下嗜湃,參考 /opt/huawei/data/nodes/0/indices;
從備份服務器上澜掩,將需要恢復索引的對應索引目錄復制到該目錄下购披。
cd /opt/huawei/data/nodes/0/indices/
cp -r /opt/huawei/data_bak/shakespeare/0/kEr6n5PJQ1COdhgXDpApnA/ .
[es@host-10-33-114-216 kEr6n5PJQ1COdhgXDpApnA]$ ll
drwx------ 4 es es 4096 Mar? 5 17:07 0
drwx------ 2 es es 4096 Mar? 5 17:01 _state
可以看到,此處的整個索引目錄肩榕,都是從源索引的備份目錄中獲取來的刚陡;
[es@host-10-33-114-216 kEr6n5PJQ1COdhgXDpApnA]$ cd 0
[es@host-10-33-114-216 0]$ ll
total 8
drwx------ 2 es es 4096 Mar? 5 17:07 index
drwx------ 2 es es 4096 Mar? 5 17:01 _state
drwx------ 2 es es 4096 Mar? 5 17:07 translog
3.3 加載索引
待索引的所有分片,都已經拷貝到對應的Datanode服務器上時株汉,再進行索引加載操作筐乳;
當集群狀態(tài)發(fā)生變化時,ES集群會自動發(fā)現(xiàn)并加載新索引乔妈,可以通過重啟節(jié)點蝙云、創(chuàng)建/刪除索引、調整副本數(shù)等方式觸發(fā)集群狀態(tài)刷新路召,建議可以通過觸發(fā)ES集群自動修復來進行集群狀態(tài)刷新贮懈;
curl -XPOST "http://XX.XX.XX.XX:9200/_cluster/reroute?retry_failed=true"
集群狀態(tài)刷新后,依次檢查索引狀態(tài)和分片狀態(tài)优训,可以看到對應索引的狀態(tài)已經變成GREEN,并且分片的狀態(tài)已經變成 STARTED各聘,恢復正常揣非;
curl -XGET 'http://XX.XX.XX.XX:9200/_cat/indices/shakespeare?v'
health status index ? ? ? uuid ? ? ? ? ? ? ? ? ? pri rep docs.count pri.store.size
green? open ? shakespeare kEr6n5PJQ1COdhgXDpApnA ? 1 ? 1 ? ? 335901 ? ? ?? 202.6mb
?
curl -XGET 'http://XX.XX.XX.XX:9200/_cat/shards/shakespeare?v'
index ? ? ? shard prirep state ? ? docs ? store ip ? ? ? ? ?? node
shakespeare 0 ? ? p ? ?? STARTED 335901 201.8mb 10.33.114.216 node-01
至此,該索引的數(shù)據(jù)已經恢復躲因,如果有多個索引需要恢復早敬,可以重復執(zhí)行以上步驟忌傻;
4. 常見問題
4.1 當索引已經遷移到新集群中后,如果通過手工刪除后搞监,再次采用該方式無法遷移
原因:ES中自動識別索引水孩,是通過索引名稱和uuid來唯一確定的,雖然該索引已經刪除琐驴,但是在ES集群中的信息已經將該索引標記為刪除狀態(tài)俘种,無法再次通過自動識別進行遷移;
解決方法:需要將源索引改名后重新遷移绝淡;
4.2 當索引有多個分片宙刘,只遷移了部分分片進行恢復后,索引狀態(tài)為RED
原因:當只遷移了部分分片就恢復時牢酵,由于ES找不到其他未遷移的分片悬包,導致索引狀態(tài)為RED;
解決方法:將未恢復的分片拷貝到某個datanode節(jié)點上馍乙,再通過 allocate_stale_primary 命令布近,強制恢復;
shard為準備恢復的shard id丝格,node表示在該節(jié)點上已經存在該shard的數(shù)據(jù)撑瞧,index為索引名稱;
curl -XPOST "http://127.0.0.1:9200/_cluster/reroute" -H "Content-Type: application/json" -d '{
?? "commands": [
? ? ?? {
? ? ? ? ?? "allocate_stale_primary": {
? ? ? ? ? ? ?? "index": "shakespeare",
? ? ? ? ? ? ?? "shard": 0,
? ? ? ? ? ? ?? "node": "node-01",
? ? ? ? ? ? ?? "accept_data_loss": true
? ? ? ? ?? }
? ? ?? }
?? ]
}'