DBLog: A Watermark Based Change-Data-Capture Framework

摘要(ABSTRACT)

本文讨论了应用程序在使用多种异构数据库时所面临的数据同步挑战,并探讨了现有解决方案的局限性。通常,应用会利用不同的数据库以满足特定需求,例如存储基本数据或提供高级搜索功能。因此,保持多个数据库之间同步显得尤为重要。尽管之前有双写和分布式事务等解决方案,但这些方法在可行性、健壮性和维护性方面存在不足。

最近出现的一种替代方法是使用变更数据捕捉(CDC),从数据库的事务日志中捕捉更改的行,并以低延迟将其传递到下游。然而,数据同步不仅需要捕捉更改,还需要复制数据库的全量状态,因为事务日志通常不包含完整的更改历史。同时,还有需要高可用性事务日志事件的场景,以便数据库能够尽可能保持同步。

为了解决上述挑战,本文介绍了一种新颖的CDC框架,名为DBLog。DBLog采用水印(watermark)驱动的方法,允许通过直接从表中选择的行与事务日志事件进行交错,从而捕捉数据库的全量状态。该解决方案使得日志事件在处理选择操作时可以继续前进,而不会出现停滞。选择操作可以在任何时间对所有表、特定表或特定主键的表触发。DBLog以块的形式执行选择操作并跟踪进度,允许暂停和恢复。水印方法不使用锁,对源的影响最低。目前,DBLog已在Netflix的多个微服务中投入生产使用。

Read more »

本文着重描述了 SourceReaderBase 实现逻辑,但是在描述 SourceReader 之前,肯定是需要了解与之关系密切的 SplitEnumerator 的行为,由于 SplitEnumerator 仅提供了一个接口,我们要确定多数情况下的实现,SplitEnumerator 是如何与 SourceReader 进行交互的,毕竟 Source 的起点是在 JobManager 的 SplitEnumerator 之中。

Read more »

文章大纲

  • 介绍 DAG 是什么
  • 介绍 DAG 能解决什么问题,有哪些出名的系统是依赖 DAG 的
  • 介绍 DAG 的实现
  • 介绍 DAG 算法场景
Read more »

Abstract

Apache Flink是一个用于处理流数据和批量数据的开源系统。Flink建立在这样一种理念之上:许多类别的数据处理应用程序,包括实时分析、持续数据流、历史数据处理(批处理)和迭代算法(机器学习、图分析),都可以表达并作为管道化的容错数据流来执行。在本文中,我们介绍了Flink的架构,并展开讨论了如何将一组(看似多样的)用例统一到一个单一的执行模型下。

Read more »

FlumeJava: Easy, Efficient Data-Parallel Pipelines

摘要

MapReduce 及类似系统极大地简化了编写数据并行代码的任务。然而,许多现实世界的计算需要一系列的 MapReduce 操作,编程和管理这些流水线可能很困难。我们介绍了 FlumeJava,一个Java库,它简化了开发、测试和运行高效数据并行流水线的过程。FlumeJava 库核心是一些代表不可变并行集合的类,每个类都支持一些操作,用于并行处理这些集合。并行集合及其操作提供了一个简单的、高层次的、统一的抽象,覆盖了不同的数据表示和执行策略。为了使并行操作能够高效运行,FlumeJava 推迟了它们的评估,而是在内部构建了一个执行计划数据流图。当最终需要并行操作的结果时,FlumeJava首先优化执行计划,然后在适当的底层原语(例如,MapReduces)上执行优化后的操作。并行数据和计算的高层抽象、延迟评估和优化以及高效的并行原语的结合,产生了一个易于使用的系统,其效率接近手动优化的流水线。FlumeJava目前正被谷歌内部数百名流水线开发者积极使用。

FlumeJava 是 Google 内部开发的一个库,专门用于简化大规模数据处理工作。它没有被开源。不过,FlumeJava 的概念和设计哲学影响了许多开源项目。
相似的开源实现最为出名的 Apache Beam:这是一个更广为人知的、由 Google 贡献给 Apache 软件基金会的开源项目。Apache Beam 提供了一种统一的编程模型,用于定义和执行数据处理工作流。这个项目的目标是允许你编写一次数据处理代码,然后在多个执行引擎(如 Apache Flink、Apache Spark 和 Google Cloud Dataflow)上运行。

Read more »

背景

  • 使用 Postgresql Jdbc Driver 读取大量数据

    1
    2
    3
    4
    5
    <dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.6.0</version>
    </dependency>
  • 读取的数据中包含 timestamp with time zone 与 time with time zone

  • Pg Server 是 +08:00 时区

Read more »

主要概念解释

  • Reader:数据采集模块,负责数据读取,将数据发送给 Channel。
  • Writer:数据写入模块,负责不断读取 Channel 的数据,并将 Channel 的数据写入到目的端。
  • Channel:通过 pushXpullX 接口提供 Plugins 数据通道能力,同时统一统计、限速能力。
  • RecordSender:基于 Channel 封装的接口,用于 Reader 将 Record 传递到框架
  • RecordReceiver:基于 Channel 封装的接口,用于 Writer 从框架获取 Recrod
  • Job:单个数据同步的作业,DataX接受到一个Job之后,将启动一个进程来完成整个作业同步过程。DataX Job 模块是单个作业的中枢管理节点,承担了数据清理、子任务切分(将单一作业计算转化为多个子 Task)、TaskGroup 管理等功能。
  • Task:Task 是 DataX 作业的最小单元,每一个 Task 都会负责一部分数据的同步工作。Task 由 TaskGroup 进行管理。Task 会固定启动 Reader -> Channel -> Writer 的线程来进行同步工作。
  • TaskGroup:管理一组 Task 的运行。
Read more »

结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
├── agent							[ClassLoader/代理启动]
├── arthas-agent-attach [Agent Attach?]
├── arthas-spring-boot-starter [针对 spring boot-2 提供的自动集成技能]
├── arthas-vmtool [JVM 工具模块]
├── async-profiler [profiler 的 so 文件]
├── bin [shell 脚本]
├── boot [启动模块]
├── client [client 模块]
├── common [通用模块]
├── core [核心功能模块]
├── demo [demo 展示]
├── lib [arthas jni]
├── math-game [demo]
├── memorycompiler [动态编译模块]
├── packaging [打包专用]
├── site [arthas 官网信息]
├── spy [定义 SPI(方法执行前后插入点)]
├── testcase [测试 case]
├── tunnel-client [tunnel-client/server 均是为了提供管理多个 arthas 的能力]
├── tunnel-common
├── tunnel-server
└── tutorials
Read more »
0%