通过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提供的高持久性和可用性保证了备份数据的安全性,减少了数据丢失的风险。
- 灵活的备份策略:可以根据业务需求,灵活选择全量备份或增量备份,优化存储使用和迁移时间。
约束限制
- 目标集群的版本不能低于源集群的版本,版本兼容性分析请参见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是仓库名称。