通过S3插件备份与恢复迁移自建Elasticsearch集群至华为云
自建Elasticsearch集群数据迁移到华为云Elasticsearch集群可以使用S3快照备份恢复方式。
应用场景
S3插件(repository-s3)是一个专为Elasticsearch设计的插件,该插件允许用户将Elasticsearch的快照备份存储到与S3 API兼容的存储服务中,例如华为云的对象存储服务(OBS)。S3插件提供了一种高效、灵活且安全的方式来备份Elasticsearch集群的数据。
通过S3插件实现自建Elasticsearch集群和华为云Elasticsearch集群之间的数据迁移,常用于以下场景:
- 服务迁移上云:将自建的Elasticsearch服务迁移到云平台,以利用云服务的可扩展性、维护简便性和成本效益。
- 跨版本迁移:将低版本的自建Elasticsearch集群数据迁移到高版本的华为云Elasticsearch集群中。
- 集群整合:将多个自建Elasticsearch集群迁移到一个华为云Elasticsearch集群中整合为统一的数据平台,以简化管理和提高数据一致性。
- 技术栈统一:当企业已经在华为云上运行其他服务时,为了技术栈的统一和简化管理,可以选择将Elasticsearch集群也迁移至华为云。
方案架构
通过S3插件备份与恢复迁移自建Elasticsearch集群(源集群)至华为云Elasticsearch(目标集群)的迁移流程如图1所示。
- 在自建Elasticsearch集群安装repository-s3插件。
- 备份自建Elasticsearch数据到华为云对象存储服务OBS上。
- 从华为OBS恢复数据到CSS服务的Elasticsearch。
方案优势
- 跨版本兼容性高:支持在不同版本的Elasticsearch集群之间进行数据迁移,包括从低版本到高版本的升级。
- 高可用性和持久性:S3提供的高持久性和可用性保证了备份数据的安全性,减少了数据丢失的风险。
- 灵活的备份策略:可以根据业务需求,灵活选择全量备份或增量备份,优化存储使用和迁移时间。
性能影响
使用备份与恢复迁移集群的核心在于直接复制数据存储层的文件以实现数据备份,该方案避免了对Elasticsearch外部读写接口的依赖,从而显著降低了对源集群性能的影响。对于对业务延迟要求不严苛的集群而言,此方法对性能的干扰几乎可以忽略。
约束限制
- 目标集群的版本不能低于源集群的版本,版本兼容性分析请参见Snapshot version compatibility。
- 备份与恢复不支持动态增量数据同步,建议停止数据更新后再进行备份。
- 自建Elasticsearch集群需要配置公网访问权限才能备份快照到OBS。
前提条件
- 源Elasticsearch集群和目标Elasticsearch集群处于可用状态。
- 已备好存储快照数据的OBS桶“backup-obs”,OBS桶必须和CSS服务的Elasticsearch集群在同一Region。
- 已获取账号的AK/SK,获取方式请参见如何获取访问密钥AK/SK。
操作步骤
- 在自建Elasticsearch集群上安装repository-s3插件。
- 查看自建Elasticsearch集群的版本,确认要安装的repository-s3插件版本。
curl http://x.x.x.x:9200 # 需输入Elasticsearch集群的IP地址。
在返回结果中查看“version.number”,如下所示表示集群版本号是7.10.2。
{ "name" : "es_cluster_migrate-ess-esn-1-1", "cluster_name" : "es_cluster_migrate", "cluster_uuid" : "1VbP7-39QNOx_R-llXKKtA", "version" : { "number" : "7.10.2", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "d2ef93d", "build_date" : "2018-12-17T21:17:40.758843Z", "build_snapshot" : false, "lucene_version" : "8.7.0", "minimum_wire_compatibility_version" : "6.7.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "Tagline" : "You Know, for Search" }
- 下载对应版本的repository-s3插件安装包。此处以7.10.2为例,基于集群实际版本号修改下载地址中的版本号。
下载地址:“https://artifacts.elastic.co/downloads/elasticsearch-plugins/repository-s3/repository-s3-7.10.2.zip”
- 登录自建Elasticsearch集群的实例节点上,并cd到plugins目录下。
- 执行如下命令将repository-s3插件安装包解压到plugins目录下。
unzip repository-s3-7.10.2.zip -d plugins/repository-s3
- 给repository-s3插件添加华为云的访问密钥AK/SK。
- 进入自建集群Elasticsearch的安装路径,执行以下命令创建keystore文件。
bin/elasticsearch-keystore create s3.keystore
创建keystore文件必须用普通用户,不能用root账号,否则配置不生效。
- 将华为云的访问密钥AK/SK增加到keystore文件中。
bin/elasticsearch-keystore add s3.client.default.access_key bin/elasticsearch-keystore add s3.client.default.secret_key
access_key是获取到的访问密钥ID(AK);secret_key是获取到的秘密访问密钥(SK)。
- 进入自建集群Elasticsearch的安装路径,执行以下命令创建keystore文件。
- 当自建Elasticsearch集群有多个实例节点时,重复执行1.c到1.e给其他节点安装S3插件和配置AK/SK。
- AKSK添加完成,重启Elastiseach集群使配置生效。
- 重启完成后,执行如下命令查看S3插件是否安装成功。
curl http://x.x.x.x:9200/_cat/plugins # 需输入Elasticsearch集群的IP地址。
当正常返回repository-s3插件的版本信息时表示安装成功,如下所示。
node-1 repository-s3 7.10.2
- 查看自建Elasticsearch集群的版本,确认要安装的repository-s3插件版本。
- 备份自建Elasticsearch数据到华为云OBS。
- 登录自建Elasticsearch集群的Kibana,选择“Dev Tools”,进入命令行界面。
- 执行如下命令,创建快照仓库“my_backup”,对接华为云OBS存放快照数据的OBS桶“backup-obs”。
PUT /_snapshot/my_backup { "type": "s3", "settings": { # OBS桶名称 "bucket": "backup-obs", # OBS的外网访问地址 "endpoint": "obs.xxx.example.com", "base_path": "snapshot", "max_snapshot_bytes_per_sec": "1000mb" } }
- 执行如下命令,当正常返回快照仓库信息时,表示创建成功。
GET /_snapshot/my_backup
- 执行如下命令,创建快照。
排除“.”开始的系统索引,为其他索引创建全量快照,其中“wait_for_completion”设置为“true”表示异步执行。
PUT _snapshot/my_backup/snapshot_all?wait_for_completion=true { "indices": "*,-.*" }
- 快照创建完成可以执行如下命令查看快照信息。
# 查看所有存在的快照 GET _cat/repositories # 查看所有的快照信息 GET _snapshot/my_backup/_all # 根据快照名称查看快照信息,其中snapshot_all是快照名称 GET _snapshot/my_backup/snapshot_all # 根据快照名称查看快照状态,其中snapshot_all是快照名称 GET _snapshot/my_backup/snapshot_all/_status
- 从OBS恢复数据到CSS服务的Elasticsearch。
- 登录云搜索服务管理控制台。
- 在左侧导航栏中,选择“集群管理 > Elasticsearch”,进入集群管理列表页面。
- 选择目标集群,单击操作列“Kibana”,登录Kibana。
- 单击左侧导航栏的“Dev Tools”进入操作页面。
- 执行如下命令,创建快照仓库“my_backup_all”。
PUT _snapshot/my_backup_all/ { "type" : "obs", "settings" : { # OBS的内网访问域名。 "endpoint" : "obs.xxx.example.com", "region" : "cn-south-1", # 访问OBS的用户名和密码。 "access_key": "xxx", "secret_key": "xxx", # OBS的桶名称,和上一步迁移目的端的OBS桶名保持一致。 "bucket" : "backup-obs", "compress" : "false", "chunk_size" : "1g", "base_path" : "snapshot", "max_restore_bytes_per_sec": "1000mb", "max_snapshot_bytes_per_sec": "1000mb" } }
- 执行如下命令,恢复快照数据到目标集群。
- 查看存在的快照,其中my_backup_all是仓库名称。
GET _snapshot/my_backup_all/_all
- 基于查看到的快照名称恢复数据到目标elasticsearch集群,其中my_backup_all是快照仓库名称,snapshot_all是快照名称。
POST _snapshot/my_backup_all/snapshot_all/_restore?wait_for_completion=true
- 恢复指定索引到目标Elasticsearch集群,其中my_index1和my_index2是需要恢复的索引名称。
POST _snapshot/my_backup_all/snapshot_all/_restore?wait_for_completion=true { "indices": "my_index1,my_index2,-.*", "ignore_unavailable": "true" }
- 查看存在的快照,其中my_backup_all是仓库名称。