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
}