写点什么

如何彻底解决数据存储同步难题?Netflix 推出数据同步和增强平台 Delta

2019 年 10 月 30 日

如何彻底解决数据存储同步难题?Netflix推出数据同步和增强平台Delta

前言

对于应用程序来说,使用多个数据存储是一种常见的模式,其中每个数据存储都用于满足特定的需求,如存储形式化数据(MySQL 等)、提供高级搜索功能(ElasticSearch 等)、缓存(Memcached 等)等等。通常,在使用多个数据存储时,其中一个用作主存储,其他用作次存储。现在的挑战是如何保持这些数据存储的同步。


我们已经观察到了一系列不同的模式,试图解决多数据存储的同步问题,比如双写、分布式事务等等。然而,这些方法在可行性、健壮性和可维护方面有局限性。除了数据同步之外,一些应用程序还需要通过调用外部服务来增强数据。


为了应对这些挑战,我们开发了 Delta。Delta 是一个最终一致的、事件驱动的数据同步和增强平台。


现有的解决方案

双写

为了保持两个数据存储的同步,可以执行双写操作,即在对一个数据存储执行写操作之后,对另一个数据存储执行写操作。第一个写操作可以重试,如果第一个写操作在用完重试次数之后失败,则可以中止第二个写操作。但是,如果第二个数据存储写入失败,这两个数据存储就会失去同步。一种常见的解决方案是构建一个修复例程,周期性地将第一个存储区中的数据重新应用到第二个存储,或者只有在检测到差异时才这样做。


问题:


实现修复例程通常是专用的,可能无法重用。另外,在应用修复例程之前,存储之间的数据是不同步的。如果涉及两个以上的数据存储,则解决方案会变得越来越复杂。最后,修复例程会在主数据源活动期间给其增加大量的压力。


变更日志表

当一组表发生变动(如插入、更新和删除)时,更改项会作为同一事务的一部分添加到日志表中。另一个线程或进程不断轮询日志表中的事件,并将它们写入一个或多个数据存储中,在所有数据存储确认后可选择从日志表中删除事件。


问题:


这需要作为一个库来实现,并且在理想情况下不需要对使用它的应用程序进行代码更改。在多语言环境中,需要对每种支持的语言重复实现这个库,并且很难确保跨语言时特性和行为的一致性。


模式更改的捕获还存在另一个问题,有些系统(如 MySQL)不支持事务性模式更改[1][2]。因此,执行更改(如模式更改)并以事务方式将其写入变更日志表的模式并不总是有效。


分布式事务

分布式事务可用于实现跨多个异构数据存储的事务,以便将写操作提交给所有相关存储或不提交。


问题:


事实证明,分布式事务跨异构数据存储是有问题的。本质上讲,它们只能依赖于参与系统的最小公分母。例如,如果应用程序进程在准备阶段失败,XA事务将阻塞执行;此外,XA 不提供死锁检测,也不支持乐观并发控制方案。而且,某些系统(如 ElasticSearch)不支持 XA 或其他任何异构事务模型。因此,对于应用程序[3]来说,要保证跨不同存储技术的写操作的原子性仍然是一个具有挑战性的问题。


Delta

开发 Delta 是为了解决现有数据同步解决方案的局限性,并允许动态地增强数据。我们的目标是从应用程序开发人员中抽象出这些复杂性,这样他们就可以专注于实现业务特性。下面,我们将描述“电影搜索”,这是 Netflix 内部使用 Delta 的一个实际用例。


在 Netflix,微服务架构被广泛采用,每个微服务通常只处理一种类型的数据。核心电影数据驻留在一个称为 Movie Service 的微服务中,而诸如电影交易、人才、供应商等相关数据则由多个其他的微服务(例如 Deal Service、Talent Service 和 Vendor Service)提供。Netflix 工作室的企业用户通常需要根据不同的标准搜索电影以便跟踪制作情况,因此,对他们来说,能够搜索与电影相关的所有数据至关重要。


在采用 Delta 之前,电影搜索团队在索引电影数据之前必须从多个其他的微服务获取数据。此外,团队必须构建一个系统,通过查询其他人的更改来定期更新他们的搜索索引,即使根本没有更改。这个系统很快就变得非常复杂且难以维护。



图 1 采用 Delta 之前的轮询系统


在上了 Delta 之后,系统被简化为一个事件驱动系统,如下图所示。CDC (Change-Data-Capture)事件由 Delta-Connector 发送到 Keystone Kafka 主题。使用 Delta 流处理框架构建的 Delta 应用程序会消费该主题中的 CDC 事件,然后调用其他微服务来增强每个事件,并最终将增强后的数据发送到 Elasticsearch 中的搜索索引。整个过程几乎是实时的,这意味着只要将更改提交到数据存储,搜索索引就会更新。



图 2 使用 Delta 实现的数据管道


在接下来的部分中,我们将描述连接到数据存储并将 CDC 事件发布到传输层的 Delta-Connector。传输层则将 CDC 事件路由到 Kafka 主题的实时数据传输基础设施。最后,我们将描述应用程序开发人员可以用来构建他们的数据处理和增强逻辑的 Delta 流处理框架。


CDC(变更数据捕获)

我们开发了一个名为 Delta-Connector 的 CDC 服务,它能够实时捕获数据存储中提交的更改并将其写入流。实时更改是从数据存储的事务日志和转储中捕获的。之所以采用转储,是因为事务日志通常不包含更改的完整历史记录。更改通常被序列化为 Delta 事件,因此,如果更改来自事务日志或转储,使用者就无需担心。


连接器提供多种先进的功能,如:


  • 除 Kafka 之外,还能够写进自定义输出。

  • 能够在任何时候触发针对所有表、特定表或特定主键的手动转储。

  • 可以以块的形式获取转储,因此在出现故障时不需要从头开始重做一遍。

  • 不需要获取表锁,这对于确保数据库上的写流量不会被我们的服务阻塞是至关重要的。

  • 通过跨 AWS 可用性区域的备用实例实现高可用。


我们目前支持 MySQL 和 Postgres,包括部署在 AWS RDS 及其 Aurora 版本中的时候。此外,我们支持 Cassandra(多主机)。我们将在以后的博文中更详细地介绍 Delta-Connector。


Kafka&传输层

Delta 事件的传输层基于Keystone平台的消息服务构建。


从历史上看,Netflix 的消息发布是针对可用性而不是持久性进行优化的(参见以前的博客)。折中的结果是各种边缘场景中可能出现代理数据不一致。例如,不洁群首选举将导致消费者可能重复或丢失事件。


对于 Delta,我们需要更强的持久性保证,以确保 CDC 事件能够到达次存储。为了实现这一点,我们提供了一个特殊用途的 Kafka 集群作为一个一等公民。下面是一些代理配置。



在 Keystone Kafka 集群中,不洁群首选举通常有利于生产者可用性。当一个不同步的副本被选为群首时,可能会导致消息丢失。对于新的高耐久性 Kafka 集群,为了防止这样的信息丢失,不洁群首选举被禁用。


我们还将复制因子从 2 增加到 3,并将最小同步副本从 1 增加到 2。写入此集群的生产者需要所有存储的应答,以确保 3 个副本中有 2 个拥有由生产者写入的最新消息。


当代理实例终止时,一个新实例将替换终止的代理。然而,这个新的代理将需要更新不同步的副本,这可能需要几个小时。为了提高此场景的恢复时间,我们开始使用块存储卷(Amazon Elastic block Store)代替代理上的本地磁盘。当新实例替换已终止的代理时,它现在就会附加已终止实例拥有的 EBS 卷,并开始捕捉新消息。这个过程将捕获时间从几小时减少到几分钟,因为新实例不再需要从空白状态复制。通常,存储和代理生命周期的独立大大降低了代理替换的影响。


为了进一步最大化我们的交付保证,我们使用了消息跟踪系统来检测由于极端情况造成的任何消息丢失(如分区群首的时钟漂移)。


流处理框架

Delta 的处理层基于 Netflix SPaaS 平台构建,该平台提供 Apache Flink 与 Netflix 生态系统的集成。该平台提供了一个自助服务 UI,在我们的容器管理平台 Titus 上管理 Flink 作业部署和 Flink 集群编排。自助服务 UI 还管理作业配置,并允许用户进行动态配置更改,而不必重新编译 Flink 作业。


Delta 提供了一个基于 Flink 和 SPaaS 的流处理框架,该框架使用注解驱动的 DSL(领域特定语言)来进一步抽象技术细节。例如,要定义一个通过调用外部服务来增强事件的步骤,用户只需编写以下 DSL,框架会将其转换为一个由 Flink 执行的模型。



图 3 Delta 应用程序中用于增强事件的 DSL 示例


处理框架不仅缩短了学习曲线,还提供了常见的流处理功能,如重复数据删除、规范化、弹性和容错,以解决一般的操作问题。


Delta 流处理框架由两个关键模块组成:DSL&API 模块和运行时模块。DSL&API 模块提供基于注解的 DSL 和 UDF(用户定义函数)API,供用户编写自定义处理逻辑(如过滤器和转换)。运行时模块提供 DSL 解析器实现,用于构建 DAG 模型中处理步骤的内部表示。执行组件解释 DAG 模型,初始化实际的 Flink 操作符并最终运行 Flink 应用程序。



图 4 Delta 流处理框架架构


这种方法有几个好处:


  • 用户可以专注于他们的业务逻辑,而不需要学习 Flink 或 SPaaS 框架的细节。

  • 可以通过对用户透明的方式进行优化,并且可以在不对用户代码(UDF)进行任何更改的情况下修复 Bug。

  • 操作 Delta 应用程序对于用户来说非常简单,因为框架提供了开箱即用的弹性和容错能力,并收集了多种粒度的可用于警报的指标。


生产使用情况

Delta 已经运行了一年多,在 Netflix Studio 的许多应用程序中都扮演了重要角色。它帮助团队实现搜索索引、数据仓库和事件驱动的工作流等用例。下面是 Delta 平台的高层架构图。



图 5 Delta 高层架构图


我们将在后续的博文中发布关于关键组件(如 Delta-Connector 和 Delta 流处理框架)的技术细节。敬请期待。如果你有任何问题,也可以随时联系作者。


本文最初发布于 Netflix 技术博客,由 InfoQ 中文站翻译并分享。


原文链接:


Delta: A Data Synchronization and Enrichment Platform


2019 年 10 月 30 日 08:001234

评论

发布
暂无评论
发现更多内容

分布式场景之刚性事务-2PC详解

奈学教育

分布式 2PC

人人都能看懂的 6 种限流实现方案!(纯干货)

王磊

Java 「Java 25周年」 Java 25 周年

架构师训练营-第一节

张小小的席大大

厉害了,SpaceX-API 开源了

非著名程序员

GitHub 程序员 开源项目

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

ATGU:阿宝哥

从SDL到DevSecOps:始终贯穿开发生命周期的安全

Fooying

DevOps SDL DevSecOps 安全开发 软件开发生命周期

CDN百科第三讲 | 如果用了云服务器,还需要做CDN加速吗?

阿里云Edge Plus

CDN

原创 | TDD工具集:JUnit、AssertJ和Mockito (十八)编写测试-测试执行顺序\嵌套的测试

编程道与术

Java 编程 TDD 单元测试 JUnit

9种 分布式ID生成方案,我替你整理好了

程序员内点事

Java MySQL 分布式

面试官为什么喜欢拿 Kafka 考验求职者

奈学教育

kafka

程序员未来会成为非常内卷的职业?

非著名程序员

程序员 程序人生 职业 职业规划

RUST IN BLOCKCHAIN 五月简报

Aimee 阿敏

rust crypto blockchain

Dubbo Cluster集群那点你不知道的事。

why技术

源码 面试 dubbo 集群容错

Java技术奇迹

ATGU:阿宝哥

《龙教授私享会职场沟通心法》最佳学习路线(2020最新版)

ATGU:阿宝哥

cpu分析利器 — async-profiler

小楼

Java cpu profiler

架构师训练营 - Lesson Week 1

brave heart

极客大学架构师训练营

实时更新:计算机编程语言排行榜—TIOBE世界编程语言排行榜(2020年6月份最新版)

ATGU:阿宝哥

装饰模式——看JDK和Spring是如何杜绝继承滥用的

海星

Java spring jdk 设计模式 Java 面试

绝对坦诚:打造团队自我进化能力的最佳姿势

伴鱼技术团队

团队管理 企业文化 团队协作 技术管理 文化

为什么你在群里的提的技术问题没人回答?

古时的风筝

程序员 提问的艺术

Elasticsearch-Base

lee

elasticsearch search 搜索

有时候爱也是一种负担

小天同学

日常思考 爱情 个人感悟

PlantUML 的介绍和使用

Puran

UML PlantUML

createRef、useRef、useMemo对比分析和应用场景

费马

React Hooks useRef useMemo createRef

C#和TS的范型实例化

猫定谔的靴

C# typescript 泛型

前端开发必备工具箱

LeanCloud

CSS 性能优化 前端 vscode 工具

观察者模式——窥探JDK和Spring中的设计模式

海星

spring jdk 设计模式 Java 面试 Java 25 周年

Vue&SpringBoot前后端项目分离构建

夏悸

Spring Boot Vue 前端架构

ChaosBlade:从零开始的混沌工程(一)

郭旭东

云原生 混沌工程

27岁了,程序员写给自己的一封信

学习Java的小姐姐

程序员 生活 总结 程序媛 职场回顾

打造 VUCA 时代的 10 倍速 IT 团队

打造 VUCA 时代的 10 倍速 IT 团队

如何彻底解决数据存储同步难题?Netflix推出数据同步和增强平台Delta-InfoQ