elasticsearch備份和還原(基於hdfs)

備份和還原,爲何elasticsearch還須要備份呢,明明能夠設置副本作到高可用,那怕啥呢?html

其實在實際的生產環境中,通常最終的結果數據都是要備份的,這樣的作的目的,就是可以以最快的速度還原數據,找回數據。明明mysql能夠有主從,es有副本,備份幹啥呢?不就是爲了萬無一失嗎,生產環境有時候壓力會很大,像mysql頻繁的插入和刪除數據也會致使binlog日誌同步延遲,有時候就不必定可以作到同步,還有就是誤操做刪除了一些有用的數據呢,對吧,這個叫作有備無患。es也一樣,萬一一波操做猛如虎,一把把某個索引刪除了呢,沒有備份,到時候怎麼死的都不知道呢,因此呢,從集羣的角度去思考,權限,數據備份,高可用,節點拓展等都很重要。elasticsearch備份數據有不少選擇,本地呀,Amazon S3, HDFS, Microsoft Azure, Google Cloud Storage這些均可以,可是我這裏選擇了hdfs,由於作大數據的熟悉呀,還有就是hdfs就是一個分佈式的存儲系統,也是數據高可用的呀,只要集羣不椡,我數據依然完整,因此一點都不方了,因此這篇文章是基於HDFS的Elasticsearch的數據備份和還原。mysql

1、瞭解下

如何存儲:能夠存儲在本地,或者遠程的存儲庫:Amazon S3, HDFS, Microsoft Azure, Google Cloud Storage等sql

操做步驟:第一步:須要註冊快照存儲庫,第二步:才能進行建立快照api

快照原則:快照屬於增量快照,每一個快照只存儲上一個快照沒有的數據,可是均可以經過制定參數進行制定索引進行快照備份安全

恢復原則:默認恢復所有, 也能夠根據需求指定恢復本身須要的索引或者數據流,能夠指定索引就行單獨還原dom

注意點:可使用快照的生命週期來自動的建立和管理快照,備份的時候不能直接經過複製數據進行備份,由於複製的過程當中es可能會改變數據的內容,會致使數據不一致的問題socket

具體的備份和還原細節就交給下文了,看下版本是否支持,若是不支持經過備份還原遷移數據的,可使用_reindex作跨集羣的數據遷移:elasticsearch跨集羣數據遷移elasticsearch

 

 

2、hdfs插件安裝

本地安裝hdfs的插件(每個es節點都須要安裝):分佈式

下載:https://artifacts.elastic.co/downloads/elasticsearch-plugins/repository-hdfs/repository-hdfs-7.8.1.zipide

安裝文檔:https://www.elastic.co/guide/en/elasticsearch/plugins/7.9/plugin-management-custom-url.html  #7.9的文檔不影響哈

 具體執行:./bin/elasticsearch-plugin install file:///data/hd07/car/repository-hdfs-7.8.1.zip   #這裏不要忘記加file:///

而後須要重啓ES的集羣

 cd elasticsearch-7.8.1/plugins && ll

 一看,沒毛病,一個hdfs插件就這麼裝好了,接下來咱們在hdfs上建立用來存儲elasticsearch備份的文件目錄(注:這裏咱們的hadoop是3.x的,chh6.3.2的,雖然官方說是hadoop2.7(2.x),好像也沒什麼影響)

hadoop fs -mkdir /es_bak
hadoop fs -chmod 777 /es_bak   #這裏我就簡單了,省得其餘用戶沒權限寫

這裏咱們就完成了hdfs的設置了,接下來就是elasticsearch的備份和還原操做了

3、備份和還原

3.一、備份

elasticsearch的備份分爲兩步,第一步:須要註冊快照存儲庫,第二步:才能進行建立快照

3.1.一、註冊快照存儲庫

快照存儲庫能夠包含同一個集羣的多個快照。快照是經過集羣中的惟一名稱標識的,接下來咱們就看看基於hdfs的快照存儲庫的建立:

put _snapshot/my_snapshot
{
  "type": "hdfs",
  "settings": {
    "uri": "hdfs://ip:8020/",
    "path": "/es_bak",
    "conf.dfs.client.read.shortcircuit": "true",  #其實這個參數是hdfs的一個dfs.client.read.shortcircuit,用來作節點移動計算,而不是移動數據的理念,數據本地化
    "conf.dfs.domain.socket.path": "/var/run/hdfs-sockets/dn" #配置了上面那個參數,若是hdfs集羣沒這參數dfs.domain.socket.path就會報錯
  }
}

其實CDH版本的hadoop的HDFS默認這兩個都是配置了的

 因此上面的兩個參數是能夠不配置的,由於主機HDFS默認都有配置了的呢

如今咱們查看下咱們建立好了的快照存儲庫:

get _snapshot/

有圖有證據,這個快照存儲庫就建立好了,接下來咱們看看建立快照存儲庫的時候參數設置: 

uri #hdfs的地址hdfs://<host>:<port> #這裏須要注意一點,通常公司的hadoop都是高可用集羣,這裏要配置高可用的地址,不能寫死了
path #快照須要存儲在hdfs上的目錄/es_bak (必填)
conf.<key> #這個是用來添加hadoop的一些配置的,好比上面例子"conf.dfs.client.read.shortcircuit": "true"
load_defaults #是否加載hadoop的配置,默認加載
compress #是否壓縮元數據,默認false
max_restore_bytes_per_sec #每一個節點的恢復速率。默認爲無限
max_snapshot_bytes_per_sec #每一個節點快照速率。默認值爲每秒40mb
readonly #設置快照存儲庫爲只讀,默認false
chunk_size #覆蓋塊大小,默認disabled
security.principal #鏈接到安全的HDFS集羣時使用的Kerberos主體

這部分就說到這裏了,這個是官方文檔:https://www.elastic.co/guide/en/elasticsearch/plugins/7.9/repository-hdfs-config.html

3.1.二、建立快照

官方網址:https://www.elastic.co/guide/en/elasticsearch/reference/current/snapshots-take-snapshot.html

使用格式:

PUT /_snapshot/<repository>/<snapshot>
POST /_snapshot/<repository>/<snapshot>

快照建立細節:

  1. 默認狀況下,快照包括羣集中的全部數據流和打開的索引,以及羣集狀態。能夠經過指定要備份在快照請求正文中的數據流和索引列表來更改
  2. 快照是增量的快照備份。在建立快照的過程當中,Elasticsearch將分析存儲庫中已經存儲的數據流和索引文件的列表,並僅複製自上次快照以來建立或更改的文件。這個過程容許多個快照以緊湊的形式保存在存儲庫中。
  3. 快照進程以非阻塞方式執行。全部索引和搜索操做均可以繼續針對快照中的數據流或索引運行。可是,快照表示建立快照時的時間點視圖,所以在快照進程啓動後添加到數據流或索引的記錄不會包含在快照中
  4. 對於已經啓動且目前沒有從新定位的主分片,快照進程將當即啓動。Elasticsearch在快照以前等待分片的從新定位或初始化完成
  5. 除了建立每一個數據流和索引的副本外,快照過程還能夠存儲全局集羣元數據,其中包括持久的集羣設置和模板。暫態設置和註冊快照存儲庫不做爲快照的一部分存儲

先來個例子:

PUT /_snapshot/my_snapshot/snapshot_1?wait_for_completion=true
{
  "indices": "index_name_word",
  "ignore_unavailable": true,
  "include_global_state": false,
  "metadata": {
    "taken_by": "lgh",
    "taken_because": "backup test"
  }
}

 

 

而後咱們看看hdfs上面:

 hadoop fs -ls /es_bak

 hadoop fs -ls /es_bak/indices

 單獨的索引算是備份完成了,接下來咱們看看參數:

ignore_unavailable #默認false,表示對於任何的請求丟失或關閉的數據流或索引,返回一個錯誤
indices #默認狀況下,快照包括集羣中的全部數據流和索引,要來設置須要備份的索引,多個之間用逗號(,)分隔,支持正則est* or *test or te*t or *test*或者使用(-)減號排除-test3
include_global_state #快照中包含當前集羣狀態。默認值爲true,主要包括這些元數據:Persistent cluster settings,Index templates,Legacy index templates,Ingest pipelines,ILM lifecycle policies
master_timeout #指定等待鏈接到主節點的時間。若是在超時到期前沒有收到響應,則請求失敗並返回錯誤。默認爲30秒
metadata #可添加一些備註信息,如上個例子所示
partial #默認false,表示若是快照中包含的一個或多個索引沒有全部的主分片可用,則整個快照將失敗
wait_for_completion #默認false,請求在快照初始化時返回響應,不然要等待完成才返回

 官網還提供了根據時間後綴來建立快照名:

 

 可是實驗了一下,失敗了:

 

 不過稍微修改下就行了:

get _snapshot/my_snapshot/_all

3.二、還原

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

還原語法:POST /_snapshot/my_backup/snapshot_1/_restore

默認狀況下,快照中的全部數據流和索引都將恢復,但不會恢復集羣狀態。不過可使用indices參數指定索引進行還原恢復。

注意1:每一個數據流都須要一個匹配的索引模板。使用此模板建立新的索引。若是不存在能夠建立一個匹配的索引模板,或者恢復集羣的元數據。否則的話,數據流不能滾動的建立新的索引

注意2:恢復索引時,若是索引名存在是不會被還原的,除非該索引被關閉了,還要保證分片數相同,纔會進行還原,還原的過程當中會自動打開已經關閉的索引,若是索引不存在則會建立新的索引

看下具體的參數:

ignore_unavailable #默認false,表示對於任何的請求丟失或關閉的數據流或索引,返回一個錯誤
ignore_index_settings #一個逗號分隔的索引設置列表,忽略不須要恢復的索引
include_aliases #默認true,恢復時是否恢復別名
include_global_state #是否恢復集羣的狀態,元數據信息,默認false
index_settings #設置索引設置,能夠用來覆蓋原索引的索引配置
indices ##默認狀況下,快照包括集羣中的全部數據流和索引,要來設置須要還原的索引,多個之間用逗號(,)分隔,支持正則est* or *test or te*t or *test*或者使用(-)減號排除-test3
partial ##默認false,表示若是快照中包含的一個或多個索引沒有全部的主分片可用,則整個快照將失敗
rename_pattern #定義用於恢復數據流和索引的重命名模式。與重命名模式匹配的數據流和索引將根據rename_replacement進行重命名。可以使用正則
rename_replacement #定義重命名替換字符串
wait_for_completion #默認false,請求在快照初始化時返回響應,不然要等待完成才返回

實例一(沒有試驗,官方實例):

POST /_snapshot/my_backup/snapshot_1/_restore
{
  "indices": "data_stream_1,index_1,index_2",
  "ignore_unavailable": true,
  "include_global_state": false,              
  "rename_pattern": "index_(.+)",
  "rename_replacement": "restored_index_$1",
  "include_aliases": false
}

實例二(沒有試驗,官方實例):

POST /_snapshot/my_backup/snapshot_1/_restore
{
  "indices": "index_1",
  "ignore_unavailable": true,
  "index_settings": {  #修改索引配置
    "index.number_of_replicas": 0
  },
  "ignore_index_settings": [  #忽略的索引
    "index.refresh_interval"
  ]
}

3.三、查看和刪除

使用_current參數檢索集羣中當前運行的全部快照

GET /_snapshot/my_backup/_current

 

 檢索關於單個快照的信息

GET /_snapshot/my_backup/snapshot_1

 

 如上能夠檢索多個快照,可使用逗號隔開,或者使用*這樣的通配符以及_all表示全部,例如:

GET /_snapshot/my_backup/snapshot_*,some_other_snapshot
GET /_snapshot/_all
GET /_snapshot/my_backup,my_fs_backup
GET /_snapshot/my*
GET /_snapshot/my_backup/_all

對快照存儲庫和快照的狀態經過_status查看:

GET /_snapshot/_status
GET /_snapshot/my_backup/_status
GET /_snapshot/my_backup/snapshot_1/_status

詳情見:https://www.elastic.co/guide/en/elasticsearch/reference/current/get-snapshot-status-api.html

刪除快照:

DELETE /_snapshot/my_backup/snapshot_1

3.四、定時備份

一種是經過crontab定時備份(這裏不說,很簡單),還有一種是經過Elasticsearch的SLM策略進行定時備份。

咱們都知道備份這種事情呢不是單單去備份一次,也不能每次都去手動備份,因此es的備份提供相似crontab同樣的時間調度。能夠設置快照生命週期策略來自動化快照的計時、頻率和保留。快照策略能夠應用於多個數據流和索引。

使用SLM策略自動化Elasticsearch數據流和索引的平常備份。該策略獲取集羣中全部數據流和索引的快照,並將它們存儲在本地存儲庫中。它還定義了一個保留策略,並在再也不須要快照時自動刪除快照。

要使用SLM,您必須配置一個快照存儲庫。存儲庫能夠是本地(共享文件系統)或遠程(雲存儲)。遠程存儲庫能夠駐留在S三、HDFS、Azure、谷歌雲存儲或存儲庫插件支持的任何其餘平臺上

因此有兩個步驟:第一步,建立快照存儲庫,第二步:建立SLM策略

第一步:建立快照存儲庫(查看3.1.一、註冊快照存儲庫)

第二步:建立SLM策略

官方實例:

PUT /_slm/policy/nightly-snapshots
{
  "schedule": "0 30 1 * * ?",  #配置定時調度,參考https://www.elastic.co/guide/en/elasticsearch/reference/current/trigger-schedule.html#schedule-cron
  "name": "<nightly-snap-{now/d}>",  #配置快照名字,能夠經過時間爲後綴名
  "repository": "my_repository",  #快照存儲庫名
  "config": {  #用於快照請求的配置,能夠從建立快照中的參數配置
    "indices": ["*"]  #好比對某些索引進行快照
  },
  "retention": { #保留策略:將快照保存30天,不管快照的年齡如何,至少保留5個且不超過50個快照
    "expire_after": "30d", 
    "min_count": 5, 
    "max_count": 50 
  }
}

實驗:

put _slm/policy/nightly-snapshots
{
  "schedule": "0 30 1 * * ?", 
  "name": "<lgh-{now{yyyy.MM.dd}}>", 
  "repository": "my_snapshot", 
  "config": { 
    "indices": ["*"] 
  },
  "retention": { 
    "expire_after": "30d", 
    "min_count": 5, 
    "max_count": 50 
  }
}

 

 

POST /_slm/policy/nightly-snapshots/_execute #手動執行快照策略

 

 

get _snapshot/my_snapshot/_all #查看建立的快照信息

 

 

GET /_slm/policy/nightly-snapshots?human  #檢索策略以獲取成功或失敗信息

 

 本篇文章差很少結束了,還有要拓展的最好去官網看看,好比要進行SML安全相關的:https://www.elastic.co/guide/en/elasticsearch/reference/current/slm-and-security.html

相關文章
相關標籤/搜索