前言
Graylog中使用MongoDB存儲配置數(shù)據(jù)稽亏,例如:用戶信息、stream信息配置數(shù)據(jù)等,沒有任何的日志數(shù)據(jù)是存儲在MongoDB中的。我們比較關(guān)心的日志數(shù)據(jù)是存儲在elasticsearch中驾孔,因此要做數(shù)據(jù)備份重要的是備份elasticsearch中的索引。
Elasticsearch數(shù)據(jù)的備份惯疙,可以使用snapshot API翠勉。這個會拿到集群當(dāng)前的狀態(tài)和數(shù)據(jù)然后保存在一個共享倉庫里面,并且是增量備份霉颠。備份的第一個快照會拷貝一份完整的數(shù)據(jù)对碌,而后續(xù)的快照則是保留已存快照和新數(shù)據(jù)之間的差異數(shù)據(jù)。隨著你不時的對數(shù)據(jù)進(jìn)行快照蒿偎,備份也在增量的添加和刪除朽们。這意味著后續(xù)備份會相當(dāng)快速,因為它們只傳輸很小的數(shù)據(jù)量诉位。
要使用這個功能骑脱,你必須首先創(chuàng)建一個保存數(shù)據(jù)的倉庫。有多個倉庫類型可以供你選擇:
1)共享文件系統(tǒng)苍糠,比如 NAS
2)Amazon S3
3)HDFS (Hadoop 分布式文件系統(tǒng))
4)Azure Cloud
本文以下介紹的為創(chuàng)建共享的目錄叁丧,作為備份數(shù)據(jù)的倉庫,在創(chuàng)建的倉庫中創(chuàng)建快照以備份數(shù)據(jù)。
信息匯總:
使用快照備份數(shù)據(jù)之前需要創(chuàng)建共享文件系統(tǒng)的倉庫拥娄,本次使用sshfs在ES集群中每個節(jié)點的相同位置掛載一個共享目錄蚊锹,下面列出集群環(huán)境中各個節(jié)點中用于數(shù)據(jù)備份的目錄及其作用。
IP | 目錄 | 備注 |
---|---|---|
192.168.2.121 | /backup /esData/backup |
共享倉庫目錄 倉庫目錄 |
192.168.2.122 | /esData/backup | 倉庫目錄 |
192.168.2.123 | /esData/backup | 倉庫目錄 |
如上述表格所示稚瘾,本次搭建3節(jié)點的elasticsearch集群牡昆。
各個節(jié)點的/esData/backup目錄掛載到192.168.2.121的目錄/backup,
最終所有節(jié)點的備份數(shù)據(jù)都將存儲在192.168.2.121中的/backup目錄中孟抗。后續(xù)如果需要做數(shù)據(jù)遷移迁杨,遷移192.168.2.121的目錄/backup中的數(shù)據(jù)即可。
前期準(zhǔn)備
創(chuàng)建并掛載共享目錄
這里的共享目錄是指集群中的每個節(jié)點都能感知并將數(shù)據(jù)寫入到該倉庫的文件凄硼。
安裝sshfs
執(zhí)行如下命令安裝sshfs:
$ sudo yum install sshfs
至此铅协,sshfs安裝完成。
選定共享目錄
- 選擇在集群中一個節(jié)點上創(chuàng)建目錄作為共享目錄摊沉,本次選擇
192.168.2.121
節(jié)點:$ sudo mkdir /backup
- 更改所屬用戶:
$ sudo chown -R monitorManager:monitorManager /backup
- 更改權(quán)限:
$ sudo chmod -R 777 /backup
創(chuàng)建倉庫目錄
- 在每個節(jié)點的相同位置創(chuàng)建目錄:
$ sudo mkdir /esData $ sudo mkdir /esData/backup
- 更改所屬用戶:
$ sudo chown -R monitorManager:monitorManager /esData
- 更改權(quán)限:
$ sudo chmod -R 777 /esData
測試elasticsearch用戶是否對創(chuàng)建的目錄有寫入權(quán)限
命令如下:
$ sudo -u elasticsearch touch /backup/test
$ sudo -u elasticsearch touch /esData/backup/test
每個節(jié)點掛載共享目錄
- 將
/etc/fuse.conf
中的user_allow_other
注釋去掉狐史,否則下面的步驟2會有問題。 - 在每個節(jié)點中執(zhí)行如下命令说墨,將剛剛創(chuàng)建的目錄掛載到共享目錄上:
$ sshfs monitorManager@172.30.5.132:/backup /esData/backup -o allow_other
說明:其中參數(shù)-o allow_other
是為了解決不同節(jié)點往共享倉庫中寫數(shù)據(jù)的權(quán)限問題骏全。
更改elasticsearch配置
更改elasticsearch配置文件
更改/etc/elasticsearch/elasticsearch.yml
文件,在文件末尾添加path.repo
配置倉庫目錄位置:
$ sudo vim /etc/elasticsearch/elasticsearch.yml
添加如下內(nèi)容:
path.repo: /esData/backup
保存文件并退出編輯尼斧。
重啟elasticsearch
重啟elasticsearch節(jié)點:
$ sudo systemctl restart elasticsearch.service
開始你的備份
創(chuàng)建倉庫
執(zhí)行如下命令姜贡,創(chuàng)建一個倉庫:
$ curl -XPUT 'http://192.168.2.121:9200/_snapshot/backup_1' -d '{
"type":"fs",
"settings":{
"location":"/esData/backup",
"compress":true
}
}'
說明:
- 給我們的倉庫取一個名字,在本例它叫backup_1棺棵。
- 我們指定倉庫的類型應(yīng)該是一個共享文件系統(tǒng)楼咳。
- 最后,我們提供一個已掛載的設(shè)備作為目的地址烛恤,本例中位置為:/esData/backup母怜。
- "compress":true代表壓縮備份。
這步會在掛載點創(chuàng)建倉庫和所需的元數(shù)據(jù)缚柏。
還有一些其他的配置你可能想要配置的苹熏,這些取決于你的節(jié)點、網(wǎng)絡(luò)的性能狀況和倉庫位置: -
max_snapshot_bytes_per_sec
:當(dāng)快照數(shù)據(jù)進(jìn)入倉庫時币喧,這個參數(shù)控制這個過程的限流情況轨域。默認(rèn)是每秒20mb。 -
max_restore_bytes_per_sec
:當(dāng)從倉庫恢復(fù)數(shù)據(jù)時杀餐,這個參數(shù)控制什么時候恢復(fù)過程會被限流以保障你的網(wǎng)絡(luò)不會被占滿干发。默認(rèn)是每秒20mb。
假設(shè)我們有一個非沉常快的網(wǎng)絡(luò)铐然,而且對額外的流量也很 OK蔬崩,那我們可以增加這些默認(rèn)值:
$ curl -XPOST 'http://192.168.2.121:9200/_snapshot/backup_1' -d '{
"type":"fs",
"settings":{
"location":"/esData/backup",
"max_snapshot_bytes_per_sec" : "50mb",
"max_restore_bytes_per_sec" : "50mb"
"compress":true
}
}'
注意:注意我們用的是 POST
而不是PUT
,POST
會更新已有倉庫的設(shè)置搀暑。
查看倉庫指定倉庫:
$ curl -XGET 'http://192.168.2.121:9200/_snapshot/my_backup?pretty'
查看所有倉庫:
$ curl -XGET 'http://192.168.2.121:9200/_snapshot?pretty'
或者
$ curl -XGET 'http://192.168.2.121:9200/_snapshot/_all?pretty'
說明:pretty
參數(shù)會讓返回數(shù)據(jù)可讀性提高沥阳,顯示縮進(jìn),以json的格式返回到控制臺自点。
快照索引
一個倉庫可以包含同一個集群的多個快照桐罕。快照根據(jù)集群中的唯一名字進(jìn)行區(qū)分桂敛。
快照所有打開的索引:
$ curl -XPUT 'http://192.168.2.121:9200/_snapshot/backup_1/snapshot_1?pretty&wait_for_completion=true'
這個會備份所有打開的索引到backup_1
倉庫下一個命名為 snapshot_1
的快照里功炮。wait_for_completion
參數(shù)指定創(chuàng)建snapshot的請求是否等待快照創(chuàng)建完成再返回。
快照指定索引:
$ curl -XPUT 'http://192.168.2.121:9200/_snapshot/backup_1/snapshot_2018_03_23' -d '{"indices":"test_28"}?pretty&wait_for_completion=true'
上面的命令快照了索引名為test_28
的索引术唬,可以指定多個索引名稱薪伏,如:"indices":"test_28,test_27,test_26"
監(jiān)控快照進(jìn)度:
$ curl -XGET 'http://192.168.2.121:9200/_snapshot/backup_1/snapshot_2018_03_23/_status?pretty'
wait_for_completion=true
只是顯示基礎(chǔ)信息,對于大型的集群備份時這個指標(biāo)是不夠用的粗仓,上面的_status
可以顯示全面的信息嫁怀,一個正在運行的快照會顯示 IN_PROGRESS
作為狀態(tài)。
INITIALIZING
分片在檢查集群狀態(tài)看看自己是否可以被快照借浊。這個一般是非程潦纾快的。
STARTED
數(shù)據(jù)正在被傳輸?shù)絺}庫蚂斤。
FINALIZING
數(shù)據(jù)傳輸完成存捺;分片現(xiàn)在在發(fā)送快照元數(shù)據(jù)。
DONE
快照完成曙蒸!
FAILED
快照處理的時候碰到了錯誤捌治,這個分片/索引/快照不可能完成了。檢查你的日志獲取更多信息逸爵。
查看指定快照:
例如具滴,你想要查看backup_1
倉庫中名為snapshot_2018_03_23
的快照凹嘲,你就可以使用下面的命令师倔。
$ curl -XGET 'http://172.30.5.133:9200/_snapshot/backup_1/snapshot_2018_03_23?pretty'
查看所有快照:
查看backup_1
倉庫中的所有快照。
$ curl -XGET 'http://192.168.2.121:9200/_snapshot/backup_1/_all?pretty'
刪除快照:
刪除backup_1
倉庫中的snapshot_1
的快照周蹭。
$ curl -XDELETE 'http://192.168.2.121:9200/_snapshot/backup_1/snapshot_1'
取消一個快照:
要取消一個快照趋艘,在他進(jìn)行中的時候簡單的刪除快照就可以:
$ curl -XDELETE 'http://192.168.2.121:9200/_snapshot/backup_1/snapshot_1'
這個會中斷快照進(jìn)程,然后刪除倉庫里進(jìn)行到一半的快照凶朗。
從快照恢復(fù)
一旦你備份過了數(shù)據(jù)瓷胧,恢復(fù)它就簡單了:只要在你希望恢復(fù)回集群的快照ID
后面加上_restore
即可。
快照恢復(fù):
$ curl -XPOST 'http://192.168.2.121:9200/_snapshot/backup_1/snapshot_1/_restore?pretty&wait_for_completion=true'
默認(rèn)情況下棚愤,把這個快照里存有的所有索引都恢復(fù)搓萧。如果 snapshot_1
包括五個索引杂数,這五個都會被恢復(fù)到我們集群里。
此外瘸洛,你可以指定索引名稱恢復(fù)指定的索引揍移,同樣可以使用 include_global_state
選項來防止恢復(fù)集群的狀態(tài)。 indices 支持配置多個索引multi index syntax.rename_pattern
和 rename_replacement
選項可以在恢復(fù)的時候使用正則表達(dá)式來重命名index
反肋。例如:
$ curl -XPOST "192.168.2.121:9200/_snapshot/backup_1/snapshot_1/_restore" -d '{
"indices": "index_1,index_2",
"ignore_unavailable": "true",
"include_global_state": false,
"rename_pattern": "index_(.+)",
"rename_replacement": "restored_index_$1"
}'
說明:
- 只恢復(fù)
index_1那伐、index_2
索引,忽略快照中存在的其余索引石蔗。 -
rename_pattern
查找所提供的模式能匹配上的正在恢復(fù)的索引罕邀。 -
rename_replacement
然后把它們重命名成替代的模式。
上述命令會恢復(fù)index_1
养距、index_2
到你及群里诉探,但是重命名成了restored_index_1
、restored_index_2
棍厌。
取消快照恢復(fù):
要取消一個恢復(fù)阵具,你需要刪除正在恢復(fù)的索引。 因為恢復(fù)進(jìn)程其實就是分片恢復(fù)定铜,發(fā)送一個 刪除索引 API 修改集群狀態(tài)阳液,就可以停止恢復(fù)進(jìn)程。比如:
$ curl XDELETE 'http://192.168.2.121:9200/restored_index_3'
如果restored_index_3
正在恢復(fù)中揣炕,這個刪除命令會停止恢復(fù)帘皿,同時刪除所有已經(jīng)恢復(fù)到集群里的數(shù)據(jù)。
數(shù)據(jù)遷移
數(shù)據(jù)備份之后在共享目錄/backup中是這樣的:
- 在遷移目標(biāo)的集群上重復(fù)上面創(chuàng)建倉庫的步驟畸陡。
- 將源集群的備份內(nèi)容(/backup里的所有文件)鹰溜,復(fù)制到遷移目標(biāo)的集群倉庫目錄里。
- 在遷移目標(biāo)集群上丁恭,使用RESTful API進(jìn)行備份的恢復(fù)曹动,如果索引已經(jīng)存在目標(biāo)的集群,需要先關(guān)閉索引牲览,恢復(fù)數(shù)據(jù)后在開啟墓陈。
$ curl XPOST 'http://ip:port/index_name/_close' $ curl XPOST 'http://ip:port/_snapshot/backup_1/snapshot_name/_restore' $ curl XPOST 'http://ip:port/index_name/open'
- 查看恢復(fù)狀態(tài)
$ curl XGET 'http://ip:port/_snapshot/backup_1/snapshot_name/_status?pretty'