Elasticsearch 叢集誇網路快照遷移

小川發表於2021-06-29

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 協議》,轉載必須註明作者和本文連結

相關文章