elasticsearch snapshots (快照和恢復)

官網:https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html

前幾天在寫一個刷新ES tool的時候,在QA的test環境上測試tool, 由於測試環境設置了public ip and private ip , 外加對測試環境中ES集羣配置的不瞭解。結果在用postman 測試9200端口能不能訪問時, 一個不小心將一個index 刪除(還好不是pro 環境。。。),乍一看57萬餘條數據。。。
廢話不多說,讓我們開始一鍵還原吧

快照和恢復

Snapshot and restore 模塊允許創建單個索引或者整個集羣的快照到遠程倉庫. 在初始版本里只支持共享文件系統的倉庫,但是現在通過官方的倉庫插件可以支持各種各樣的後臺倉庫。

倉庫
在進行任何快照或者恢復操作之前必須有一個快照倉庫註冊在Elasticsearch裏。下面的這個命令註冊了 一個名爲my_backup 的共享文件系統倉庫,快照將會存儲在 /mount/backups/my_backup 這個目錄。

$ curl -XPUT ‘http://localhost:9200/_snapshot/my_backup’ -d ‘{
“type”: “fs”,
“settings”: {
“location”: “/mount/backups/my_backup”,
“compress”: true
} }’

一旦倉庫被註冊了,就可以只用下面的命令去獲取這個倉庫的信息

$ curl -XGET ‘http://localhost:9200/_snapshot/my_backup?pretty’ {
“my_backup” : {
“type” : “fs”,
“settings” : {
“compress” : “true”,
“location” : “/mount/backups/my_backup”
} } }

如果沒有指定倉庫名字,或者使用 _all 作爲倉庫名字,Elasticsearch將返回該集羣當前註冊的所有倉庫的信息:

$ curl -XGET ‘http://localhost:9200/_snapshot’ or

$ curl -XGET ‘http://localhost:9200/_snapshot/_all

共享文件系統的倉庫
共享文件系統倉庫 (“type”: “fs”) 是使用共享的文件系統去存儲快照。 在 location 參數裏指定的具體存儲路徑必須和共享文件系統裏的位置是一樣的並且能被所有的數據節點和master節點訪問。 另外還支持如下的一些參數設置:

location
指定快照的存儲位置。必須要有

compress
指定是否對快照文件進行壓縮. 默認是 true.

chunk_size
如果需要在做快照的時候大文件可以被分解成幾塊。這個參數指明瞭每塊的字節數。也可用不同的單位標識。 比如,1g,10m,5k等。默認是 null (表示不限制塊大小)。

max_restore_bytes_per_sec
每個節點恢復數據的最高速度限制. 默認是 20mb/s

max_snapshot_bytes_per_sec
每個節點做快照的最高速度限制。默認是 20mb/s

只讀URL倉庫
URL倉庫(“type”: “url”)可以作爲使用共享文件系統存儲快照創建的共享文件系統倉庫的只讀訪問方式。 url 參數指定的URL必須指向共享文件系統倉庫的根。支持的配置方式如下:

url
指定快照位置。必須要有

倉庫插件
下面這些官方插件中的倉庫後臺都是可用的:

AWS Cloud Plugin 亞馬遜S3倉庫

HDFS Plugin Hadoop環境

Azure Cloud Plugin Azure存儲倉庫

快照

一個倉庫可以包含同一個集羣的多個快照。快照根據集羣中的唯一名字進行區分。 在倉庫 my_backup 裏創建一個名爲snapshot_1 的快照可以通過下面的命令:

$ curl -XPUT
“localhost:9200/_snapshot/my_backup/snapshot_1?wait_for_completion=true”

wait_for_completion 參數指定創建snapshot的請求是否等待快照創建完成再返回。 默認情況下,集羣中所有打開和啓動的索引是自動創建快照的。可以通過在快照請求裏列出需要創建快照的索引。 parameter specifies whether or not the request should return immediately or wait for snapshot completion. By default snapshot of all open and started indices in the cluster is created. This behavior can be changed by specifying the list of indices in the body of the snapshot request.

$ curl -XPUT “localhost:9200/_snapshot/my_backup/snapshot_1” -d ‘{
“indices”: “index_1,index_2”,
“ignore_unavailable”: “true”,
“include_global_state”: false
“partial”: “false” }’

上述命令中通過 indices 參數指定快照包含的索引,這個參數支持同時配置多個索引 multi index syntax. 快照請求同樣支持 ignore_unavailable 選項。把這個選項設置爲 true 的時候在創建快照的過程中會忽略不存在的索引。默認情況下, 如果沒有設置 ignore_unavailable 在索引不存在的情況下快照請求將會失敗。通過設置 include_global_state 爲false 能夠防止 集羣的全局狀態被作爲快照的一部分存儲起來。默認情況下,如果快照中的1個或多個索引不是全部主分片都可用會導致整個創建快照的過 程失敗。 通過設置 partial 爲 true 可以改變這個行爲。

索引創建快照的過程是增量的。在給索引創建快照的過程中,Elasticsearch會分析存儲在倉庫中的索引文件並且只會複製那些自從上次快照 之後新建或有所更新的文件。這使得多個快照以一種緊湊的方式存儲在同一個倉庫裏。創建快照的過程是以非阻塞方式執行的。一個索引在創 建快照的同時能夠被檢索和查詢。儘管如此,快照保存的是在開始進行創建快照的那個時間點的索引的視圖。所以,在開始創建快照之後的記 錄不會出現在這個快照裏。在主分片啓動之後創建快照的過程就會立即開始,並且之後不會改變位置。在1.2.0版本之前如果集羣重新定位或者 新加入快照的索引初始化主分片會導致快照操作失敗。從1.2.0版本開始,Elasticsearch會等待重新定位和初始化分片然後再創建快照。

除了給每個索引創建拷貝快照還能存儲集羣的全局元數據,包括集羣的設置和模板。臨時的設置和已經註冊的快照倉庫不會被作爲快照的一部 分來存儲。

任何時候在集羣裏只能有一個創建快照的操作在執行。當一個分片正在創建快照的時候,這個分片就不能被遷移到別的節點,因爲這會影響重 新平衡和分配過濾的過程。一旦這個分片的快照建立完成,這個分片就可以根據現有的分配過濾和重新平衡算法被遷移到別的節點上。

如果快照已經建立,我們可以通過如下的命令去獲得快照的信息:

$ curl -XGET “localhost:9200/_snapshot/my_backup/snapshot_1”

通過如下的命令可以把倉庫裏所有的快照列出來:

$ curl -XGET “localhost:9200/_snapshot/my_backup/_all”

可以通過如下的命令將倉庫裏的某個快照刪除:

$ curl -XDELETE “localhost:9200/_snapshot/my_backup/snapshot_1”

當一個快照從倉庫裏刪除之後,Elasticsearch會把所有和這個快照相關並且不被其它快照使用的文件刪除。如果對正在創建的某個快照執行 刪除操作,則創建快照的過程會被取消,並且會把創建過程中所有已經創建的文件刪除。因此,刪除操作可以用來取消那些由於誤操作引起的 長時間運行的快照操作。

恢復
快照可以使用如下的操作來恢復:

$ curl -XPOST “localhost:9200/_snapshot/my_backup/snapshot_1/_restore”

默認情況下,快照中的所有索引以及集羣狀態都會被恢復。在恢復請求中可以通過 indices 來指定需要被恢復的索引,同樣可以使用 include_global_state 選項來防止恢復集羣的狀態。 indices 支持配置多個索引multi index syntax.rename_pattern 和 rename_replacement 選項可以在恢復的時候使用正則表達式來重命名index。詳見 這裏.

$ curl -XPOST “localhost:9200/snapshot/my_backup/snapshot_1/restore"
-d '{
“indices”: “index_1,index_2”,
“ignore_unavailable”: “true”,
“include_global_state”: false,
“rename_pattern”: "index
(.+)",
“rename_replacement”: "restored_index
$1” }’

恢復操作可以在正在運行的集羣上操作。儘管如此,已經存在的index只有在關閉之後才能被恢復。恢復操作會自動打開關閉的恢復的索引, 並且創建新的索引如果索引不存在。如果集羣狀態也是恢復的,如果恢復的模板不存在會被新建,如果同名的模板已經存在則會被覆蓋代替。 恢復的持久性設置會被增加到現存的持久性設置裏。

快照狀態
新增於[1.1.0]

正在運行的快照的詳細信息可以通過如下的命令來獲取:

$ curl -XGET “localhost:9200/_snapshot/_status”

在這種格式下,這個命令將會返回所有正在運行的快照的信息。通過指明倉庫名字,能夠把結果限定到具體的一個倉庫。

$ curl -XGET “localhost:9200/_snapshot/my_backup/_status”

如果倉庫名字和快照id都指明瞭,這個命令就會返回這個快照的詳細信息,甚至這個快照不是正在運行。

$ curl -XGET “localhost:9200/_snapshot/my_backup/snapshot_1/_status”

同樣支持多個快照id:

$ curl -XGET
“localhost:9200/_snapshot/my_backup/snapshot_1,snapshot_2/_status”

監控快照/恢復進度
有多種方法去監控運行時快照和恢復的進度。這2個操作都支持 wait_for_completion 參數,如果這個了這個參數將會阻塞客戶端直到 操作完成。這是最簡單的用來獲取操作完成的通知的方法。

快照操作的進度也可以通過定時的調用下面的命令去獲得:

$ curl -XGET “localhost:9200/_snapshot/my_backup/snapshot_1”

注意,獲取快照信息的操作和快照操作使用相同的資源和線程池。所以,執行獲取快照信息的操作的時候如果大量的分片正在做快照操作, 在獲取快照新的操作返回結果之前需要先等到資源可用才行。如果分片太大,等待的時間會挺長。

要獲取更多的及時和完整的關於快照的信息,可以使用如下的快照狀態命令。

$ curl -XGET “localhost:9200/_snapshot/my_backup/snapshot_1/_status”

獲取快照信息的方法只返回關於快照進度的基本信息, 快照狀態命令會返回正在做快照的每個分片的具體信息。

恢復進度是裝在Elasticsearch的標準恢復機制裏的。所以,標準恢復監控服務能夠被用來監控恢復的狀態。當恢復操作在集羣裏執行的時候, 集羣通常會變成 紅色 狀態。可能是因爲恢復操作是從恢復被恢復的索引的主分片開始的。在恢復操作期間主分片變的不可用使得集羣處於 紅色 狀態。一旦主分片的恢復完成,Elasticsearch會切換到標準複製過程,在這個過程會創建需要的複製個數,並且集羣狀態變爲 黃色 。一旦所有的複製分片創建完成,集羣會變成 綠色 狀態。

集羣健康操作只提供恢復過程的大致狀態。可以通過 indices recovery 和 cat recovery APIs 獲取恢復過程當前狀態的更詳細的信息。

停止正在運行的快照和恢復操作
快照和恢復框架只允許同一時刻每次運行1個快照或恢復操作。如果正在運行的一個快照是誤操作導致的或者運行的時間太長,可以用快照刪除 操作去終止正在執行的快照操作。快照刪除操作會檢查要刪除的快照是否正在運行,如果是,刪除操作先停止這個快照操作,然後再將它從倉庫 裏刪除。

恢復操作是用用標準的分片回覆機制。因此,任何正在運行的恢復操作可以通過刪除正在恢復的索引來取消。注意,所有被刪除的索引的數據也 會被從集羣裏刪除。

總結: 有備無患
參考:http://blog.csdn.net/yinchunxiang/article/details/38727883

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章