使用MySQL的Muber Engineering的旅行数据存储的体系结构

0.
使用MySQL的Muber Engineering的旅行数据存储的体系结构

Uber的基础架构如何使用MySQL的模板,该数据存储在维护uber工程缩放自2014年10月以来。这是三个 - 三的第二部分部分系列在概要上;第一部分是在设计艺术

项目夹层:优步的大迁移,我们描述了我们如何从单个迁移优步的核心旅行数据postgres.实例是模板,我们可扩展且高度可用的数据存储。然后我们给了概要概述----开发决策过程,整体数据模型 - 和介绍的功能如模式触发和索引。本文介绍了艺术模式的架构。

概念概要

要回顾,SmancleAss是可扩展和容错数据存储。数据的基本实体称为单元格。它是不可变的,一旦写成,它就无法覆盖。(在特殊情况下,我们可以删除旧记录。)单元格由行键,列名称和REF键引用。通过使用更高的REF键但相同的行键和列名称来编写新版本,更新单元格的内容。LefureAless不在其内部存储的数据上强制执行任何模式;由此得名。从艺术角度来看,它只是商店杰森对象。概要支持高效,最终一致的辅助索引在单元格的字段上。

建筑学

Smancleess有两种类型的节点:工作者节点和存储节点,位于同一物理/虚拟主机或单独的主机上。工作人员节点接收客户端请求,将请求扇出到存储节点,并聚合结果。存储节点包含在相同存储节点上的单个或多个单元格检索的方式中的数据。我们将两个节点类型分开以独立缩放每个部件。概要概述如下所示:

概要概述

工人节点

Lefuremaless客户端通过工作节点通信http.端点。这些路由请求到存储节点,如果需要,将结果聚合到存储节点,并处理后台作业。为了处理慢速或失败的工作人员节点,客户端库将透明地尝试其他主机并重试失败的请求。写入lequeraless的请求是Idempotent.,所以每个请求都是安全的(一个非常好的财产)。此功能由客户端库利用。

存储节点

我们将数据分为固定数量的分片(通常配置为4096),然后我们将其映射到存储节点。基于小区的行键映射到碎片的单元。每个碎片都被复制到可配置的存储节点数量。统称,这些存储节点形成存储群集,每个存储群组一个大师和两个仆从。在灾难性数据中心中断的情况下,派对(也称为副本)分布在多个数据中心中,以提供数据冗余。

读写请求

当示例服务器服务读取请求时,例如读取小区或查询索引时,工作节点可以从其群集中的任何存储节点读取数据。从硕士或派对的存储节点读取可在每个请求的基础上配置;默认值是从主站读取,这意味着客户端被保证查看其写入请求的结果。写请求(插入单元格的请求)必须转到单元格群集的主站。更新主数据后,存储节点将异步复制到群集的统计码头。

处理失败

分布式数据存储系统的一个有趣方面是它们如何处理故障,例如存储节点无法响应请求(Master或Minion)。旨在最小化存储节点的读写请求失败的影响最小化。

阅读请求

大师和宗机的设置意味着它可以在群集中的一个节点可用时提供读取请求。如果Master可用,则可以通过查询它来始终返回最新数据。如果Master不可用,则某些数据可能没有传播到矿物,因此MefureAless可能会返回陈旧数据。然而,在生产中,我们通常会看到复制的亚群延迟,因此搭档的数据趋于新鲜。工作者节点使用断路器模式在存储节点连接上以检测存储节点遇到麻烦的连接。这样,将故障转移读取到另一个节点。

写请求

逐渐下降的一分钟不会影响写入;他们去了主人。但是如果主设备已关闭,因此仍然接受写入请求,但它们仍然坚持在另一个(随机选择的)主机上磁盘。这类似于暗示的切换在诸如发电机或者卡桑德拉。写入另一个主人意味着在主设备上升之前或者如果宣传拨码,则无法读取随后的读取请求。实际上,概要始终写入其他主人来处理异步复制中的故障;我们调用此技术缓冲写入(在下一节中描述)。

使用单个节点进行接收写入产生许多优点和缺点。一个优点是它给了一个总订单写信给每个碎片。这是我们的异步处理框架的模板触发的重要属性(在第一个概要文章中提到),因为它可以从任何节点读取分片的数据,并且仍然保证相同的处理顺序。在群集中的所有节点上的单元格写序列相同。因此,在某种意义上,可以将Schemaless的碎片视为分区单元格修订日志。

对于单个主人来说,最突出的缺点是群集中的主机是否已关闭,我们将在无法读取的其他位置进行缓冲。这个不方便的情况的上行程序是,如果主设备掉了,因此,如果客户端,则可以知道客户端不会立即读取。

缓冲写道

自模板使用以来mysql.异步复制,如果主机接收到写请求,则写入将丢失,持续请求,然后在将写入写入码头(例如,在硬盘驱动器故障中)之前失败。要解决这个问题,我们使用一个调用的技术缓冲写道。缓冲写入最大限度地减少通过将数据写入多个群集而失去数据的可能性。如果主人关闭,则数据不会随后读取不易使用,但仍未持久。

通过缓冲写入,当工作节点接收到写请求时,它将请求写入两个群集:a中学一种基本的(以该顺序)。客户被告知,只有在成功时,写作只有在成功。请参阅下图:

客户被告知,只有在成功时,写作成功

主母版本是预期在后续读取的数据的位置。如果主群集的主机在异步MySQL复制将单元格复制到主码头之前,则辅助主服务器用作数据的临时备份。

辅助主机随机选择,写入特殊缓冲表。后台作业监视小区出现的主要码头;只有这样,它才会从缓冲表中删除单元格。具有辅助集群意味着所有数据都写在至少两个主机上。此外,辅助主控器的数量是可配置的。

缓冲写入使用幂等;如果已经存在了具有给定行键,列名和REF键的单元,则拒绝写入。IDEMPoTence方面意味着只要缓冲的单元格具有不同的行键,列名称和REF键,它们就会在其主站备份时写入主群集。另一方面,如果缓冲了具有相同行密钥,列名和REF键的多个写入,则只有其中一个将成功;当主群集备份时,其余部分被拒绝。

使用MySQL作为存储后端

大量的概要电源(和简单性)来自我们在存储节点中使用MySQL。ModeAless本身是一个相对薄的层,位于MySQL的顶部,用于将请求路由到右侧数据库。通过使用MySQL索引和内置的缓存Innodb.,我们为小区和次要索引获得快速查询性能。

每个模式碎片都是单独的MySQL数据库,每个MySQL数据库服务器都包含一组MySQL数据库。每个数据库都包含一个用于单元格(称为实体表)的MySQL表,以及每个辅助索引的MySQL表以及一组辅助表。每个模式单元都是实体表中的一行,并且具有以下MySQL表定义:

名称

类型
Adate_id. int,自动增量
row_key. uuid.
column_name. 细绳
ref_key.
身体 斑点
created_at. 约会时间

Adate_id.列是一个自动递增整数列,它是实体表的MySQL主键。拥有Adate_id.由于主键使MySQL在磁盘上线性地写入单元格。此外,Adate_id.用作每个小区的唯一指针,其触发器触发器用于以在插入时间的顺序上有效地提取小区。

row_key.column_name., 和ref_key.列包含,不出所料,每个艺术单元的行键,列名称和参考键。要通过这三列有效地查找单元格,请在这三列上定义复合MySQL索引。因此,我们可以有效地找到给定的行密钥和列名的所有单元格。

身体列包含单元格的JSON对象作为压缩MySQL BLOB。我们尝试使用各种编码和压缩算法并最终使用MessagePack.Zlib.由于压缩速度和尺寸。(更多关于这个在未来的文章中。)最后,created_at.当我们插入它时,列用于时间戳时间戳,并通过模式触发可用以在给定日期之后找到单元格。

使用此设置,我们让客户端控制架构而不更改MySQL中的布局;我们能够有效地查找细胞。此外,这是Adate_id.列使插入件在磁盘上线性写入,因此我们可以有效地将数据作为分区日志访问。

概括

今天的艺术模式是优步基础设施中大量服务的生产数据存储。我们的许多服务严重依赖于艺术的高可用性和可扩展性。

第3部分:使用触发器在概要上

第1部分:设计艺术

标题的照片学分:“百合有丝分裂“ 经过安德鲁斯,俄勒冈大学,尤金许可cc-by 2.0。图像裁剪用于标头尺寸和颜色校正。

标题说明:非洲地球百合中的能量存储结构:a延时仍然endosperm.正在接受细胞分裂

注释