一、背景
因业务需要迁移Opensearch 集群,当前集群数据量高达21TB,采用常规工具进行迁移估计不可取,需要使用对象存储做中转,进行OpenSearch数据迁移。
二、OpenSearch迁移方案
前期进行OpenSearch数据迁移调研
序号 | 方案 | 诠释 | 备注 |
---|---|---|---|
1 | [OpenSearch → S3] → [OSS → OpenSearch] | 在AWS环境下通过OS的快照存储到S3里面,然后在阿里云那边将S3的数据复制一份到OSS里面,然后在阿里云环境下恢复OSS的快照到OS里面 | S3–>OSS涉及流量出网 |
2 | OpenSearch → S3 → OpenSearch或者OpenSearch → OSS → OpenSearch | 将OpenSearch的数据备份到S3,阿里云账号下的OpenSearch连接AWS的S3桶,进行快照恢复 | S3传出需要流量,1G=1RMB |
3 | OpenSearch → Logstash → OpenSearch | 使用开源组件,将OpenSearch点对点拷贝数据 | 大批量数据容易出现超时 |
方案一:OpenSearch快照,跨云进行快照恢复
A.大致流程
①在AWS中的OpenSearch服务,在Pod内将数据生成快照到S3中
②AliCloud在线迁移服务将S3中的数据Copy一份到OSS中
③在AliCloud的OpenSearch中恢复OSS的快照
B.可行性评估 ✓
经过测试,OpenSearch支持用OSS做快照
参考地址:Take and restore snapshots - OpenSearch Documentation
方案二:Aliyun OpenSearch根据S3进行快照恢复
大致流程
①在AWS上面将Node节点赋权S3,然后将OpenSearch设置S3为快照桶
②将所需的索引快照到S3中
③在AliCloud中的OpenSearch设置AWS的S3为快照桶
④在AliCloud中OpenSearch恢复快照
可行性:✓
方案三:在aliyun上使用数据迁移工具Logstash 对OpenSearch进行数据迁移
大致流程
①通过Logstash input跟AWS中部署的OpenSearch进行连接,AWS OpenSearch为数据源
②在Logstash outPut连接aliCloud中的OpenSearch进行目标数据源,达到数据传递效果
可行性:✓
方案确定:方案二(OpenSearch → OSS → OpenSearch)
选择原因:
- 对于TB需采用对象存储方式转移,避免实时转移导致数据不稳定丢失
- 采用OSS不采用S3的原因是OSS对于外网流入流量免费,内网流出流量免费,节省了很大的一部分流量费。S3对于外网流出会收取流量费
三、迁移准备
1.迁移准备
在进行数据迁移前,需要考虑数据的完整性跟用户使用体验,需要提前预演集群切换的整个过程。
No. | Action | Reamrk |
---|---|---|
1 | 新集群稳定运行 | 准备好需要迁移的集群 |
2 | 业务指向新集群 | 业务服务更改地址数据传入新集群 |
3 | 将OpenSearch中老数据按照索引名称进行数据迁移,注意迁移到新集群之后检查数据的完整性跟是否可以查询 | 防止迁移过来不能查看 |
4 | 业务稳定运行后销毁老集群 | 清理老集群 |
2.迁移具体步骤
A. 原OpenSearch设置快照
在OpenSearch所在的集群或服务器设置可以操作S3的权限,具体设置见AWS S3官方文档。(只需要让服务器能上传下载S3的数据)
-
在OpenSearch Dashboard中设置快照存储桶
# 向OpenSearch设置快照存储桶 PUT _snapshot/my-snapshot-repo-name { "type": "s3", "settings": { "bucket": "guance-opensearch-data", "base_path": "my/snapshot/directory", "endpoint": "s3.cn-north-1.amazonaws.com.cn" } }
该命令参考文档:https://opensearch.org/docs/latest/tuning-your-cluster/availability-and-recovery/snapshots/snapshot-restore/#amazon-s3
快照相关命令:
#查看快照桶
GET _snapshot
#删除快照桶
DELETE _snapshot
B. 原OpenSearch备份快照
设置完快照桶之后开始备份索引,索引备份会根据数据大小影响备份时间
-
开始备份
PUT _snapshot/my-snapshot-repo-name/XXXXX { "indices": "index Name" }
*** 备份快照一定要一个一个备份,如果同事备份多个快照会有问题。***
备份之后可以查看到备份的进度:
GET /_snapshot/my-snapshot-repo-name/XXXXX
等待state为SUCCESS 即备份成功,此时可以上AWS S3 存储桶查看备份文件
参考命令:Take and restore snapshots - OpenSearch Documentation
C. 新集群添加AWS S3的认证凭证
由于新集群的路径不确定在哪,所以采用公网连接S3(需考虑流量费用)进行索引恢复,涉及连接新OpenSearch连接S3,以及恢复快照。
- 连接到AWS S3
在OpenSearch所在的集群中设置S3的访问路径(这里依据观测云的OpenSearch进行操作),在K8S的OpenSearch配置文件增加AWS S3的访问路径
s3:
client:
default:
endpoint: s3.cn-north-1.amazonaws.com.cn
max_retries: 3
path_style_access: false
protocol: https
read_timeout: 50s
use_throttle_retries: true
region: cn-north-1
# 参数解释:https://opensearch.org/docs/latest/tuning-your-cluster/availability-and-recovery/snapshots/snapshot-restore/#amazon-s3
由于是一个OpenSearch集群,所以需要对Master、Data、Client都需要在config文件里面增加AWS S3配置,随后重启OpenSeach相关Pod.
- 设置AWS S3凭证(AK/SK)
在集群中为OpenSeach添加密钥信息,命令如下
ACCESS_KEY="XXXXX"
SECRET_KEY="xxxxx"
SESSION_TOKEN="xxxxxxx session_token"
for i in {0..2}; do
kubectl exec -i -n middleware opensearch-cluster-data-$i -c opensearch-data -- /bin/sh -c "echo \"$ACCESS_KEY\" | /usr/share/opensearch/bin/opensearch-keystore add --stdin s3.client.default.access_key; echo \"$SECRET_KEY\" | /usr/share/opensearch/bin/opensearch-keystore add --stdin s3.client.default.secret_key; echo \"$SESSION_TOKEN\" | /usr/share/opensearch/bin/opensearch-keystore add --stdin s3.client.default.session_token"
done
for i in {0..2}; do
kubectl exec -it -n middleware opensearch-cluster-master-$i -c opensearch-master -c opensearch-master -- /bin/sh -c "echo \"$ACCESS_KEY\" | /usr/share/opensearch/bin/opensearch-keystore add --stdin s3.client.default.access_key; echo \"$SECRET_KEY\" | /usr/share/opensearch/bin/opensearch-keystore add --stdin s3.client.default.secret_key; echo \"$SESSION_TOKEN\" | /usr/share/opensearch/bin/opensearch-keystore add --stdin s3.client.default.session_token"
done
for i in {0..2}; do
kubectl exec -it -n middleware opensearch-cluster-client-$i -c opensearch-master -c opensearch-client -- /bin/sh -c "echo \"$ACCESS_KEY\" | /usr/share/opensearch/bin/opensearch-keystore add --stdin s3.client.default.access_key; echo \"$SECRET_KEY\" | /usr/share/opensearch/bin/opensearch-keystore add --stdin s3.client.default.secret_key; echo \"$SESSION_TOKEN\" | /usr/share/opensearch/bin/opensearch-keystore add --stdin s3.client.default.session_token"
done
opensearch-keystore是OpenSearch进行密钥管理的地方,官方解释:OpenSearch keystore - OpenSearch Documentation
-
登录新OpenSearch Dashboard设置S3快照库
这里需要跟在老的OpenSearch设置的S3存储桶位置一致,包括区域、桶、快照路径。-
刷新密钥
POST /_nodes/reload_secure_settings
-
添加AWS S3快照库
-
PUT _snapshot/my-snapshot-repo-name
{
"type": "s3",
"settings": {
"bucket": "XXXXX",
"base_path": "my/snapshot/directory"
}
}
D. 恢复快照
在新集群中执行快照恢复命令进行快照恢复,如果快照比较慢需要等待
POST /_snapshot/my-snapshot-repo-name/xxxxxx/_restore
Tips:在恢复的过程中可以查看快照恢复情况
GET index_name/_recovery
等待恢复完毕即可
F.附使用OSS进行同步OpenSearch同步数据步骤
- OSS基本兼容S3,相对来说如果替换只需要替换Endpoint即可
-
在两边都OpenSearch的配置文件中加入OSS的配置,即在集群中更改
opensearch.yml
加入OSS的连接地址,并重启Data、Master、Clent节点s3: client: default: endpoint: oss-cn-shanghai.aliyuncs.com max_retries: 3 path_style_access: false protocol: https read_timeout: 50s use_throttle_retries: true region: cn-shanghai
-
在两边集群中添加OSS的AKSK
ACCESS_KEY="xxxx"
SECRET_KEY="xxxxxx+xxx+"
for i in {0..2}; do
kubectl exec -i -n middleware opensearch-cluster-data-$i -c opensearch-data -- /bin/sh -c "echo \"$ACCESS_KEY\" | /usr/share/opensearch/bin/opensearch-keystore add --stdin s3.client.default.access_key; echo \"$SECRET_KEY\" | /usr/share/opensearch/bin/opensearch-keystore add --stdin s3.client.default.secret_key"
done
for i in {0..2}; do
kubectl exec -it -n middleware opensearch-cluster-master-$i -c opensearch-master -c opensearch-master -- /bin/sh -c "echo \"$ACCESS_KEY\" | /usr/share/opensearch/bin/opensearch-keystore add --stdin s3.client.default.access_key; echo \"$SECRET_KEY\" | /usr/share/opensearch/bin/opensearch-keystore add --stdin s3.client.default.secret_key"
done
for i in {0..2}; do
kubectl exec -it -n middleware opensearch-cluster-client-$i -c opensearch-master -c opensearch-client -- /bin/sh -c "echo \"$ACCESS_KEY\" | /usr/share/opensearch/bin/opensearch-keystore add --stdin s3.client.default.access_key; echo \"$SECRET_KEY\" | /usr/share/opensearch/bin/opensearch-keystore add --stdin s3.client.default.secret_key"
done
- 在源集群(AWS)中添加OSS快照桶
#刷新快照权限
POST /_nodes/reload_secure_settings
#添加OSS快照存储桶
PUT _snapshot/my-snapshot-repo-name
{
"type": "s3",
"settings": {
"bucket": "guancecloud-oss-prod-sh-al1",
"base_path": "my/snapshot/directory"
}
}
- 创建快照索引并上传OSS
PUT _snapshot/my-snapshot-repo-name/XXX
{
"indices": "XXX"
}
- 目标集群添加OSS存储桶
#刷新快照权限
POST /_nodes/reload_secure_settings
#添加OSS快照存储桶
PUT _snapshot/my-snapshot-repo-name
{
"type": "s3",
"settings": {
"bucket": "guancecloud-oss-prod-sh-al1",
"base_path": "my/snapshot/directory"
}
}
- 恢复快照
#恢复快照
POST /_snapshot/my-snapshot-repo-name/XXXX/_restore
#查看恢复进度
GET index_name/_recovery
#会展示索引的恢复进度百分比
- 查看快照生命周期
对于迁移过来的快照,会携带源集群的生命周期。
GET _opendistro/_ism/explain/Index_Namexxxxx
四、参考文档
OpenSearch迁移S3官方文档:Take and restore snapshots - OpenSearch Documentation
OpenSearch 密钥管理文档:OpenSearch keystore - OpenSearch Documentation
h迁移S3官方文档:Take and restore snapshots - OpenSearch Documentation
OpenSearch 密钥管理文档:OpenSearch keystore - OpenSearch Documentation
AWS迁移ALiyun ElasticSearch指导文档:将AWS中的ES数据迁移到阿里云ES中_检索分析服务 Elasticsearch版(ES)-阿里云帮助中心 (aliyun.com)