1 序言
Elasticsearch默認配置是數據持久化的,就是ES會定時地把緩存數據刷新到硬盤,從而達到數據持久化地效果。在生產環境中,ES的數據持久化是必須的,防止出現斷電時數據的丟失。當然,除了數據持久化外,我們也是得做到數據備份的,防止出現數據損壞時無法恢復數據的情況。
下面開始介紹ES的數據備份和恢復。
2 ES環境
在開始ES的數據備份和恢復之前,我們得確保服務器的ES環境時搭建好的,這裏就不多做介紹了,若有不懂的可以查看這篇ES入門文章瞭解下:https://blog.csdn.net/qq_15092079/article/details/81411334。
在搭建ES環境中需要注意的幾點:
- JDK的安裝配置,ES的啓動時依賴於JDK的
- 需要另外創建個用戶來啓動ES,root用戶是不能啓動ES的
- 啓動時的vm.max_map_count的報錯問題
- ES默認是隻能讓本機訪問,若需要遠程訪問還需修改文件elasticsearch.yml的network.host
- kibana數據可視化界面的安裝
3 備份數據
3.1 配置文件elasticsearch.yml
在配置文件 config/elasticsearch.yml 中添加一行數據,設置ES備份的快照數據存儲路徑。若是沒有此目錄則需要自行創建。配置好後,需要重啓ES。
path.repo: /usr/elasticsearch/snapshot
3.2 創建倉庫
其實就是在ES庫中創建一個備份存儲的目的倉庫,這裏以倉庫名稱爲 backup 爲例,有如下兩種方式。
(1)在linux服務器上執行以下命令。
curl -H "Content-Type: application/json" -XPUT http://ES的ip:端口/_snapshot/backup -d '{"type": "fs","settings": {"location": "/home/docker/back"}}'
(2)在kibana的Dev Tools開發工具中調用接口。
PUT _snapshot/backup
{
"type": "fs",
"settings": {
"location": "data_bk","compress": true,
"max_snapshot_bytes_per_sec" : "50mb",
"max_restore_bytes_per_sec" : "50mb"
}
}
調用參數說明:
compress,是否壓縮,默認爲是。
max_snapshot_bytes_per_sec,每個節點快照速率。默認40mb/s。
max_restore_bytes_per_sec,節點恢復速率。默認40mb/s。
返回結果如下,則說明創建成功。
{
"acknowledged": true
}
3.3 刪除備份數據
在備份數據之前,最好是先根據備份數據的名稱刪除原來已經備份好的數據。相同名稱的備份數據是不能重複備份的。
這裏以備份數據的名稱爲 bk_20190926 爲例,後面的執行都以此爲例,有如下兩種方式。
(1)在linux服務器上執行以下命令。
curl -XDELETE http://ES的ip:端口/_snapshot/backup/bk_20190926
(2)在kibana的Dev Tools開發工具中調用接口。
DELETE _snapshot/backup/bk_20190926
返回結果如下,則說明刪除成功。
{
"acknowledged": true
}
3.4 開始備份數據
備份數據同樣是與刪除數據一樣,直接調用ES的接口實現的,有如下兩種方式。
(1)在linux服務器上執行以下命令。
curl -XPUT http://ES的ip:端口/_snapshot/backup/bk_20190926?wait_for_completion=true
(2)在kibana的Dev Tools開發工具中調用接口。
PUT _snapshot/backup/bk_20190926?wait_for_completion=true
返回結果如下,則說明已經備份成功。
{
"snapshot": {
"snapshot": "bk_20190926",
"uuid": "K4fze5eGSvOwot_xWtz0Hw",
"version_id": 6050399,
"version": "6.5.3",
"indices": [
"first_index"
],
"include_global_state": true,
"state": "SUCCESS",
"start_time": "2019-09-27T05:36:39.398Z",
"start_time_in_millis": 1569562599398,
"end_time": "2019-09-27T05:36:39.723Z",
"end_time_in_millis": 1569562599723,
"duration_in_millis": 325,
"failures": [],
"shards": {
"total": 5,
"failed": 0,
"successful": 5
}
}
}
同時,可以在ES所在的服務器的目錄 /usr/elasticsearch/snapshot/data_bk 下查看到增加了很多文件,這些就是備份數據所需的文件。
3.5 查看備份數據
備份完數據後,直接在服務器上可以看到這些備份的文件,但是這些文件並不是一眼就能看出你備份了哪些數據的,此時你可以通過調用ES的接口來查看你備份了哪些數據。同樣有兩種方式調用。
(1)在linux服務器上執行以下命令。
curl -XGET http://ES的ip:端口/_snapshot/backup/_all
(2)在kibana的Dev Tools開發工具中調用接口。
GET _snapshot/backup/_all
返回結果如下,你備份了多少快照都可以在這裏看到,snapshots列表的最後一個元素就是你最近備份的快照。
{
"snapshots": [
{
"snapshot": "bk_20190926",
"uuid": "K4fze5eGSvOwot_xWtz0Hw",
"version_id": 6050399,
"version": "6.5.3",
"indices": [
"first_index"
],
"include_global_state": true,
"state": "SUCCESS",
"start_time": "2019-09-27T05:36:39.398Z",
"start_time_in_millis": 1569562599398,
"end_time": "2019-09-27T05:36:39.723Z",
"end_time_in_millis": 1569562599723,
"duration_in_millis": 325,
"failures": [],
"shards": {
"total": 5,
"failed": 0,
"successful": 5
}
}
]
}
4 恢復數據
數據備份好了,如果真的出現了不可逆的數據損壞情況,此時就可以進行數據恢復了。
4.1 備份data文件夾
data文件夾其實就是當前ES的數據存儲地,防止恢復數據出現異常,先把ES目錄下面的data目錄備份一下。
tar -cvf data-20190626.tar.gz data
4.2 清空數據
恢復數據之前,先把當前ES的數據清空掉。有如下兩種方式。
(1)在linux服務器上執行以下命令。
curl -XDELETE http://ES的ip:端口/_all
(2)在kibana的Dev Tools開發工具中調用接口。
DELETE _all
返回結果如下,則說明清空數據成功。
{
"acknowledged": true
}
4.3 恢復數據
恢復數據同樣有如下兩種方式操作。
(1)在linux服務器上執行以下命令。
curl -XPOST http://ES的ip:端口/_snapshot/backup/bk_20190926/_restore
(2)在kibana的Dev Tools開發工具中調用接口。
POST _snapshot/backup/bk_20190926/_restore
返回結果如下,則說明恢復數據成功。
{
"accepted": true
}
至此,ES的數據備份和恢復就介紹完啦!
5 總結
這裏只是講解了手動的操作ES的數據備份和恢復,在程序裏面我們一樣可以通過調用ES的接口來進行數據備份和恢復,例如通過java程序來定時每天進行ES地數據備份,然後刪除昨天或前天的備份數據,只保留一份或兩份備份數據,以此來節約磁盤空間。