摘要: 在Elasticsearch中的可以創建快照,它創建單個索引或整個群集到一個遠程的存儲庫中。在以前的版本中,系統只支持共享存儲的快照創建,最新的版本可以通過插件支持更多的方式。在執行快照操作前,需要在Elasticsearch中進行注冊快照倉庫。
在Elasticsearch中的可以創建快照,它創建單個索引或整個群集到一個遠程的存儲庫中。在以前的版本中,系統只支持共享存儲的快照創建,最新的版本可以通過插件支持更多的方式。在執行快照操作前,需要在Elasticsearch中進行注冊快照倉庫。注冊倉庫的設置需要執行倉庫類型,例如:
請求:PUT /_snapshot/my_backup
參數:
{
"type": "fs", "settings": { ... repository specific settings ... } }
當注冊后,可以通過查詢來得到之前注冊的信息。當然系統也支持用逗號分開來查詢多個注冊,支持通配符查詢多個注冊,甚至可以使用_all查詢所有注冊。
請求:GET /_snapshot/my_backup
返回值:
{
"my_backup": { "type": "fs", "settings": { "compress": "true", "location": "/mount/backups/my_backup" } } }
共享文件系統存儲("type": "fs")使用共享文件系統來存儲快照。為了注冊共享的文件系統存儲庫,必須將同一個共享文件系統安裝到所有主節點和數據節點上相同的位置上。這個位置(或它的父目錄)必須在所有主節點數據節點上設置path.repo參數。假設共享文件系統安裝在/mount/backups/my_backup目錄下,在elasticsearch.yml文件中的設置應增加:
path.repo: ["/mount/backups", "/mount/longterm_backups"]
備注:path.repo設置支持微軟Windows UNC路徑,只要服務器名和共享名稱進行正確的設置,例如:
path.repo: ["\\\\MY_SERVER\\Snapshots"]
只有當所有的節點都重新啟動后,使用以下面的命令可以為名稱為my_backup的共享文件系統庫進行快照和恢復,例如:
請求:PUT http://localhost:9200/_snapshot/my_backup
參數:
{
"type": "fs", "settings": { "location": "/mount/backups/my_backup", "compress": true } }
系統支持相對路徑的,如果存儲位置指定為相對路徑,則不需要寫具體的全路徑,例如:
請求:PUT http://localhost:9200/_snapshot/my_backup
參數:
{
"type": "fs", "settings": { "location": "my_backup", "compress": true } }
系統支持一下參數:
location:快照位置,必須要有。
compress:打開快照文件的壓縮。壓縮僅適用於元數據文件,數據文件不進行壓縮。默認為true。
chunk_size:如果需要可以把大的文件分解成不同的快照。塊的大小可以指定字節例如1G,10m,5K。默認值為null表示無限的塊大小。
max_restore_bytes_per_sec:使每個節點的恢復的速度。默認為40MB每秒。
max_snapshot_bytes_per_sec:每個節點生成的快照的速度。默認為40MB每秒。
readonly:使存儲庫只讀。默認為false。
只讀倉庫
URL倉庫("type": "url")被用在共享文件系統庫中創建只讀方式數據倉庫。在url參數中指定指向共享的文件系統存儲庫的根節點,支持以下設置:
url:強制性的快照位置。
url參數支持以下協議:"http", "https", "ftp", "file" , "jar",在http:, https:, and ftp: 這些協議中,可以支持白名單,白名單的設置在 repositories.url.allowed_urls 參數中,例如:
repositories.url.allowed_urls: ["http://www.example.org/root/*", "https://*.mydomain.com/*?*#*"]
存儲庫可以通過插件支持更多的方式,比如:
AWS雲插件的S3存儲庫,Hadoop的HDFS插件環境,Azure雲存儲庫插件。
當一個存儲庫被注冊時,它立即被驗證在所有主節點和數據節點上,以確保它在群集中的所有節點上都可以使用。驗證參數可用於在注冊或更新存儲庫時顯式禁用,例如:
請求:PUT /_snapshot/s3_repository?verify=false
參數:
{
"type": "s3", "settings": { "bucket": "my_s3_bucket", "region": "eu-west-1" } }
驗證過程也可以通過運行以下命令來手動執行:
POST /_snapshot/s3_repository/_verify
它返回一個節點列表,如果驗證過程失敗,則會成功驗證或錯誤消息。
本文由賽克 藍德(secisland)原創,轉載請標明作者和出處。
快照
一個存儲庫可以包含同一個群集的多個快照。快照在集群內的名稱是唯一的。在一個庫中創建名稱為snapshot_1快照可以執行下面的命令:
PUT /_snapshot/my_backup/snapshot_1?wait_for_completion=true
wait_for_completion參數指定快照初始化后立即返回(默認)還是等待快照完成后返回。在快照初始化時,所有以前的快照信息加載到內存,這意味着創建一個大的庫快照可能需要幾秒鍾(甚至幾分鍾)。所以有時候wait_for_completion參數設置為false也是需要等待一會的。
默認情況下所有打開的快照和在集群中開始索引時創建,此行為可以通過指定快照請求中的索引列表來改變,例如:
請求:PUT /_snapshot/my_backup/snapshot_1
參數:
{
"indices": "index_1,index_2", "ignore_unavailable": "true", "include_global_state": false }
可以使用支持多索引語法的索引參數來指定快照的索引列表。快照請求也支持ignore_unavailable選項,將它設置為true時可以在快照創建過程中把不存在的索引忽略掉。默認情況下,當ignore_unavailable選項不設置或者設置為false的時候,如果不存在索引,索引的快照請求將失敗。通過設置include_global_state為false可以防止集群全局狀態被被存儲為快照的一部分。默認情況下,如果有一個或多個索引沒有可用的主分片整個快照會失敗,這種行為可以通過設置部分來改變。
索引快照處理是漸進的。在索引快照的過程中Elasticsearch會分析索引文件的列表是否已存儲在存儲庫中,同時復制上次創建的快照或更改的文件。這允許在一個緊湊形式的存儲庫中保存多個快照,快照的過程是非阻塞的方式執行。當對索引正在執行快照時所有的索引和搜索操作可以繼續執行。然而,快照執行的數據是在快照創建時的時間點確定的,所以在快照過程開始后添加到索引中的記錄將不會再快照中出現。在1.2.0之前版本之前,如果群集有遷移或者在索引中初始化分片時會失敗,在1.2.0之后,快照的操作會等待這些完成后再操作。一個快照除了創建集群的副本外,還可以存儲全局群集元數據,其中包括持久性群集設置和模板。臨時設置和注冊的快照庫不會存儲為快照的一部分。
在任何時間只有一個快照過程在集群中被執行。而一個特定的快照被創建分片時,這分片不能移動到另一個節點,它可能干擾再平衡過程和過濾操作。一次快照完成Elasticsearch只能移動一塊到另一個節點(根據當前配置過濾設置和調整算法)。一旦一個快照完成,關於這個快照的信息,可以使用以下命令來獲得:
GET /_snapshot/my_backup/snapshot_1
類似的倉庫,對多個快照信息可以通過一次進行查詢,以及支持通配符,或者用_all查詢所有:
GET /_snapshot/my_backup/snapshot_*,some_other_snapshot
如果一些快照不可用,該命令將失敗。布爾參數ignore_unvailable可用於返回所有目前可用的快照。可以使用以下命令查詢當前正在運行的快照:
GET localhost:9200/_snapshot/my_backup/_current
快照可以從使用下列命令的存儲庫中刪除:
DELETE /_snapshot/my_backup/snapshot_1
當快照是從庫中刪除時,Elasticsearch將刪除與快照關聯的和其他快照也不使用的所有文件,如果執行快照創建的過程中同時刪除快照,則快照創建的過程會停止,同時刪除相關的文件。因此,刪除快照操作可以用來取消被錯誤啟動的長時間運行快照操作。使用下面的命令可以刪除存儲庫:
DELETE /_snapshot/my_backup
當一個庫被刪除,Elasticsearch僅刪除存儲庫的位置的引用,快照本身並沒有被刪除。
恢復
使用以下命令可恢復快照:
POST /_snapshot/my_backup/snapshot_1/_restore
默認情況下,快照中的所有索引以及群集狀態將被恢復,在恢復include_global_state選項時,可以指定具體的索引和集群狀態被恢復。索引的列表支持多索引語法。rename_pattern和rename_replacement選項也可用於重命名索引,可以使用正則表達式,該表達式支持引用原始文本。設置include_aliases為假可以防止相關索引的別名被一起恢復,例如:
請求:POST /_snapshot/my_backup/snapshot_1/_restore
參數:
{
"indices": "index_1,index_2", "ignore_unavailable": "true", "include_global_state": false, "rename_pattern": "index_(.+)", "rename_replacement": "restored_index_$1" }
恢復操作可以在一個功能集群上執行。在快照索中有相同數量分片的索引如果是關閉的,則只能恢復。如果索引是關閉的則恢復操作會自動打開索引,如果索引在集群中不存在,恢復操作將會創建新的索引,如果恢復群集狀態,則在該群集中不存在的模板將被添加,已恢復的模板會替換為具有相同名稱的現有模板。恢復中的設置被添加到現有的設置中。
部分恢復,默認情況下,如果一個或更多的索引如果沒有可用的快照碎片,整個恢復操作將失敗。如果一些碎片沒有快照,通過設置partial為true,仍可以恢復部分索引。請注意,在這種情況下只有有分片的索引會被正確恢復,沒有的索引會建立空的索引。
在恢復過程中改變索引設置,在恢復過程中大多數索引的設置可以被覆蓋。例如,下面的命令將不創建任何副本而切換回默認刷新間隔的恢復索引index_1:
請求:POST /_snapshot/my_backup/snapshot_1/_restore
參數:
{
"indices": "index_1", "index_settings": { "index.number_of_replicas": 0 }, "ignore_index_settings": [ "index.refresh_interval" ]}
請注意,一些設置,如index.number_of_shards在恢復操作期間是無法更改的。
恢復到不同的集群,快照中存儲的信息不依賴於特定的群集或群集名稱。因此,它有可能恢復從一個群集到另一個群集的快照。僅要求注冊存儲庫中包含快照,並啟動恢復過程,新的群集不具有相同的大小或拓撲結構。如果一個集群有的空間比較小,需要考慮的事情有:首先,要確保新的集群有足夠的容量來存儲快照中的所有索引。在還原的過程中,可以改變索引設置,以減少復制的次數,這可以幫助將快照恢復到較小的群集,也可以選擇使用索引參數。在版本1.5.0之前,Elasticsearch沒有檢查恢復持續的設置使得有可能恢復出錯,參數discovery.zen.minimum_master_nodes 禁用一個小集群直到添加所需的主節點數。從版本1.5.0此的設置將被忽略。如果在原始集群的索引被分配到特定的節點,使用過濾分片配置,同樣的規則將在新的集群執行。因此,如果新的群集不包含具有已有屬性的節點,則該恢復的索引可以被分配,除非這些索引分配設置在恢復操作期間改變,否則不會恢復成功。
快照狀態
快照statusedit
使用以下命令可獲得當前運行快照的詳細狀態信息列表:
GET /_snapshot/_status
下面的命令將返回有關當前正在運行的快照的信息。通過指定一個存儲庫的名稱,可以將結果限制為特定的存儲庫:
GET /_snapshot/my_backup/_status
如果指定了存儲庫名稱和快照標識,該命令將返回給定快照的詳細狀態信息:
GET /_snapshot/my_backup/snapshot_1/_status
同樣支持多個id的查詢,例如:
GET /_snapshot/my_backup/snapshot_1,snapshot_2/_status
監控快照恢復過程
當快照的進度和恢復正在運行有幾種方法來監視它們過程。wait_for_completion參數會阻止客戶端直到操作完成。這是最簡單的方法,可以用來獲得有關操作完成的通知。
快照操作還可以定期對快照信息進行監視,例如:
GET /_snapshot/my_backup/snapshot_1
請注意,快照信息的操作使用相同的資源和線程池作為快照操作。所以,當大的分片被快照會導致快照操作,在返回結果之前在等待可用資源,所以這種會占用很多的時間。為了獲得更直接的快照狀態的完整信息,可以使用快照狀態命令來查詢,例如:
GET /_snapshot/my_backup/snapshot_1/_status
快照信息方法在處理過程中返回快照的基本信息,快照狀態返回在快照中每個分片的當前狀態。
在恢復操作時,Elasticsearch的集群通常會進入紅色狀態。這是因為還原操作開始恢復的索引主要碎片。在這個操作時,主分片變得不可用,這體現在紅色狀態。一旦碎片恢復完成Elasticsearch是轉換為標准的復制過程,創建所需數量的副本這時集群切換到黃色狀態。一旦所有所需的復制品被創建,群集切換到綠色狀態。群集健康操作僅為恢復過程的高層次狀態。通過使用索引恢復和精簡api可以獲得更詳細的恢復過程中的狀態。
停止當前正在運行的快照和恢復操作
快照和恢復操作允許一次只運行一個快照或一次恢復。如果一個當前運行的快照被錯誤地執行,或者需要很長的時間,可以使用快照刪除操作來終止它。快照刪除時是會進行檢查,如果刪除快照正在運行,則停止此次刪除。
還原操作使用標准的分片恢復機制。因此,可以通過刪除索引來取消恢復的操作。請注意,在這種情況下所有已刪除索引的數據將被從集群中移除。
快照和恢復操作對集群塊的影響,快照和恢復操作都受集群和索引塊的影響。例如,注冊和注銷庫需要通過編寫全局元數據來進行訪問。快照操作需要所有的索引和元數據以及全局元數據都是可讀的。恢復操作需要全局元數據是可寫的,但是索引水平塊將被忽略,因為在恢復的過程中索引是重建的。請注意,存儲庫內容不是群集的一部分,因此群集塊不影響內部存儲庫操作,例如已注冊的存儲庫中的列表或刪除快照。
賽克藍德(secisland)后續會逐步對Elasticsearch的最新版本的各項功能進行分析,近請期待。也歡迎加入secisland公眾號進行關注。