目錄
1. 爲什麼備份?
常見的數據庫都會提供備份機制,以解決在數據庫無法使用的情況下通過備份來恢復數據減少損失。 Elasticsearch 雖然有良好的容災性,但以下原因,其依然需要備份機制:
1) 數據災備:在整個集羣無法正常工作時,可以及時從備份中恢復數據。
2) 歸檔數據:隨着數據的積累,比如日誌類的數據,集羣的存儲壓力會越來越大,不管是內存還是磁盤都要承擔數據增多帶來的壓力,此時我們往往會選擇只保留最近一段時間的數據,比如將1個月之前的數據刪除。如果不想刪除這些數據,以備後續有查看需求,那麼就可以將這些數據以備份的形式歸檔。
3) 遷移數據:當你需要將數據從一個集羣遷移到另一個集羣時,也可以用備份的方式來實現。
Elasticsearch備份兩種方式:
1) 將數據導出成文本文件,比如通過 elasticdump、esm 等工具將存儲在 Elasticsearch 中的數據導出到文件中。
2) 備份 elasticsearch data 目錄中文件的形式來做快照,藉助 Elasticsearch 中 snapshot 接口實現的功能。
第一種方式相對簡單,在數據量小的時候比較實用,當應對大數據量場景效率就顯得乏力。這裏本文着重講解下第二種備份方式,即 snapshot api 的使用。其次,備份集羣的唯一可靠方法是使用快照和還原功能。
版本兼容性:
1) 5.x中創建的索引快照可以還原爲6.x
2) 2.x中創建的索引快照可以還原爲5.x
3) 1.x中創建的索引快照可以還原爲2.x
2. 數據備份
1) 設置備份目錄
修改elasticsearch.yml
配置文件elasticsearch.yml中添加 path.repo: ["/home/gocode/app/backup/elk"],重啓ES。
創建ES數據備份的數據目錄
# mkdir -p /home/gocode/app/backup/elk
# chmod 755 /home/gocode/app/backup/elk
# chown es:es /home/gocode/app/backup/elk //給es用戶目錄權限
2) 創建倉庫(creating the repository)
備份數據之前,要創建一個倉庫來保存數據,倉庫的類型支持Shared filesystem, Amazon S3, HDFS、Azure Cloud選擇。
創建了一個備份倉庫名爲datasvr 存儲目錄爲/home/gocode/app/backup/elk 的備份倉庫。
curl -H "Content-Type: application/json" -XPUT 'http://127.0.0.1:9200/_snapshot/datasvr' -d '
{
"type": "fs",
"settings": {
"location": "/home/gocode/app/backup/elk",
"compress": true
}
}'
3) 創建快照(備份索引)
一個倉庫可以擁有同一個集羣的多個快照。在一個集羣中快照擁有一個唯一名字作爲標識。在倉庫 datasvr 中創建名字爲 snapshot_1 的快照。
#curl -H "Content-Type:application/json" -XPUT '127.0.0.1:9200/_snapshot/datasvr/snapshot_1'
備份名稱爲snapshot_1 (自行定義備份名稱)
如果只想備份部分索引的話,可以加上indices 參數:
curl -H "Content-Type:application/json" -XPUT '127.0.0.1:9200/_snapshot/datasvr/snapshot_1' -d '
{
"indices": "index_1,index_2"
}'
執行完後,查看備份數據目錄下,已經備份在備份目錄下
4) 查看倉庫信息
瀏覽器中查看備份倉庫信息
# http://172.20.32.241:9200/_snapshot/datasvr/
5) 查看倉庫存儲的所有快照
瀏覽器中查看備份倉庫某個快照信息
http://172.20.32.241:9200/_snapshot/datasvr/snapshot_1
瀏覽器中查看備份倉庫所有快照信息
http://172.20.32.241:9200/_snapshot/datasvr/_all
6) 刪除快照
# curl -X DELETE "localhost:9200/_snapshot/datasvr/snapshot_1"
7) 刪除倉庫
倉庫被註銷時,ElasticSearch 只刪除倉庫存儲快照的引用位置,快照本身沒有被刪除並且在原來的位置
# curl -X DELETE "localhost:9200/_snapshot/datasvr"
集羣備份恢復:
注意: 以上是單機的備份方法,集羣的備份恢復方法和單機模式一樣,只不過需要增加一個集羣共享目錄用來存放備份數據,使所有節點可訪問。
1) 配置集羣共享目錄
# yum install sshfs
2) 創建集羣共享目錄,並將各節點備份目錄掛載到共享目錄
創建集羣共享目錄
# mkdir -p /home/backup/elk_share
共享目錄掛載
# sshfs [email protected]:/home/backup/elk_share /home/backup/elk -o allow_other
3) 數據備份恢復與單機備份恢復一樣,參考單機備份恢復
3. 數據恢復
# curl -H "Content-Type:application/json" -XPOST '127.0.0.1:9200/_snapshot/datasvr/snapshot_1/_restore'
用過head插件查看,數據已經恢復:
4. ES備份數據遷移目標服務器
1) 源數據備份
參考以上第二步
2) 源數據備份目錄拷貝目標ES備份目錄下
注意:這裏爲了方便,源備份目錄和目標備份目錄一致。
3) 目標ES機器創建源ES同名倉庫
4) 目標ES查看快照
5) 目標ES執行恢復操作
5. 腳本備份恢復
將用到的api封裝成shell腳本進行備份恢復操作較爲方便,後續有時間在補充。