文档中心>Elasticsearch Service>实践教程>自建/其他云厂商集群迁移>腾讯云 Elasticsearch 集群迁移之 Snapshot 方案

腾讯云 Elasticsearch 集群迁移之 Snapshot 方案

最近更新时间:2024-11-11 09:12:22

我的收藏
本文介绍了通过快照的方式迁移 ES 集群数据到腾讯云 ES,如果需要迁移数据到腾讯云 Serverless 服务,请参见 迁移方案说明

迁移目标/范围

腾讯云 ES 是基于开源引擎打造的云端全托管 ELK(ES/Logstash/Kibana)服务,拥有高性能自研内核、支持读写分离、存算分离、自治索引、机器学习等能力,同时也支持自动弹性、零运维、低成本的 Serverless 版,被广泛应用于日志分析、在线搜索、向量检索与 RAG(检索增强生成)等场景。
本方案将详细介绍迁移流程、迁移步骤以及注意事项等方面的内容。通过本方案,用户可以在保证数据完整性、安全性和高效性的前提下,无需进行大规模业务改造,即可顺利平滑完成迁移过程。
迁移目标
迁移方案优点
腾讯云 ES 相对其他日志产品优点
自建 ES(ELK)> 腾讯云 ES
ES 业务无需大范围改造
ES 迁移支持全量/增量
支持在线不停服迁移(部分场景)
自研特性优化,助力客户降本增效
支持多级存储,热 > 冷 > COS 标准/低频/归档存储
功能丰富,包括日志/指标/APM/告警等全观测能力
完全兼容 ELK(ES/Logstash/Kibana),保留原有权限、报表、使用习惯
友商云 ES(ELK)> 腾讯云 ES
友商云 Opensearch > 腾讯云 ES

方案简介

ES 迁移主推 Snapshot 方案,如有其他特殊场景,可参考 Logstash 及在线融合方案。具体方案对比如下:
迁移方案
适用场景
适用产品
停服割接时间
增量
更新
删除
清洗
方案实施
Snapshot
可接受短暂停服,对迁移速度有要求的场景
自建 ES
AWS/阿里/华为云 ES
通过多次增量快照,保证大部分场景下停服时间<=20min
可以根据文档自助迁移
Logstash
源端版本 > 目标端时,或迁移过程中需要定制化改造的场景
AWS 云 Opensearch
华为云 Opensearch
AWS/阿里/华为云 ES
Logstash 方案需全程停服,停服时间与集群资源性能、专线带宽等因素有关
可以根据文档自助迁移
(腾讯云 ES 特有)
在线不停服迁移
自建 ES
无需停服
需腾讯云 ES 后台配合

概述

本迁移方案旨在为用户提供一种从自建 ES 或友商云 ES 迁移到腾讯云 ES 的实践教程。本方案将详细介绍使用 Snapshot 快照方案的迁移流程、迁移步骤以及注意事项等方面的内容。通过本方案,用户可以在保证数据完整性、安全性和高效性的前提下,顺利完成迁移过程。

方案概览

从自建 ES 迁移至腾讯云 ES 集群方案概览:

从友商云 ES 迁移至腾讯云 ES 集群方案概览:




准备工作

账号开通

客户需要开通一个 腾讯云账号

网络打通

客户的 ES 集群需要有一条能访问腾讯云服务的专线网络或 VPN。
专线:专线接入
注意:
数据迁移务必使用内网,否则默认会走公网进行数据传输,公网传输存在数据泄漏风险和潜在危险。

存储桶购买

注意:
需要购买和腾讯云 ES 同地域的 COS 存储桶。
AWS Opensearch 仅支持 Logstash 方案。
ES 集群源平台
备份仓库
目标仓库
自建ES
COS
COS(与源端同仓库)
阿里云 ES 集群
OSS
COS
华为云 ES 集群
OBS
COS
AWS 云 ES 集群
S3
COS

ES 集群创建

前置确认

确认 ES 集群搭建前基础信息

信息编号
确认信息
确认值(此列需要客户确认)
备注
1
区域
华南地区-广州
ES 集群所在的区域
2
产品版本
ES 7.14.2
ES 集群版本
全文检索建议7.14.2,向量检索推荐8.13.3
3
组件种类
es,logstash,filebeat
ES 集群需要包含的组件
4
鉴权
不开启
白金版不支持关闭鉴权,非白金版支持开启/关闭(需提工单支持)
5
业务场景
全文检索,向量检索
根据业务场景决定集群版本
全文检索建议<=7.14.2,向量检索推荐>8
6
集群网络&可用区
集群网络举例:Default-VPC
子网举例:Default-subnet
集群所在的 VPC,和可用区子网需要提前规划好
有容灾需求可选择多可用区,节点将均匀分布在所选择的多个可用区,可用节点总量不变
7
安全组
安全组举例:sg-xxxx
ES 集群安全组,如需关联安全组,可在集群创建后进行关联

确认 ES 集群资源配置

生产环境的规格参考实际的 ES 业务需求,有特殊机型要求的,需提早申请,以便腾讯侧备货,腾讯云建议基础的 ES 生产环境配置如下:
节点类型
节点说明
推荐配置
节点数量
热数据层
默认节点类型,可搭配温数据层实现冷热分离架构;
数据写入层。通常将经常查询的数据放置在热层,以提升查询与写入效率。
标准型 S1
CPU:8核 内存:32GB
数据盘:
增强型 SSD 云硬盘 500G x 3
N
温数据层
可选节点,支持仅开启温数据层,也可搭配热数据层实现冷热分离架构;
将访问频率较低且更新频率较低的数据存放在温层,以节约成本。非必要,有冷热分层需求才需要开启。
标准型 S1
CPU:4核 内存:16GB
数据盘:
高性能云硬盘 1000G x 3
N
专用主节点
可选节点,建议10节点以上或分片规模>5000时启用;
管理节点,保证集群的调度正常进行。非必要,默认所有数据节点都是候选主节点。当集群节点数>10 或 数据量较大时建议选购专用主节点。
标准型 S1
CPU:4核 内存:16GB
3
协调节点
可选节点,默认所有数据节点都是协调节点。建议有特殊需求时候启用;
协调节点只用于处理客户端请求,不存储数据,能够提升集群处理性能和服务稳定性,适用于高并发读写、多聚合查询等 CPU 密集型业务场景。
标准型 S1
CPU:4核 内存:16GB
N
机器学习节点
可选节点,有推理需求时启用;
机器学习节点用于创建机器学习任务,自动进行数据分析,识别异常数据。也可在此节点加载向量模型,提升向量生成和向量检索能力。
标准型 S1
CPU:16核 内存:32GB
N
Kibana 节点
默认开启,用于数据可视化,1核2G规格免费,支持购买更高规格。
标准型 S1
CPU:1核 内存:2GB
1

集群购买

购买腾讯云 ES 集群,请参见 创建集群

插件安装及词典上传(必要)

在进行数据迁移前,需要确认索引是否使用自定义插件及自定义词典,如果有则需要在云上 ES 集群同步,否则相关索引数据恢复无法成功。

插件查询

使用下面命令查询自建集群使用的插件:

curl -s -uelastic:'源端集群密码' 'http://源端IP:9200/_cat/plugins?h=component,version' | sort | uniq

插件安装

腾讯云 ES 支持的插件列表及插件安装可以参考 腾讯云 Elasticsearch Service 插件列表,如果有另外的自定义插件需要安装可以提工单联系腾讯云侧使用此功能。




词典查询

自定义词典查询

PUT _snapshot/my_backucurl -s -uelastic:'源端集群密码' 'http://源端IP:9200/_settings?pretty' | grep "_path"
自定义词典查询流程图



IK 分词/停用词词典查询
# 进入到ES主目录,$ES_HOME需替换成实际目录 cd /$ES_HOME/config/analysis-ik # 进入ik词典目录下,查看配置文件 cat IKAnalyzer.cfg.xml
未配置任何 ik 词典则默认内容如下,无需更新 ik 词典。如自定义了 ik 词典,则需上传至腾讯云 ES。




词典上传

同义词词典更新
进入 腾讯云 ES 控制台 > ES 集群管理 > ES 实例 > 高级配置界面,单击更新词典,上传自定义词典,配置索引属性即可使用。



IK 分词/停用词词典更新
进入 腾讯云 ES 控制台 > ES 集群管理 > ES 实例 > 插件列表界面,选择 IK 插件单击更新词典,上传分词词典后即可。







数据迁移

方案介绍

snapshot api 是 ES 提供的一组用于索引数据快速备份及恢复的 api 接口,详细介绍可查看官方文档,利用该组 api 接口,我们可以通过将源 ES 集群的数据备份到远程仓库,再在腾讯云 ES 集群上从远程仓库中通过快照恢复的方式来实现跨集群的离线数据迁移。



详情请参见 快照版本关系说明

关于快照迁移的版本限制:

快照备份/恢复功能只支持5.x以上。
目标 ES 集群的版本号要大于等于源 ES 集群的版本号。例如,客户的源端集群版本号为6.4.3,则腾讯云 ES 集群的版本需>= 6.4.3。
目标 ES 集群主版本不能超过源端 ES 集群两个及以上的版本。例如6.x的集群只能恢复到7.x上,再恢复到8.x,不能直接恢复到8.x。

适用场景:

snapshot 迁移适用于集群规模较大、索引个数比较多的场景。

迁移流程介绍:

序号
迁移步骤
详细说明
1
元数据迁移
使用同步工具进行元数据迁移,包括:
模板迁移
管道迁移
权限迁移
2
全量备份
备份期间业务无明显感知,一般建议在业务低峰进行;
自建 ES 迁移:直接备份到 COS 进行恢复;
友商云 ES 迁移,备份到友商对象存储(OBS/OSS/S3),然后通过 MSP 工具迁移到 COS 进行恢复;
备份/恢复速度与专线带宽、集群负载有关。
3
全量恢复
4
增量备份
需多次执行,保证最短割接窗口;
除最后一次增量备份外,其他增量备份场景业务无明显感知,一般建议在业务低峰进行;
最后一次增量备份/恢复需要停服进行,通过多次增量备份/恢复,保证大部分场景下停服时间<=20min。
5
增量恢复
6
数据一致性校验
数据同步完成后,可以通过 docs.count 来校验数据一致性。

用户及角色迁移

如需迁移用户及权限,可使用工具一键迁移:
rpm -vih https://tools-release-1253240642.cos.ap-shanghai.myqcloud.com/elasticsearch/packages/es-security-sync-lastest.x86_64.rpm
或下载后上传再使用 rpm 安装:
rpm -vih es-security-sync-lastest.x86_64.rpm
说明:
security 功能 ES 6 版本才开始支持,ES 8 的 security 索引不允许修改。所以仅支持 6 到 7,以及 7 到 6 的迁移。

迁移示例

es-security-sync \\ --src_url http://10.0.xx.xx:9200 \\ --dst_url http://10.0.xx.xx:9400 \\ --src_user log_user \\ --dst_user log_user \\ --src_password ****** \\ --dst_password ******

索引模板迁移

索引模板为 ES 业务使用中最常用的功能,在迁移前务必先同步索引模板。模板迁移使用工具一键迁移即可:
rpm -vih https://tools-release-1253240642.cos.ap-shanghai.myqcloud.com/elasticsearch/packages/es-template-cp-lastest.x86_64.rpm
或下载后上传再使用 rpm 安装:
rpm -vih es-template-cp-lastest.x86_64.rpm

迁移示例

es-template-cp \\ --src_url http://源ES IP:9200 \\ --dst_url http://腾讯云ES IP:9200 \\ --src_password '******' \\ --dst_password '腾讯云ES密码'

集群管道迁移(按需操作)

ES 管道迁移使用工具一键迁移即可。
#下载jar包 #运行环境: JDK-1.8 wget https://tools-release-1253240642.cos.ap-shanghai.myqcloud.com/elasticsearch/packages/CopyPipelines.jar

示范样例

注意:
任何参数不要空缺,无密码集群可指定任意密码。
样例一
源端,目标端,集群带密码,跳过目标端已存在的同名管道。
java -jar CopyPipelines.jar http://源ES IP:9200 elastic '源端ES密码' http://腾讯云ES IP:9200 elastic '腾讯云ES密码' skip
样例二
源端,目标端,集群带密码,覆盖目标端已存在的同名管道。
java -jar CopyPipelines.jar http://源ES IP:9200 elastic '源端ES密码' http://腾讯云ES IP:9200 elastic '腾讯云ES密码' overwrite

安装 COS 插件(该步骤为自建 ES,友商云 ES 可跳过)

1. 创建快照前需要先注册仓库,一个仓库可以存储多个数据快照文件。快照存放于 腾讯云 COS 对象存储 中,以插件形式支持,需要安装插件。
2. 其中 COS 插件的 GitHub 地址:elasticsearch-repository-cos releases,根据自建版本下载对应版本的 COS 插件包。对于 GitHub 上没有的版本,可以通过 提交工单 进行索要。
3. 从客户自建 ES 集群中迁移到腾讯云 ES,我们可以直接使用 COS 进行迁移,如果客户集群没有安装过 COS 插件,则需要先安装 COS 插件,必须使用 ES 运行用户执行,且所有节点都需要安装:
bin/elasticsearch-plugin install file:///tmp/elasticsearch-cos-x.x.zip



4. 所有节点安装并滚动重启完成后,执行 cat api 查看插件情况:
curl -s -uelastic:'源端密码' 源端IP:9200/_cat/plugins?h=component,version | grep "repository-cos" | uniq -c
5. 查看节点数:
curl -s -uelastic:'源端密码' 源端IP:9200/_cat/nodes | wc -l
6. 在返回结果中确认 COS 插件个数是否为总节点个数,否则代表有节点未重启或未安装插件。

注意:
插件 zip 包无需解压,直接安装即可。
安装时指定的 file:/// 协议是三条斜杠,其中前面两个 // 是协议与路径的分隔符,后面一个 / 是绝对路径开头的根目录。
待安装的插件zip包不可放在es目录下,可以放在/tmp或者家目录,否则可能会安装失败。
执行安装命令时,不可位于 es bin/ 路径下,需要在 es bin/ 路径外面执行,否则可能会安装失败。

ES 集群注册快照仓库

自建 ES(友商/腾讯云/IDC)

打通 COS 内网(必要)

前提条件
自建 ES 在注册快照仓库前,有如下必要操作。
1. 参考文档,打通 COS 内网 内网访问 COS 操作步骤-V2.0,并配置好 hosts 解析。
2. 测试 COS 内网解析,例如 ping。
3. 重启自建 ES 所有节点。
该步骤务必使用内网,否则默认会走公网进行数据传输,公网传输存在数据泄露风险和潜在危险。
4. COS 内网打通并重启ES后,即可开始如下操作:
4.1 获取 access 密钥信息:登录 API 密钥管理控制台,调用 snapshot 的 api 注册 repository 仓库,cos snapshot API 需要区分 ES<8.x 和 ES>=8.x。
4.2 region 参数说明:请参见 Elasticsearch Service 地域参数
ES 集群版本低于8.0注册方式为:
PUT _snapshot/my_backup { "type": "cos", "settings": { "app_id": "xxxxxxx", "access_key_id": "xxxxxx", "access_key_secret": "xxxxxxx", "end_point": "cos-internal.ap-guangzhou.tencentcos.cn", //需替换成实际region,例如ap-shanghai "bucket": "xxxxxx", // cos bucket后面生成的 -appid 不可以填进来 "region": "ap-guangzhou", //需替换成COS桶所在region,例如ap-shanghai "base_path": "my_backup", "max_restore_bytes_per_sec":"40m", // 每个节点的恢复速率,可按需调整,建议最大不超过200 "max_snapshot_bytes_per_sec":"40m", // 每个节点的备份速率,可按需调整,建议最大不超过200 "compress": true, "chunk_size": "500mb" } }
ES 集群版本高于等于8.0注册方式为:
PUT _snapshot/my_backup { "type": "cos", "settings": { "cos": { "client": { "app_id": "xxxxxxx", "access_key_id": "xxxxxx", "access_key_secret": "xxxxxxx", "end_point": "cos-internal.ap-guangzhou.tencentcos.cn", //需替换成实际region,例如ap-shanghai "bucket": "xxxxxx", "region": "ap-guangzhou", //需替换成COS桶所在region,例如ap-shanghai "base_path": "my_backup" } }, "max_restore_bytes_per_sec": "40m", // 每个节点的恢复速率,可按需调整,建议最大不超过200 "max_snapshot_bytes_per_sec": "40m", // 每个节点的备份速率,可按需调整,建议最大不超过200 "compress": true, "chunk_size": "500mb" } }
返回 true 即为注册成功,友商云 ES 也同理




阿里云 ES

调用 snapshot 的 api 创建 repository 仓库。
PUT _snapshot/my_backup/ { "type": "oss", "settings": { "endpoint": "http://xxx.aliyuncs.com", // oss 的 Endpoint 地址 "access_key_id": "xxxx", // 用户密钥,可通过控制台右上角的头像获取——“AccessKey 管理” "secret_access_key": "xxxxxx", // access_key "bucket": "xxxxxx", // bucket name,创建 bucket 时的命名 "compress": true, // 是否压缩源数据大小 "chunk_size": "500mb", // 数据分块大小 "base_path": "my_backup", // 仓库起始路径 "max_restore_bytes_per_sec":"40m", // 每个节点的恢复速率,可按需调整 "max_snapshot_bytes_per_sec":"40m" // 每个节点的备份速率,可按需调整 } }

华为云 ES

调用 snapshot 的 api 创建 repository 仓库。
PUT _snapshot/my_backup/ { "type": "obs", "settings": { "endpoint": "obs.xxx.myhuaweicloud.com", // obs 的 Endpoint 地址 "access_key": "xxxx", // 用户密钥,可通过控制台右上角的头像获取——"我的凭证"——"访问密钥" "secret_key": "xxxxxx", // secret_key "bucket": "xxxxxx", // bucket name,创建 bucket 时的命名 "compress": true, // 是否压缩源数据大小 "chunk_size": "500mb", // 数据分块大小 "base_path": "my_backup", // 仓库起始路径 "max_restore_bytes_per_sec":"40m", // 每个节点的恢复速率,可按需调整 "max_snapshot_bytes_per_sec":"40m" // 每个节点的备份速率,可按需调整 } }

AWS 云 ES

1. 创建 IAM 角色。
2. 创建 AWS 云 ES 仓库。
3. 调用 snapshot 的 api 创建 repository 仓库。
PUT _snapshot/my_backup { "type": "s3", "settings": { "bucket": "s3-bucket-name", "base_path": "my/snapshot/directory", "region": "region", "role_arn": "arn:aws:iam::账号ID:role/TheSnapshotRole" } }

源端 ES 集群执行创建快照

将源端 ES 集群的索引数据备份到 COS 的 my_backup 仓库下,命名为:snapshot_1。
PUT _snapshot/my_backup/snapshot_1 { "indices":"*,-.*,-ilm-*" }

Body 内容解释

indices 值
含义
*
所有索引
-.*
排除所有以 . 开头的索引,例如,系统索引
-ilm-*
排除所有以 ilm- 开头的索引,例如,索引生命周期系统索引
当备份索引数据较少时,执行完上面的命令后会立即返回,当备份索引数量较大时,该 api 大概率会超时,但不会失败,数据的备份是异步执行的。

备份指定索引

上面备份的是整个索引,如果我们只想将部分索引或分批迁移到云上,也可以通过下面的命令:
PUT _snapshot/my_backup/snapshot_1 { "indices": "index_1,index_2,log_*,nginx-*" }
如果源端存在 closed 状态的索引,则无法通过通配符进行备份,需要写全索引名称,多个索引以逗号分隔;

查看快照备份进度

我们可以通过如下的命令查看快照执行的状态:
GET _snapshot/my_backup/snapshot_1?filter_path=snapshots.state
state 若返回的是 "SUCCESS",则表示快照备份完成。若是 "IN_PROCESS",则表示快照还在备份中。也可以通过该工具获取详细的备份进度:
rpm -vih https://tools-release-1253240642.cos.ap-shanghai.myqcloud.com/elasticsearch/packages/es-backup-progress-lastest.x86_64.rpm
或下载后上传再使用 rpm 安装:
rpm -vih es-backup-progress-lastest.x86_64.rpm
使用方式:
ES 实例有密码认证,指定用户名。
ES 实例指定端口。
获取指定仓库以及快照信息。
es-backup-progress \\ --ip 源ES IP \\ --port 9201 --user 'xxx' \\ --password '源ES 密码' \\ --repository my_backup \\ --snapshot s1

数据迁移(该步骤为友商云 ES,自建 ES 可跳过)

使用腾讯云提供的传输工具 对象存储迁移,将存储在阿里云 OSS/华为云 OBS/AWS云 S3 中的数据传输至腾讯云 COS:



迁移模式务必选择 Agent 半托管模式,使用内网迁移数据,否则默认会走公网进行数据传输,公网传输存在数据泄露风险和潜在危险,如果需要使用公网迁移数据,请提工单联系腾讯侧。





在腾讯云 ES 集群上注册快照仓库

登录 API 密钥管理控制台 获取 access 密钥信息。

ES 集群版本低于8.0注册方式为:

PUT _snapshot/my_backup { "type": "cos", "settings": { "app_id": "xxxxxxx", "access_key_id": "xxxxxx", "access_key_secret": "xxxxxxx", "bucket": "xxxxxx", // cos bucket后面生成的 -appid 不可以填进来 "region": "ap-guangzhou", //需替换成COS桶所在region,例如ap-shanghai "compress": true, "chunk_size": "500mb", "base_path": "my_backup", "max_restore_bytes_per_sec":"40m", // 每个节点的恢复速率,可按需调整 "max_snapshot_bytes_per_sec":"40m", // 每个节点的备份速率,可按需调整 "compress": true, "chunk_size": "500mb" } }

ES 集群版本高于等于8.0注册方式为:

PUT _snapshot/my_backup { "type": "cos", "settings": { "cos": { "client": { "app_id": "xxxxxxx", "access_key_id": "xxxxxx", "access_key_secret": "xxxxxxx", "bucket": "xxxxxx", "region": "ap-guangzhou", //需替换成COS桶所在region,例如ap-shanghai "base_path": "my_backup" } }, "max_restore_bytes_per_sec": "40m", "max_snapshot_bytes_per_sec": "40m", "compress": true, "chunk_size": "500mb" } }
app_id:腾讯云账号 APPID。
access_key_id:腾讯云 API 密钥 SecretId。
access_key_secret:腾讯云 API 密钥 SecretKey。
bucket:COS Bucket 名字,名字不能带 -{appId}后缀。
region:COS Bucket 地域,此地域必须与 ES 集群为同一地域。地域编码可参考 地域和可用区
base_path:备份目录。

发起快照后快照备份速率与恢复速率可以修改(需版本 7.10.x 后才支持):

PUT _snapshot/my_backup { "type": "cos", "settings": { "app_id": "xxxxxxx", "access_key_id": "xxxxxx", "access_key_secret": "xxxxxxx", "bucket": "xxxxxx", // cos bucket后面生成的 -appid 不可以填进来 "region": "ap-guangzhou", //需替换成COS桶所在region,例如ap-shanghai "compress": true, "chunk_size": "500mb", "base_path": "my_backup", "max_restore_bytes_per_sec":"100m", // 节点恢复速率改为100mb/s "max_snapshot_bytes_per_sec":"100m", // 节点备份速率改为100mb/s "compress": true, "chunk_size": "500mb" } }
注意:
由于 ES 自身问题,7.14 起不再动态加载仓库的快照列表,当源端仓库发生变化时,目标端仓库需要重新注册,以加载最新的快照列表。
注意,该特殊操作只在目标端执行,如下所示:
# 第一次同步 PUT _snapshot/my_backup { "type": "cos", // 省略 } # 第二次同步 DELETE _snapshot/my_backup PUT _snapshot/my_backup { "type": "cos", // 省略 }
另外,如提前在目标集群注册了仓库,再去源端打快照,也会出现快照无法正常加载的情况。遇到这类问题,重新注册仓库即可。

云上 ES 集群执行恢复命令

本步骤为从 COS 仓库中恢复快照,快照恢复分为无冷热场景和冷热分层场景,选择其中一种执行即可,如果您的 ES 集群未对节点和索引做过任何冷热属性配置,那您的集群属于无冷热分层场景。

无冷热分层场景

POST _snapshot/my_backup/snapshot_1/_restore { "indices":"*,-.*,-ilm-*" }

冷热分层场景(如非冷热集群,忽略本操作)

指定热节点恢复(如果非冷热集群,忽略本操作):
// 腾讯云 ES < 7.14版本命令如下: POST _snapshot/my_backup/snapshot_1/_restore { "indices":"{hot_index}*,-.*,-ilm-*", "index_settings": { "index.routing.allocation.require.temperature": "hot" }, "ignore_index_settings": [ "index.routing.allocation.require.temperature" ] } // ES >= 7.14版本命令如下: POST _snapshot/my_backup/snapshot_1/_restore { "indices":"{hot_index}*,-.*,-ilm-*", "index_settings": { "index.routing.allocation.include._tier_preference": "data_hot,data_warm,data_cold" }, "ignore_index_settings": [ "index.routing.allocation.require.temperature" ] }
指定冷节点恢复(如果非冷热集群,忽略本操作):
// 腾讯云 ES < 7.14版本命令如下: POST _snapshot/my_backup/snapshot_1/_restore { "indices":"{warm_index}*,-.*,-ilm-*", "index_settings": { "index.routing.allocation.require.temperature": "warm" } } // 腾讯云 ES >= 7.14版本命令如下: POST _snapshot/my_backup/snapshot_1/_restore { "indices":"{warm_index}*,-.*,-ilm-*", "index_settings": { "index.routing.allocation.include._tier_preference": "data_warm,data_hot,data_cold" } }
上面这一步就是将 COS 中刚备份的快照数据恢复到云上的 ES 集群中,执行这一步的前提是需要先在云上的 ES 集群中注册仓库,地址和源端集群上一致。

从快照中恢复指定索引:

POST /_snapshot/my_backup/snapshot_1/_restore { "indices": "index_1", "index_settings": { "index.routing.allocation.include._tier_preference": "data_warm,data_hot,data_cold" } }

查看快照恢复进度

active_shards_percent_as_number 为快照恢复进度百分比。
说明:
当集群分片很少,或者分片 size 比较大的时候,这个进度变化会非常缓慢,是正常现象。
GET _cluster/health?filter_path=active_shards_percent_as_number

备份/恢复加速

快照备份/恢复速度慢

更改恢复速度(谨慎操作),此操作在集群数据恢复时对集群有一定压力:
更改快照仓库的备份/恢复速率
注意:
ES 7.10 之前不支持动态修改,如果备份/恢复已经开始,这个 API 会拒绝请求,直到备份/恢复完成后才允许更新。
修改仓库参数时需谨慎,只需调整恢复速度,不要改动其他参数,否则可能会造成恢复异常。
PUT _snapshot/my_backup { "type": "cos", "settings": { "app_id": "xxxxxxx", "access_key_id": "xxxxxx", "access_key_secret": "xxxxxxx", "bucket": "xxxxxx", "region": "ap-guangzhou", //需替换成COS桶所在region,例如ap-shanghai "compress": true, "chunk_size": "500mb", "base_path": "my_backup", "max_restore_bytes_per_sec":"100m", // 每个节点的恢复速率,可按需调整 "max_snapshot_bytes_per_sec":"100m" // 每个节点的备份速率,可按需调整 } }
更改集群分片迁移线程并发数
PUT _cluster/settings { "transient":{ "cluster.routing.allocation.node_concurrent_recoveries":10, "cluster.routing.allocation.node_concurrent_incoming_recoveries":10, "cluster.routing.allocation.node_initial_primaries_recoveries":10, "cluster.routing.allocation.node_concurrent_outgoing_recoveries":10, "cluster.routing.allocation.cluster_concurrent_rebalance":10, "indices.recovery.max_bytes_per_sec":"100mb" } }
恢复完成后,需要回滚加速操作
PUT _cluster/settings { "transient":{ "cluster.routing.allocation.node_concurrent_recoveries":null, "cluster.routing.allocation.node_concurrent_incoming_recoveries":null, "cluster.routing.allocation.node_initial_primaries_recoveries":null, "cluster.routing.allocation.node_concurrent_outgoing_recoveries":null, "cluster.routing.allocation.cluster_concurrent_rebalance":null, "indices.recovery.max_bytes_per_sec": null } }

增量备份/恢复

增量备份

增量备份就是在原有的快照仓库里,新建一个快照,api 完全一致。

例如:

第一次备份快照
PUT _snapshot/my_backup/snapshot_1 { "indices":"*,-.*,-ilm-*" }
第二次备份快照
PUT _snapshot/my_backup/snapshot_2 { "indices":"*,-.*,-ilm-*" }
则第二次备份就是基于第一次全量的增量备份。

增量数据迁移

重复 数据迁移 的步骤。

增量恢复

在目标集群的增量恢复,需要先_close目标需要恢复的索引,关闭索引后即可进行增量恢复,在执行增量恢复时会自动 reopen。

关闭全量索引(谨慎操作)

此操作是在目标端集群执行,而非源端:
POST *,-.*/_close
如果报错不允许模糊匹配,可以开启一下通配权限:



PUT _cluster/settings { "transient": { "action.destructive_requires_name": "false" } }

增量恢复

和全量恢复 API 完全一致,只需更改快照名称,将快照名称改为最新的快照名称:
POST _snapshot/my_backup/snapshot_2/_restore { "indices":"*,-.*,-ilm-*" }

reopen

1. 确认全量/增量恢复完成后,再补一个全量 _open,以防止有未发起恢复的索引没有被 _open:
POST */_open
2. 操作完之后需要回滚,由于模糊匹配权限有安全性问题,所以必须关闭:
PUT _cluster/settings { "transient": { "action.destructive_requires_name": "true" } }

注意(重要,重点阅读)

快照在进行中时尽量避免 DELETE snapshot,该操作非常重,可能会对集群稳定性造成影响,例如引起索引 shard lock。另外删除快照还有如下问题:
快照在进行中时,DELETE 快照很大几率会超时或无法成功,只能通过重启集群解决。
如已发起快照删除,在删除操作完成之前,无法发起新的快照请求。
最后一次增量前的切割操作,建议是业务主动停写。如果是采用 index block write / read only 的方式停写,该索引属性会被同步到快照里,在恢复时也会携带禁写属性,所以在恢复后需要回滚禁写属性,否则会导致业务不可写。
在日志场景有 rollover 的情况下,如果 is_write_index 属性发生变化,则会发生恢复失败的问题,具体表现为日志里会抛异常:
Caused by: java.lang.IllegalStateException: alias [xxxxx] has more than one write index [xxxxx-2023.10.25-000001, xxxxx-2023.10.26-000002]
解决方案为取消目标端索引旧的 is_write_index 属性:
POST _aliases { "actions" : [ { "add" : { "index" : "xxxx-2023.10.25-000001", "alias" : "xxxx", "is_write_index" : false } } ] }
在日志场景有 rollover 的情况下,建议业务切割上云之后,再同步 ilm 任务,否则会发生目标集群 ilm 提前触发 rollover 的可能,也会导致 is_write_index 属性冲突问题;

数据校验

可以下载数据条数校验工具进行对比,工具仅对比两端集群索引文档数量,不会校验内容是否相同。

工具安装

#下载jar包 #运行环境: JDK-1.8 wget https://tools-release-1253240642.cos.ap-shanghai.myqcloud.com/elasticsearch/packages/ElasticsearchCompare.jar

使用案例

示范样例

共需要如下输入7个参数,任何参数不能空缺,无密码集群可指定任意密码。
参数名
解释
示范样例
srcClusterUrl
源端集群地址
http://127.0.0.1:9200
srcUser
源端集群用户名
elastic
srcPassword
源端集群密码
12345
dstClusterUrl
目标端集群地址
http://127.0.0.1:9201
dstUser
目标端集群用户名
elastic
dstPassword
源目标端集群密码
12345
index pattern
需要校验的索引的匹配规则
"*,-.*"
java -jar ESIndexDocumentCountComparison.jar <srcClusterUrl> <srcUser> <srcPassword> <dstClusterUrl> <dstUser> <dstPassword> <index pattern>

样例

源端,目标端,集群带密码,需要校验两端集群全部索引的数据一致性,如果集群无密码则可输入任意密码。
java -jar ESIndexDocumentCountComparison.jar http://源端ES IP:9200 elastic '源端ES密码' http://腾讯云ES IP:9200 elastic '腾讯云ES密码' "*,-.*"

返回说明

工具首先会返回源端集群的 close 索引,close 状态索引无法检验数据一致性,然后返回对于两边集群数据不一致的索引信息,不返回数据一致的索引信息。
数据不一致返回

数据一致返回


业务切割

数据迁移完成并完成一致性校验,以及完成业务兼容性完全测试,则可以进行业务切割上云,将原 ES 访问地址切换为云上内网访问地址即可: