105_es生產(chǎn)集群備份恢復(fù)之基于snapshot+hdfs進(jìn)行數(shù)據(jù)備份

105_es生產(chǎn)集群備份恢復(fù)之基于snapshot+hdfs進(jìn)行數(shù)據(jù)備份

1柴我、es集群數(shù)據(jù)備份

任何一個存儲數(shù)據(jù)的軟件撞反,都需要定期的備份我們的數(shù)據(jù)链瓦。es replica提供了運(yùn)行時的高可用保障機(jī)制蒲凶,可以容忍少數(shù)節(jié)點的故障和部分?jǐn)?shù)據(jù)的丟失茄螃,但是整體上卻不會丟失任何數(shù)據(jù)缝驳,而且不會影響集群運(yùn)行。但是replica沒法進(jìn)行災(zāi)難性的數(shù)據(jù)保護(hù)归苍,比如說機(jī)房徹底停電用狱,所有機(jī)器全部當(dāng)即,等等情況拼弃。對于這種災(zāi)難性的故障夏伊,我們就需要對集群中的數(shù)據(jù)進(jìn)行備份了,集群中數(shù)據(jù)的完整備份吻氧。

要備份集群數(shù)據(jù)溺忧,就要使用snapshot api咏连。這個api會將集群當(dāng)前的狀態(tài)和數(shù)據(jù)全部存儲到一個外部的共享目錄中去,比如NAS鲁森,或者h(yuǎn)dfs祟滴。而且備份過程是非常智能的,第一次會備份全量的數(shù)據(jù)歌溉,但是接下來的snapshot就是備份兩次snapshot之間的增量數(shù)據(jù)了垄懂。數(shù)據(jù)是增量進(jìn)入es集群或者從es中刪除的,那么每次做snapshot備份的時候研底,也會自動在snapshot備份中增量增加數(shù)據(jù)或者刪除部分?jǐn)?shù)據(jù)埠偿。因此這就意味著每次增量備份的速度都是非常快的榜晦。

如果要使用這個功能冠蒋,我們需要有一個預(yù)先準(zhǔn)備好的獨(dú)立于es之外的共享目錄,用來保存我們的snapshot備份數(shù)據(jù)乾胶。es支持多種不同的目錄類型:shared filesystem抖剿,比如NAS;Amazon S3识窿;hdfs斩郎;Azure Cloud。不過對于國內(nèi)的情況而言喻频,其實NAS應(yīng)該很少用缩宜,一般來說,就用hdfs會比較多一些甥温,跟hadoop這種離線大數(shù)據(jù)技術(shù)棧整合起來使用锻煌。

2、創(chuàng)建備份倉庫

(1)創(chuàng)建和查詢倉庫的命令

PUT _snapshot/my_backup
{
"type": "fs",
"settings": {
"location": "/mount/backups/my_backup"
}
}

這里用了shared filesystem作為倉庫類型姻蚓,包括了倉庫名稱以及倉庫類型是fs宋梧,還有倉庫的地址。這個里面就包含了倉庫的一些必要的元數(shù)據(jù)了狰挡∥媪洌可能還有其他的一些參數(shù)可以配置,主要是基于我們的node和網(wǎng)絡(luò)的性能來配置加叁。max_snapshot_bytes_per_sec倦沧,這個參數(shù)用于指定數(shù)據(jù)從es灌入倉庫的時候,進(jìn)行限流它匕,默認(rèn)是20mb/s刀脏。max_restore_bytes_per_sec,這個參數(shù)用于指定數(shù)據(jù)從倉庫中恢復(fù)到es的時候超凳,進(jìn)行限流愈污,默認(rèn)也是20mb/s。假如說網(wǎng)絡(luò)是非陈职快速的暂雹,那么可以提高這兩個參數(shù)的值,可以加快每次備份和恢復(fù)的速度创夜,比如下面:

POST _snapshot/my_backup/
{
"type": "fs",
"settings": {
"location": "/mount/backups/my_backup",
"max_snapshot_bytes_per_sec" : "50mb",
"max_restore_bytes_per_sec" : "50mb"
}
}

創(chuàng)建一個倉庫之后杭跪,就可以查看這個倉庫的信息了:GET /_snapshot/my_backup,或者是查看所有的倉庫驰吓,GET /_snapshot/_all涧尿。可能返回如下的信息:

{
"my_backup": {
"type": "fs",
"settings": {
"compress": true,
"location": "/mount/backups/my_backup"
}
}
}

(2)基于hdfs創(chuàng)建倉庫

但是其實如果在國內(nèi)使用es的話檬贰,還是建議跟hadoop生態(tài)整合使用姑廉,不要用那種shared filesystem∥痰樱可以用hadoop生態(tài)的hdfs分布式文件存儲系統(tǒng)桥言。首先先要安裝repository-hdfs的插件:bin/elasticsearch-plugin install repository-hdfs,必須在每個節(jié)點上都安裝葵礼,然后重啟整個集群号阿。

kill -SIGTERM 15516

su elasticsearch
elasticsearch -d -Epath.conf=/etc/elasticsearch

curl -XGET elasticsearch02:9200/_cat/nodes?v

在3個hdfs node上,都加入hdfs-site.xml鸳粉,禁止權(quán)限檢查扔涧,如果要修改這個配置文件,要先在/usr/local/hadoop/sbin届谈,運(yùn)行./stop-dfs.sh枯夜,停止整個hdfs集群,然后在3個node上疼约,都修改hdfs-site.xml卤档,加入下面的配置,禁止權(quán)限的檢查

<property>
<name>dfs.permissions</name>
<value>false</value>
</property>

hdfs snapshot/restore plugin是跟最新的hadoop 2.x整合起來使用的程剥,目前是hadoop 2.7.1劝枣。所以如果我們使用的hadoop版本跟這個es hdfs plugin的版本不兼容,那么考慮在hdfs plugin的文件夾里织鲸,將hadoop相關(guān)jar包都替換成我們自己的hadoop版本對應(yīng)的jar包舔腾。即使hadoop已經(jīng)在es所在機(jī)器上也安裝了,但是為了安全考慮搂擦,還是應(yīng)該將hadoop jar包放在hdfs plugin的目錄中稳诚。

安裝好了hdfs plugin之后,就可以創(chuàng)建hdfs倉庫了瀑踢,用如下的命令即可:

curl -XGET 'http://localhost:9200/_count?pretty' -d '
{
"query": {
"match_all": {}
}
}
'

curl -XPUT 'http://elasticsearch02:9200/_snapshot/my_hdfs_repository2' -d '
{
"type": "hdfs",
"settings": {
"uri": "hdfs://elasticsearch02:9000/",
"path": "elasticsearch/respositories/my_hdfs_repository",
"conf.dfs.client.read.shortcircuit": "false",
"max_snapshot_bytes_per_sec" : "50mb",
"max_restore_bytes_per_sec" : "50mb"
}
}'

(3)驗證倉庫

在課程演示中扳还,最好都是用root用戶去演示才避,一般來說就夠了,因為在不同的公司里氨距,你可能linux用戶管理桑逝,權(quán)限,都不太一樣

專門去建一套用戶和授權(quán)去演示俏让,不太合適

如果一個倉庫被創(chuàng)建好之后楞遏,我們可以立即去驗證一下這個倉庫是否可以在所有節(jié)點上正常使用。verify參數(shù)都可以用來做這個事情首昔,比如下面的命令寡喝。這個命令會返回一個node列表,證明那些node都驗證過了這個倉庫是ok的勒奇,可以使用的

curl -XPOST 'http://elasticsearch02:9200/_snapshot/my_hdfs_repository/_verify'

先停止整個es集群预鬓,然后在3個節(jié)點上杠巡,都加入下面的配置闸婴,然后用elasticsearch賬號重啟整個es集群

/usr/local/elasticsearch/plugins/repository-hdfs/plugin-security.policy

permission java.lang.RuntimePermission "accessDeclaredMembers";
permission java.lang.RuntimePermission "getClassLoader";
permission java.lang.RuntimePermission "shutdownHooks";
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
permission javax.security.auth.AuthPermission "doAs";
permission javax.security.auth.AuthPermission "getSubject";
permission javax.security.auth.AuthPermission "modifyPrivateCredentials";
permission java.security.AllPermission;
permission java.util.PropertyPermission "", "read,write";
permission javax.security.auth.PrivateCredentialPermission "org.apache.hadoop.security.Credentials * "
"", "read";

/usr/local/elasticsearch/config/jvm.options

-Djava.security.policy=file:////usr/local/elasticsearch/plugins/repository-hdfs/plugin-security.policy

3慢味、對索引進(jìn)行snapshotting備份

(1)對所有open的索引進(jìn)行snapshotting備份

一個倉庫可以包含多分snapshot奕短,每個snapshot是一部分索引的備份數(shù)據(jù)奠衔,創(chuàng)建一份snapshot備份時适篙,我們要指定要備份的索引张弛。比如下面這行命令:PUT _snapshot/my_hdfs_repository/snapshot_1鹃两,這行命令就會將所有open的索引都放入一個叫做snapshot_1的備份草添,并且放入my_backup倉庫中驶兜。這個命令會立即返回,然后備份操作會被后臺繼續(xù)進(jìn)行远寸。如果我們不希望備份操作以后臺方式運(yùn)行抄淑,而是希望在前臺發(fā)送請求時等待備份操作執(zhí)行完成,那么可以加一個參數(shù)即可驰后,比如下面這樣:PUT _snapshot/my_backup/snapshot_1?wait_for_completion=true肆资。

curl -XPUT 'http://elasticsearch02:9200/_snapshot/my_hdfs_repository/snapshot_1'

(2)對指定的索引進(jìn)行snapshotting備份

默認(rèn)的備份是會備份所有的索引,但是有的時候灶芝,可能我們不希望備份所有的索引郑原,有些可能是不重要的數(shù)據(jù),而且量很大夜涕,沒有必要占用我們的hdfs磁盤資源犯犁,那么可以指定備份少數(shù)重要的數(shù)據(jù)即可。此時可以使用下面的命令去備份指定的索引:

PUT _snapshot/my_backup/snapshot_2
{
"indices": "index_1,index_2",
"ignore_unavailable": true,
"include_global_state": false,
"partial": true
}

ignore_unavailable如果設(shè)置為true的話女器,那么那些不存在的index就會被忽略掉酸役,不會進(jìn)行備份過程中。默認(rèn)情況下,這個參數(shù)是不設(shè)置的涣澡,那么此時如果某個index丟失了贱呐,會導(dǎo)致備份過程失敗。設(shè)置include_global_state為false暑塑,可以阻止cluster的全局state也作為snapshot的一部分被備份吼句。默認(rèn)情況下,如果某個索引的部分primary shard不可用事格,那么會導(dǎo)致備份過程失敗,那么此時可以將partial設(shè)置為true搞隐。

而且snapshotting的過程是增量進(jìn)行的驹愚,每次執(zhí)行snapshotting的時候,es會分析已經(jīng)存在于倉庫中的snapshot對應(yīng)的index file劣纲,然后僅僅備份那些自從上次snapshot之后新創(chuàng)建的或者有過修改的index files逢捺。這就允許多個snapshot在倉庫中可以用一種緊湊的模式來存儲。而且snapshotting過程是不會阻塞所有的es讀寫操作的癞季,然而劫瞳,在snapshotting開始之后,寫入index中的數(shù)據(jù)绷柒,是不會反應(yīng)到這次snapshot中的志于。每次snapshot除了創(chuàng)建一份index的副本之外,還可以保存全局的cluster元數(shù)據(jù)废睦,里面包含了全局的cluster設(shè)置和template伺绽。

每次只能執(zhí)行一次snapshot操作,如果某個shard正在被snapshot備份嗜湃,那么這個shard此時就不能被移動到其他node上去奈应,這會影響shard rebalance的操作。只有在snapshot結(jié)束之后购披,這個shard才能夠被移動到其他的node上去杖挣。

4、查看snapshot備份列表

一旦我們在倉庫中備份了一些snapshot之后刚陡,就可以查看這些snapshot相關(guān)的詳細(xì)信息了惩妇,使用這行命令就可以查看指定的snapshot的詳細(xì)信息:GET _snapshot/my_backup/snapshot_2,結(jié)果大致如下所示橘荠。當(dāng)然也可以查看所有的snapshot列表屿附,GET _snapshot/my_backup/_all。

curl -XGET 'http://elasticsearch02:9200/_snapshot/my_hdfs_repository/snapshot_1?pretty'

{
"snapshots" : [
{
"snapshot" : "snapshot_1",
"uuid" : "x8DXcrp2S0md-BC9ftYZqw",
"version_id" : 5050099,
"version" : "5.5.0",
"indices" : [
"my_index"
],
"state" : "SUCCESS",
"start_time" : "2017-07-08T19:54:54.914Z",
"start_time_in_millis" : 1499543694914,
"end_time" : "2017-07-08T19:54:56.886Z",
"end_time_in_millis" : 1499543696886,
"duration_in_millis" : 1972,
"failures" : [ ],
"shards" : {
"total" : 5,
"failed" : 0,
"successful" : 5
}
}
]
}

5哥童、刪除snapshot備份

如果要刪除過于陳舊的snapshot備份快照挺份,那么使用下面這行命令即可:DELETE _snapshot/my_backup/snapshot_2。記住贮懈,一定要用api去刪除snapshot匀泊,不要自己手動跑到hdfs里刪除這個數(shù)據(jù)优训。因為snapshot是增量的,有可能很多snapshot依賴于底層的某一個公共的舊的snapshot segment各聘。但是delete api是理解數(shù)據(jù)如何增量存儲和互相依賴的揣非,所以可以正確的刪除那些不用的數(shù)據(jù)。如果我們自己手工進(jìn)行hdfs文件刪除躲因,可能導(dǎo)致我們的backup數(shù)據(jù)破損掉早敬,就無法使用了。

curl -XDELETE 'http://elasticsearch02:9200/_snapshot/my_hdfs_repository/snapshot_1'

6大脉、監(jiān)控snapshotting的進(jìn)度

使用wait_for_completion可以在前臺等待備份完成搞监,但是實際上也沒什么必要,因為可能要備份的數(shù)據(jù)量特別大镰矿,難道還等待1個小時琐驴??看著是不太現(xiàn)實的秤标,所以一般還是在后臺運(yùn)行備份過程绝淡,然后使用另外一個監(jiān)控api來查看備份的進(jìn)度,首先可以獲取一個snapshot ID:GET _snapshot/my_backup/snapshot_3苍姜。如果這個snapshot還在備份過程中牢酵,此時我們就可以看到一些信息,比如什么時候開始備份的怖现,已經(jīng)運(yùn)行了多長時間茁帽,等等。然而屈嗤,這個api用了跟snapshot一樣的線程池去執(zhí)行潘拨,如果我們在備份非常大的shard,進(jìn)度的更新可能會非常之慢饶号。一個更好的選擇是用_status API铁追,GET _snapshot/my_backup/snapshot_3/_status,這個api立即返回最詳細(xì)的數(shù)據(jù)茫船。這里我們可以看到總共有幾個shard在備份琅束,已經(jīng)完成了幾個,還剩下幾個算谈,包括每個索引的shard的備份進(jìn)度:

curl -XGET 'http://elasticsearch02:9200/_snapshot/my_hdfs_repository/snapshot_1'

7涩禀、取消snapshotting備份過程

如果我們想要取消一個正在執(zhí)行的snapshotting備份過程,比如我們發(fā)現(xiàn)備份時間過于長然眼,希望先取消然后在晚上再運(yùn)行艾船,或者是因為不小心誤操作發(fā)起了一次備份操作,這個時候就可以運(yùn)行下面這條命令:DELETE _snapshot/my_backup/snapshot_3。也就是立即刪除這個snapshot屿岂,這個命令會去取消snapshot的過程践宴,同時將備份了一半的倉庫中的數(shù)據(jù)給刪除掉。

curl -XDELETE 'http://elasticsearch02:9200/_snapshot/my_hdfs_repository/snapshot_1'

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爷怀,一起剝皮案震驚了整個濱河市阻肩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌运授,老刑警劉巖烤惊,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吁朦,居然都是意外死亡撕氧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門喇完,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人剥啤,你說我怎么就攤上這事锦溪。” “怎么了府怯?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵刻诊,是天一觀的道長。 經(jīng)常有香客問我牺丙,道長则涯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任冲簿,我火速辦了婚禮粟判,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘峦剔。我一直安慰自己档礁,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布吝沫。 她就那樣靜靜地躺著呻澜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惨险。 梳的紋絲不亂的頭發(fā)上羹幸,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音辫愉,去河邊找鬼栅受。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窘疮。 我是一名探鬼主播袋哼,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼闸衫!你這毒婦竟也來了涛贯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤蔚出,失蹤者是張志新(化名)和其女友劉穎弟翘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骄酗,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稀余,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了趋翻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睛琳。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖踏烙,靈堂內(nèi)的尸體忽然破棺而出师骗,到底是詐尸還是另有隱情,我是刑警寧澤讨惩,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布辟癌,位于F島的核電站,受9級特大地震影響荐捻,放射性物質(zhì)發(fā)生泄漏黍少。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一处面、第九天 我趴在偏房一處隱蔽的房頂上張望厂置。 院中可真熱鬧,春花似錦鸳君、人聲如沸农渊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砸紊。三九已至,卻和暖如春囱挑,著一層夾襖步出監(jiān)牢的瞬間醉顽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工平挑, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留游添,地道東北人系草。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像唆涝,于是被迫代替她去往敵國和親找都。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容