1、問題引出
ES中文社區中,有如下問題:
-
問題1:存儲數據,data目錄從一個機器直接移到一臺新的機器是否可以直接使用?
-
問題2:es升級時,data目錄如果在外部路徑,從低版本升級到高版本時,data目錄是否直接可以使用?
-
問題3:將一箇舊的es數據(400多G)遷移到新的es中的時候直接將舊es的data目錄下indices文件拷貝到新es的data下(大概花了一個晚上),這種做法是否可取?
腦補一下,如果你遇到上述問題,你一般怎麼解決?
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"]
- 註冊快照存儲庫(即設置存儲路徑)
PUT /_snapshot/my_backup
{
"type": "fs",
"settings": {
"location": "D:\\install\\elasticsearch-7.2.0-windows-x86_64\\elasticsearch-7.2.0\\backup"
}
}
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"
}
}
步驟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
elasticdump \
--input=http://192.168.1.1:9200/my_index \
--output=http://192.168.3.2:9200/my_index \
--type=settings
elasticdump \
--input=http://192.168.1.1:9200/my_index \
--output=http://192.168.3.2:9200/my_index \
--type=mapping
6.2 遷移數據
elasticdump \
--input=http://192.168.1.1:9200/my_index \
--output=http://192.168.3.2:9200/my_index \
--type=data
細節參見:https://github.com/taskrabbit/elasticsearch-dump
7、最常見問題
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、小結
本文依然比較基礎,實戰出真知。