Elasticsearch版本
- 源:Elasticsearch 7.2.0
- 目標:Elasticsearch:7.13.2
叢集結構及伺服器配置
- 源:叢集3節點,對應3臺伺服器(2核16G/500G/臺)
- 目標:叢集3節點,對應3臺伺服器(2核16G/1T/臺)
叢集資料量及遷移時間
- 主分片 + 1副本 = 500G,主分片250G,快照只備份主分片;
- 阿里雲使用阿里雲物件儲存
內網備份
:第一次全量快照備份30分鐘,後續增量備份3分鐘左右;- Google雲使用阿里雲物件儲存
跨網路恢復
:第一次全量快照恢復1小時30分鐘,後續增量備份5分鐘左右;
注意:由於 Elasticsearch 7.2.0 版本 repository-s3
對阿里雲OSS不相容,購買阿里雲端儲存閘道器(使用NFS掛載方式掛載OSS)
- 阿里雲OSS基於安全考慮,僅支援 Virtual hosted style 模式訪問;
- 在 Elasticsearch 7.0、7.1、7.2 和 7.3 版本中,repository-s3 外掛只能使用 Path style 模式訪問物件儲存庫;
- 從 Elasticsearch 7.4 版開始,repository-s3 外掛預設使用 Virtual hosted style 模式訪問物件儲存庫,可以在建立倉庫時新增引數
path_style_access: true
使用 Path style 模式。
一、共享檔案儲存庫
準備工作
- 購買共享磁碟,用於儲存快照資料(需大於遷移資料)
- 或者購買物件儲存庫+雲端儲存閘道器,相容共享檔案方式
叢集每個節點掛著共享磁碟
# 新建掛載目錄
mkdir /mnt/esdata
# 掛載共享磁碟
mount.nfs 172.16.0.2:/esdata /mnt/esdata
在 elasticsearch.yml
檔案中新增配置
# 共享磁碟路徑
path.repo: /mnt/esdata
# 該配置必須在叢集中的每個節點上設定,設定後必須重新啟動每個節點。
重啟叢集每個節點(資料節點優先,主節點最後)
# 禁止分片自動分佈
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "primaries"
}
}
# 執行同步重新整理
POST _flush/synced
# 關閉一個節點
ps aux|grep elasticsearch
kill pid
# 啟動關閉的節點
/etc/init.d/elasticsearch start
# 啟用分片自動分佈
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": null
}
}
# 執行同步重新整理,等待全部分片重新加入叢集
POST _flush/synced
# 對叢集中每個節點重複以上操作,完成叢集全部節點重啟;
# 注意:ES叢集對外訪問使用負載均衡,該重啟方式不會影響線上業務執行。
建立快照倉庫,並驗證是否包含每個節點
# 建立快照倉庫
PUT /_snapshot/倉庫名
{
"type": "fs",
"settings": {
"location": "/mnt/esdata", # 筆者OSS掛載目錄
"max_snapshot_bytes_per_sec": "200mb", # 調整快照建立的速度,預設 40mb
"max_restore_bytes_per_sec": "200mb" # 調整快照恢復的速度,預設無限制
}
}
# 驗證快照倉庫
POST /_snapshot/倉庫名/_verify
# 檢視所有倉庫
GET _snapshot/_all
# 刪除快照倉庫
DELETE _snapshot/倉庫名
二、物件儲存庫(repository-s3
)
準備工作
- 購買物件儲存,用於儲存快照資料(本次遷移使用
阿里雲物件儲存OSS
,相容AWS S3
)
1. 源
叢集快照備份
叢集每個節點安裝 repository-s3
外掛
# 進入ES安裝目錄
cd /elastic/elasticsearch
# 切換到 elastic 使用者
su elastic
# 安裝外掛
bin/elasticsearch-plugin install repository-s3
# 該外掛必須安裝在叢集中的每個節點上,安裝後必須重新啟動每個節點。
重啟叢集每個節點(資料節點優先,主節點最後)
# 禁止分片自動分佈
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "primaries"
}
}
# 執行同步重新整理
POST _flush/synced
# 關閉一個節點
ps aux|grep elasticsearch
kill pid
# 啟動關閉的節點
/etc/init.d/elasticsearch start
# 啟用分片自動分佈
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": null
}
}
# 執行同步重新整理,等待全部分片重新加入叢集
POST _flush/synced
# 對叢集中每個節點重複以上操作,完成叢集全部節點重啟;
# 注意:ES叢集對外訪問使用負載均衡,該重啟方式不會影響線上業務執行。
叢集每個節點新增 repository-s3
金鑰
# 切換到 elastic 使用者
su elastic
# 新增 access_key,回車後輸入祕鑰key
bin/elasticsearch-keystore add s3.client.default.access_key
# 新增 secret_key,回車後輸入祕鑰字串
bin/elasticsearch-keystore add s3.client.default.secret_key
# 過載祕鑰配置
POST _nodes/reload_secure_settings
# 檢視祕鑰列表
bin/elasticsearch-keystore list
建立快照倉庫,並驗證是否包含每個節點
# 建立快照倉庫
PUT _snapshot/倉庫名
{
"type": "s3",
"settings": {
"endpoint": "oss-cn-shenzhen.aliyuncs.com", # OSS節點
"bucket": "es", # bucket名稱
"base_path": "esdata", # 快照檔案所在路徑
"max_snapshot_bytes_per_sec": "200mb", # 調整快照建立的速度,預設 40mb
"max_restore_bytes_per_sec": "200mb" # 調整快照恢復的速度,預設無限制
}
}
# 驗證快照倉庫
POST /_snapshot/倉庫名/_verify
# 檢視所有倉庫
GET _snapshot/_all
# 刪除快照倉庫
DELETE _snapshot/倉庫名
建立快照,並檢視快照備份狀態
# 建立快照
PUT /_snapshot/倉庫名/快照名
{
"indices": "index_*", # 需要備份的表名,支援萬用字元
"ignore_unavailable": true, # 忽略indices丟失或關閉的資料流和索引
"include_global_state": true # 備份全域性設定,全量備份為true,增量備份為false
}
# 檢視快照狀態
GET _snapshot/倉庫名/快照名/_status
GET _snapshot/倉庫名/快照名
# 查倉庫下所有快照
GET _snapshot/倉庫名/_all
# 刪除快照
DELETE _snapshot/倉庫名/快照名
# 多次備份“快照名”不能重複;同一倉庫下,第一次快照為全量備份,後續快照都是增量備份。
2. 目標
叢集快照還原
叢集每個節點安裝 repository-s3
外掛
# 進入ES安裝目錄
cd /elastic/elasticsearch
# 安裝外掛
sudo bin/elasticsearch-plugin install repository-s3
# 該外掛必須安裝在叢集中的每個節點上,安裝後必須重新啟動每個節點。
# 注意:因為是新叢集,還未線上執行,所以可以直接重啟所有節點。
叢集每個節點新增 repository-s3
金鑰
# 新增 access_key,回車後輸入祕鑰key
bin/elasticsearch-keystore add s3.client.default.access_key
# 新增 secret_key,回車後輸入祕鑰字串
bin/elasticsearch-keystore add s3.client.default.secret_key
# 過載祕鑰配置
POST _nodes/reload_secure_settings
# 檢視祕鑰列表
bin/elasticsearch-keystore list
建立快照倉庫,並驗證是否包含每個節點
# 建立快照倉庫【只讀】
PUT _snapshot/倉庫名
{
"type": "s3",
"settings": {
"endpoint": "oss-cn-shenzhen.aliyuncs.com", # OSS節點
"bucket": "es", # bucket名稱
"base_path": "esdata", # 快照檔案所在路徑
"max_snapshot_bytes_per_sec": "200mb", # 調整快照建立的速度,預設 40mb
"max_restore_bytes_per_sec": "200mb", # 調整快照恢復的速度,預設無限制
"readonly": true # 恢復建議設定為只讀,避免誤操作
}
}
# 驗證快照倉庫
POST /_snapshot/倉庫名/_verify
調整叢集恢復分片速度和併發數
# 修改叢集配置
PUT _cluster/settings
{
"transient": {
"indices.recovery.max_bytes_per_sec": "200mb", # 恢復時每秒位元組數限制
"cluster.routing.allocation.node_concurrent_recoveries": "3" # 分片恢復併發數,不宜設定過大,否則容易死鎖
}
}
# 檢視叢集配置(包括預設配置)
GET _cluster/settings?flat_settings&include_defaults
檢視倉庫所有快照,按順序恢復快照備份
# 查倉庫下所有快照
GET _snapshot/倉庫名/_all
# 恢復快照(恢復整個快照)
POST /_snapshot/倉庫名/快照名/_restore
{
"include_global_state": true, # 恢復全域性設定,全量備份為true,增量備份為false
"index_settings": {
"index.number_of_replicas": 0 # 關閉副本節約時間
}
}
# 恢復快照(部分恢復快照)
POST /_snapshot/倉庫名/快照名/_restore
{
"indices": "index_1,index_2", # 部分恢復需索引不存在,或自動重新命名為新索引(原索引不受影響)
"index_settings": {
"index.number_of_replicas": 0 # 關閉副本節約時間
},
"rename_pattern": "index_(.+)",
"rename_replacement": "restored_index_$1",
"include_aliases": false
}
# 關閉索引(快照增量恢復前需關閉索引)
POST index_*/_close
# 開啟索引(快照恢復後會自動開啟索引,也可以手動開啟)
POST index_*/_open
# 檢視恢復狀態
GET /_cat/recovery?active_only
所有快照恢復完成後,增加索引副本
PUT index_*/_settings
{
"index.number_of_replicas": 1
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結