实施变更数据捕获以实现近乎实时的分析
Posted: Sun Dec 01, 2024 10:24 am
我们长期以来的首要任务是减少与我们的产品进行商业互动以供分析所需的时间;人们需要实时分析。我们希望快速响应客户,无论这意味着新客户注册、升级还是降级 — 近乎实时的分析变化应该反映在Leadfeeder 平台中。
我们主要使用批处理,对于某些数据集,我们将批 购买电话号码列表 处理频率缩小到一小时(仍然不理想)。我可以继续比较批处理和流处理,但我将留到下次再讨论。
假设我们的用户希望实时或尽可能接近实时地了解业务中发生的情况。
实时分析如何工作?
作为 Leadfeeder 支持 AWS 的分析无服务器管道的一部分,我们的工程团队将关系数据库中的数据集成到Redshift中。我们的分析师将这些数据用于多种用途,包括产品内的业务和实时分析。
以前,我们仅使用AWS Glue将运营数据导入 Redshift 以推动分析。我们传统流程的主要缺点是:
我们正在整合数据快照,因此我们无法看到快照之间的变化。
由于管道的批处理特性,数据可用时会有相当长的延迟。任何批处理失败都可能导致延迟进一步延长。
这个传统流程也有其优点,它开发起来相当快,而且很容易扩展。
使用 AWS Glue 及其爬虫,我们可以轻松识别源中的表和架构更改。将新表引入 Redshift 成为一项简单的修改。
然而,随着我们的用例变得越来越复杂(我们的数据分析师和科学家往往非常有创造力),这种模式变得不够用,主要是因为它的快照性质。
用于实时分析的 CDC 管道
CDC 代表变更数据捕获;它包含用于检测源系统中的变化并将其传播到下游以进行进一步处理和/或存储的软件模式。
MySQL具有称为二进制日志的功能,它记录修改数据库的事件,无论是 DDL 还是 DML 语句,并且有两个主要用途,即复制和数据恢复。
有多种方法可以实现 CDC,在我们的例子中,我们使用 MySQL 的二进制日志来创建事件流,然后可以使用它来支持我们的分析。
制片人
为了利用二进制日志并创建数据流,我们实现了一个ECS 服务,该服务不断读取二进制日志并充当 Kinesis 流的生产者。
ECS服务的主要特点:
从数据库读取的数据无需任何转换即可传输,并序列化为换 行符分隔的 JSON。目标是生成原始事件,即无论从数据库检测到什么 DML 操作,它都会按原样发送到 Kinesis 流,数据库中每修改一行就会有一个事件。
事件同步生成到 Kinesis 流,并按数据库表的分片进行排序。
允许从二进制日志中的特定位置重新启动。对于 MySQL RDS 实例,二进制日志的最大保留时间为 7 天。
实现优雅重启机制。捕获 SIGTERM 后,刷新数据并保存检查点。这对于部署很重要。
Fargate 用于继续我们的无服务器分析方法并限制任何配置和维护计算资源的操作活动。
使用 Cloudwatch 指标和警报进行监控。
消费者
为了利用来自该事件流的数据,我们决定使用Kinesis Firehose。
Firehose提供数据消费者功能,让我们能够加速管道的实施。我们所要做的就是定义交付流的配置。
从上图我们可以看到我们有两个主要消费者,一个用于 Redshift,一个用于S3。
为了支持我们的近乎实时的分析,我们只需要将我们的数据传输到 Redshift,然而,我们很快发现将我们的运营数据传输到 S3 的价值,这样我们就可以在数据仓库中启用额外的集成模式。
并非所有数据集都需要实时分析,但我们希望跟踪所有更改,以在我们的运营数据库中创建事件的完整更改日志。通过此更改日志,我们能够支持更复杂的建模。
敬请期待未来更多工程更新!
我们主要使用批处理,对于某些数据集,我们将批 购买电话号码列表 处理频率缩小到一小时(仍然不理想)。我可以继续比较批处理和流处理,但我将留到下次再讨论。
假设我们的用户希望实时或尽可能接近实时地了解业务中发生的情况。
实时分析如何工作?
作为 Leadfeeder 支持 AWS 的分析无服务器管道的一部分,我们的工程团队将关系数据库中的数据集成到Redshift中。我们的分析师将这些数据用于多种用途,包括产品内的业务和实时分析。
以前,我们仅使用AWS Glue将运营数据导入 Redshift 以推动分析。我们传统流程的主要缺点是:
我们正在整合数据快照,因此我们无法看到快照之间的变化。
由于管道的批处理特性,数据可用时会有相当长的延迟。任何批处理失败都可能导致延迟进一步延长。
这个传统流程也有其优点,它开发起来相当快,而且很容易扩展。
使用 AWS Glue 及其爬虫,我们可以轻松识别源中的表和架构更改。将新表引入 Redshift 成为一项简单的修改。
然而,随着我们的用例变得越来越复杂(我们的数据分析师和科学家往往非常有创造力),这种模式变得不够用,主要是因为它的快照性质。
用于实时分析的 CDC 管道
CDC 代表变更数据捕获;它包含用于检测源系统中的变化并将其传播到下游以进行进一步处理和/或存储的软件模式。
MySQL具有称为二进制日志的功能,它记录修改数据库的事件,无论是 DDL 还是 DML 语句,并且有两个主要用途,即复制和数据恢复。
有多种方法可以实现 CDC,在我们的例子中,我们使用 MySQL 的二进制日志来创建事件流,然后可以使用它来支持我们的分析。
制片人
为了利用二进制日志并创建数据流,我们实现了一个ECS 服务,该服务不断读取二进制日志并充当 Kinesis 流的生产者。
ECS服务的主要特点:
从数据库读取的数据无需任何转换即可传输,并序列化为换 行符分隔的 JSON。目标是生成原始事件,即无论从数据库检测到什么 DML 操作,它都会按原样发送到 Kinesis 流,数据库中每修改一行就会有一个事件。
事件同步生成到 Kinesis 流,并按数据库表的分片进行排序。
允许从二进制日志中的特定位置重新启动。对于 MySQL RDS 实例,二进制日志的最大保留时间为 7 天。
实现优雅重启机制。捕获 SIGTERM 后,刷新数据并保存检查点。这对于部署很重要。
Fargate 用于继续我们的无服务器分析方法并限制任何配置和维护计算资源的操作活动。
使用 Cloudwatch 指标和警报进行监控。
消费者
为了利用来自该事件流的数据,我们决定使用Kinesis Firehose。
Firehose提供数据消费者功能,让我们能够加速管道的实施。我们所要做的就是定义交付流的配置。
从上图我们可以看到我们有两个主要消费者,一个用于 Redshift,一个用于S3。
为了支持我们的近乎实时的分析,我们只需要将我们的数据传输到 Redshift,然而,我们很快发现将我们的运营数据传输到 S3 的价值,这样我们就可以在数据仓库中启用额外的集成模式。
并非所有数据集都需要实时分析,但我们希望跟踪所有更改,以在我们的运营数据库中创建事件的完整更改日志。通过此更改日志,我们能够支持更复杂的建模。
敬请期待未来更多工程更新!