Uber 工程师们使用 MySQL 存储 Schemaless 的数据
本文介绍了驱动 Uber 自 2014 到 2018 年以来的存储 trip 这种 schemaless 数据的解决方案。本文是 Part 1.
- 问题:
- 2014 年的存储 trip 数据的数据库空间到当年年底马上就要到顶放不下了。
- 关于不用商用/开源的可扩展 datastore 考量:
- 能线性扩展
- 需要写可靠(Write Availability),即写入失败有个机制可以重试。(尝试理解了下,他们希望尽可能的存储数据,对于写失败不是一股脑的报错)
- 能通知下游依赖。先前这个流程是 error-prone 的:中间一步失败,即使部分成功,还得全部再执行一遍。他们希望改成错误能隔离开。
- 需要 index
- 需要 Operation 能够快速响应,即便在半夜。
- 考量的对象有 Cassandra, Riak, MongoDB, 但不完全满足,Yeeha,造轮时间到了。
- 设计:
- 从头造一个 KV 数据库,存储 JSON 数据,没有 schema 验证。当 Master 失效,还能从 AppendOnly Sharded 节点的 buffered writes 中恢复。支持 pub/sub 那些数据变更。基于数据能做全局索引。
- 数据结构,是一个稀疏的三维 persistent hash map。最小单元是 cell, 是 JSON blob,不可变,不能变,不能删。JSON blob 有 UUID 字段作为 row key 作为主键,有 column name 字段作为表名,有 ref key 用来标记 cell 的版本。
- pub/sub 部分没有提及如何解决隔离错误的那个需求。
- Index 需要预定义要被索引的字段。Cell data 会被直接丢进 index,这样查找的时候就找到了全部数据,不需要再去主表反查 uuid。索引可以满足最终一致性。
衍生思考:Uber 的考量核心是数据写的高度可靠和变更在系统内异步传导。