腦補一下,如果你遇到上述問題,你一般怎麼解決?
2、問題分析
上述問題涉及到叢集備份、索引資料備份、資料遷移、資料恢複等問題,而資料備份和恢複又分為:
1、ES Mapping&Setting 基礎資訊備份。
2、ES 全量資料備份。
3、ES 增量資料備份。
4、ES 資料恢複。
3、常見備份和恢複索引/叢集方案
方案一:使用ES的快照和恢複功能進行備份和恢複。
該方案适用于:叢集整體備份與遷移,包括:全量、增量貝恩和恢複。
方案二:使用elasticdump遷移Mapping和資料。
該方案适用于:索引層面遷移資料或Mapping,支援:analyzer/Mapping/data的遷移操作。
相比于:reindex跨叢集操作,elasticdump無需在ES叢集的配置檔案elasteicsearch.yml中設定授權遷移通路位址(白名單)。
方案三:使用reindex實行叢集内部或跨叢集同步資料。
該方案适用于:本地索引更新Mapping實作索引層面遷移,或者跨叢集的索引遷移。
缺點:如前所述,跨叢集遷移需要elasticsearch.yml中加上ip白名單。
4、直接拷貝檔案能不能實作叢集備份呢?
官方文檔指出:你不能僅通過擷取叢集所有節點的資料目錄副本來備份Elasticsearch叢集。 Elasticsearch可能在運作時對其資料目錄的内容進行更改; 複制其資料目錄不能達到捕獲其内容的一緻快照的預期。
如果嘗試通過拷貝檔案備份還原叢集,将會導緻失敗,會封包件損壞或丢失檔案的錯誤。 或者,看似成功了,但卻丢失了一些資料。
備份叢集的唯一可靠方法是使用快照和還原功能。
5、方案一:Elasticsearch快照和還原功能
5.1 快照注意事項
1、快照是從正在運作的Elasticsearch叢集中擷取的備份。
2、您可以建立單個索引或整個群集的快照,支援本地檔案存儲,以及遠端第三方存儲庫存儲(包括:S3,HDFS,Azure,Google Cloud Storage等)。
3、快照是增量建立的。這意味着,當建立索引快照時,Elasticsearch避免複制任何已存儲在存儲庫中的資料作為同一索引的早期快照的一部分。是以,可以非常頻繁地為叢集建立快照。
4、如果您的叢集啟用了Elasticsearch安全功能,則在備份資料時,必須授權快照API調用。
5、在更新之前備份資料時,請記住,如果快照中包含與更新版本不相容的版本中建立的索引,則可能導緻更新後将無法還原快照。
6、相容清單如下:
在1.x中建立的索引快照可以恢複到2.x。
在2.x中建立的索引快照可以恢複到5.x。
在5.x中建立的索引快照可以恢複到6.x。
在6.x中建立的索引快照可以恢複到7.x。
反例:無法将在1.x中建立的索引快照還原到5.x或6.x,無法将在2.x中建立的索引快照還原到6.x或7.x,以及無法将在5.X建立的索引快照還原到7.x。
7、要保證還原的叢集有足夠的存儲容量。
5.2 快照執行步驟
以下操作在windows10單節點叢集環境ES7.2 Kibana7.2上執行,linux原理一緻。
5.2.1 步驟1:配置快照存儲路徑及注冊快照存儲庫
在elasticsearch中添加如下配置:
path.repo: ["D:\\install\\elasticsearch-7.2.0-windows-x86_64\\elasticsearch-7.2.0\\backup"]
1
注冊快照存儲庫(即設定存儲路徑)
PUT /_snapshot/my_backup
{
"type": "fs",
"settings": {
"location": "D:\\install\\elasticsearch-7.2.0-windows-x86_64\\elasticsearch-7.2.0\\backup"
}
}
2
3
4
5
6
7
5.2.2 步驟2: 拍攝快照
步驟2.1:全量備份——拍攝叢集快照
想象成拍照的點選确認的那一刻。
PUT /_snapshot/my_backup/snapshot_cluster?wait_for_completion=true
執行傳回結果核心包括:
快照索引資訊
快照執行起始時間、持續時間
成功、失敗分片數等
步驟2.2:按需備份——拍攝索引快照
PUT /_snapshot/my_backup/snapshot_hamlet_index?wait_for_completion=true
"indices": "hamlet_*",
"ignore_unavailable": true,
"include_global_state": false,
"metadata": {
"taken_by": "mingyi",
"taken_because": "backup before upgrading"
8
9
10
步驟2.3 增量備份——同步驟2.1
假設ES有實時資料持續寫入,不同時間點會生成不同的快照。
步驟2.1, 2.2, 2.3 非串行執行,可以按需選擇執行即可。
5.2.3 步驟3:恢複快照
步驟3.1 恢複索引快照
為驗證效果,我們先執行了删除索引操作。
DELETE hamlet_*
POST /_snapshot/my_backup/snapshot_hamlet_index/_restore
執行成功後傳回:
"accepted" : true
步驟3.2 恢複叢集快照
為驗證效果,我們先執行了 DELETE * 删除全部索引(實際線上環境注意規避風險)
POST /_snapshot/my_backup/snapshot_cluster/_restore
5.3 快照常見操作
1、檢視所有快照存儲庫
GET /_snapshot/_all
2、檢視快照狀态
GET /_snapshot/my_backup/snapshot_hamlet_index/_status
3、删除快照
DELETE /_snapshot/my_backup/snapshot_hamlet_index
6、方案二:elasticdump遷移
同mysql dump功能,嚴格講elasticdump有導入、導出資料的功能。
背景:
192.168.1.1:9200 遷移源叢集,
192.168.3.2:9200 遷移目的叢集。
6.1 遷移Setting和Mapping等
elasticdump \
--input=http://192.168.1.1:9200/my_index \
--output=http://192.168.3.2:9200/my_index \
--type=analyzer
--type=settings
--type=mapping
11
12
6.2 遷移資料
--type=data
細節參見:
https://github.com/taskrabbit/elasticsearch-dump7、最常見問題
7.1 多節點叢集如何配置才能實作快照?
第一:建立共享檔案系統:如NFS共享,确定每一個節點挂載到指定路徑,才能建立快照存儲庫。
第二:在所有的主節點、資料節點都要配置相同的path.repo。
7.2 相同名稱索引存在的情況下執行恢複快照?
會報錯如下:
英文reason裡面已經給出解決方案。
"error": {
"root_cause": [
{
"type": "snapshot_restore_exception",
"reason": "[my_backup:snapshot_cluster/_THlX1vMQvGmwxcRCmhnlA] cannot restore index [.kibana_task_manager] because an open index with same name already exists in the cluster. Either close or delete the existing index or restore the index under a different name by providing a rename pattern and replacement name"
}
],
8、小結
本文依然比較基礎,實戰出真知。