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 | |
} | |