使用 INFINI Console 实现 Elasticsearch 的增量数据迁移
功能介绍 #
在 INFINI Console 1.3.0 版本里,数据迁移功能增加了对增量迁移的支持。这篇文章将会介绍增量迁移的具体使用方法和实现原理。
场景介绍 #
以常见的日志场景为例,假设 A 集群有一个用来记录线上 HTTP 请求记录的索引 request-logs,数据结构如下:
{
"request_body": {...},
"request_header": {...},
"method": "POST",
"request_time": "2023-06-09 12:30:09+800" // 客户端记录请求的时间
"@timestamp": "2023-06-09 12:30:11+800" // 请求写入ES的时间
}
我们希望完整导入这个索引的数据到另外一个集群 B 的 request-logs。要想确保导入的数据完整,我们首先需要考虑数据写入的延迟问题:
A 集群的数据写入可能会有延迟。日志往往是从不同的节点收集异步上传的,考虑到网络环境波动等情况,最终日志写入 Elasticserach 的时间会有差异。
写入 Elasticsearch 的数据并不会立刻对查询请求可见,Elasticsearch 会异步刷新写入的数据。
也就是说,我们假设每一条请求日志从采集到写入 ES 到最终可以被查询的延迟为d,每次进行增量迁移的时候,我们可以完整迁移的数据范围就是[当前时间 - 上次迁移的时间 - d, 当前时间 - d)。只要数据写入的延迟不超过d,我们就可以从集群 A 查询到完整的数据集写入集群 B。
集群 A 的数据有更新操作? #
在上述的日志场景里,我们通常不会对写入的日志文档进行后续的更新操作,每一条文档写入后都是不可变的,我们只需要筛选@timestamp字段就可以找到需要迁移的数据了,而且每条数据只需要迁移一次就可以确保目标集群的数据一致。
如果源数据有更新,那我们应该如何进行增量迁移呢?通常情况下,每次更新操作我们都会记录文档更新的时间到update_time字段,这样我们就可以使用update_time字段来进行增量数据的迁移。
假设在第一次迁移的时候,索引 A 存有以下数据,我们在进行第一次迁移操作后,数据可以完整写入目标索引:

如果在第二次迁移之前,索引 A 中有一条旧的记录被更新,这个时候,迁移流程可以通过update_time字段检测到这一条数据,复制并覆盖目标集群的旧数据记录:

可以看到,即使源数据有更新,只要我们记录了每一条数据的更新时间,迁移过程最后写入集群 B 的数据依然是完整且一致的。
集群 A 的数据有删除操作? #
如果源集群的数据有删除操作,基于上述的数据迁移逻辑,第二次迁移过程是无法判断已经迁移的数据是否被删除的:

如果我们希望迁移的数据完整,需要避免对源集群的数据进行删除操作。我们可以标记文档为deleted,但是不做实际删除操作,这样我们就可以通过文档删除(更新)操作的时间来进行完整的数据迁移:

使用 INFINI Console 来进行增量数据的迁移 #
在 INFINI Console 里,我们可以使用 数据工具 - 数据迁移 功能来对数据进行增量迁移。作为示例,我们新建一个数据迁移任务,把.infini_requests_logging-000002索引的数据迁移到目标集群的request索引。

我们需要迁移到一个新创建的索引,在Initialize Configuration步骤,根据提示配置目标索引的mapping和setting信息。如果不需要特殊配置,可以使用Auto Optimize功能自动填充。

接下来我们需要配置数据写入的更新字段和写入的延迟。请求日志通过timestamp字段记录请求时间,通常延迟不会超过 1 分钟,我们在Migrate Setting步骤里配置相应的Incremental信息。如果历史数据量比较大或者增量任务的运行间隔较长,我们也可以配置Partition分区规则来拆分任务为更细的粒度,避免因单个任务长时间导出数据对 ES 产生过高的负载。

最后,在创建任务时,我们勾选Detect Incremental Data,然后设置任务每 15 分钟检测一次增量数据。

点击开始后,增量任务就会开始运行。第一次运行时会对历史数据进行全量迁移,后续每 15 分钟会自动检测新数据并迁移到目标索引。

总结 #
除了数据一致性,迁移功能的设计也需要兼顾性能、稳定性、ES 版本兼容性等,INFINI Console 提供了一套操作简便的数据迁移解决方案,可以用于各种场景的数据迁移需求。
使用 INFINI Console 实现 Elasticsearch 的增量数据迁移的更多相关文章
- 全量、增量数据在HBase迁移的多种技巧实践
		
作者经历了多次基于HBase实现全量与增量数据的迁移测试,总结了在使用HBase进行数据迁移的多种实践,本文针对全量与增量数据迁移的场景不同,提供了1+2的技巧分享. HBase全量与增量数据迁移的方 ...
 - 阿里云 RDS实例间的数据迁移
		
使用数据传输DTS可以实现两个RDS实例间的数据迁移.对于支持增量迁移的存储引擎,还可以使用DTS在源RDS实例不停服的情况下,将数据迁移到目标RDS实例.目前对于RDS不同存储引擎,只支持同构迁移( ...
 - flume-ng-sql-source实现oracle增量数据读取
		
一.下载编译flume-ng-sql-source 下载地址:https://github.com/keedio/flume-ng-sql-source.git ,安装说明文档编译和拷贝jar包 嫌麻 ...
 - 谈谈对Canal(增量数据订阅与消费)的理解
		
概述 canal是阿里巴巴旗下的一款开源项目,纯Java开发.基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql(也支持mariaDB). 起源:早期,阿里巴巴B2B公司 ...
 - 对 Canal (增量数据订阅与消费)的理解
		
概述 canal是阿里巴巴旗下的一款开源项目,纯Java开发.基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB). 起源:早期,阿里巴巴B2B公司 ...
 - elasticsearch 使用快照方式迁移数据
		
注册快照仓库 ES是通过快照的方式来实现数据备份,并且是以增量的方式,所以一般第一次做的话会花费较长的时间.为了做快照,那么就需要注册一个快照仓库,告诉ES我们的快照应该如何保存以及将快照保存到哪里. ...
 - 干货 | Elasticsearch、Kibana数据导出实战
		
1.问题引出 以下两个导出问题来自Elastic中文社区. 问题1.kibana怎么导出查询数据? 问题2:elasticsearch数据导出 就像数据库数据导出一样,elasticsearch可以么 ...
 - Canal( 增量数据订阅与消费 )的理解及应用
		
canal是阿里巴巴旗下的一款开源项目,纯Java开发.基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB). 起源:早期,阿里巴巴B2B公司因为存 ...
 - XPatchLib 对象增量数据序列化及反序列化器 For .Net
		
在日常的软件开发和使用过程中,我们发现同一套系统的同一配置项在不同的客户环境中是存在各种各样的差异的.在差异较为分散时,如何较好的管理这些差异,使得维护过程能够更加安全和快速,一直在这样那样的困扰着开 ...
 - 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作(二)
		
CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...
 
随机推荐
- 容器环境自建数据库、中间件一键接入阿里云 Prometheus 监控
			
------------恢复内容开始------------ 阿里云Prometheus服务4月9日发布重大升级,支持容器环境下一键接入MySQL.Redis.MangoDB.ElasticSearc ...
 - 深度解析数据湖存储方案Lakehouse架构
			
简介:从数据仓库.数据湖的优劣势,湖仓一体架构的应用和优势等多方面深度解析Lakehouse架构. 作者:张泊 Databricks 软件工程师  Lakehouse由lake和house两个词组 ...
 - Oracle数据到MaxCompute乱码问题详解
			
简介:集成Oracle数据到MaxCompute,乱码问题分析: 为什么,在oracle数据不乱码,集成到MaxCompute就乱码了? 问题在哪里? 1.1 乱码现象 DataWorks的数据离线 ...
 - 阿里云RDS深度定制-XA Crash Safe
			
简介: 近几年,随着分布式数据库系统的兴起,特别是基于MySQL分布式数据库系统,会用到XA来保证全局事务的一致性.众所周知,MySQL对XA事务的支持是比较弱的,存在很多问题.为了满足分布式数据库 ...
 - 漫画 | 一口气搞懂 Serverless !
			
简介: 第二届云原生编程挑战赛为热爱技术的年轻人提供一个挑战世界级技术问题的舞台,希望用技术为全社会创造更大价值. 作者 | 刘欣 呃,我可能是别人眼中所说的不用奋斗的一代. 大家喜欢听的什么多姿多 ...
 - [Gse] 高效的Golang中文分析库推荐
			
优点:用法简单,支持各种语言,基本满足需求. 缺点:默认分词字典文件有 8M 需测试使用速度. 我们可以直接封装一个简单的辅助方法来实现分词功能: // @author cnblogs.com/far ...
 - C#类型后加问号?
			
C# 可空类型(Nullable)说明_w3cschool 细说Nullable<T>类型 - Sweet-Tang - 博客园 (cnblogs.com) 值类型变量不能null,加问号 ...
 - Excel根据名称批量导入图片
			
一. 效果 二.方法一 在Excel中如果内容 ="<table><img src=""D:\文档\常用文件\图片导入测试\"&A2& ...
 - 云原生最佳实践系列 7:基于 OSS Object FC 实现非结构化文件实时处理
			
01 方案概述 现在绝大多数客户都有很多非结构化的数据存在 OSS 中,以图片,视频,音频居多.举一个图片处理的场景,现在各种终端种类繁多,不同的终端对图片的格式.分辨率要求也不同,所以一张图片往往会 ...
 - python 打包成exe可执行文件
			
一.pyinstall打包 代码编写完成,如何在没有python环境的电脑上运行?编写了一个GUI程序,如何把文件打包好,发给别人直接使用?其实最简单的办法就是把.py源文件,打包成可执行程序员exe ...