Elasticsearch 集群夸网络快照迁移

IT知识
398
0
0
2022-05-05
标签   Elasticsearch

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
}