智能体刷屏的背后,是 AI 应用拐点的来临?AICon 北京站议程重磅公布,50+ 硬核分享不容错过 了解详情
写点什么

Uber 系统从 Postgres 迁移到 MySQL

  • 2016-08-25
  • 本文字数:986 字

    阅读完需:约 3 分钟

Uber 最近在博客中详细阐述了他们为什么要使用MySQL 来替代PostgreSQL 。Uber 遇到的主要困难源于Postgres 的写入放大问题。写入放大是在对涉及索引的单行数据进行更新时,需要更新所有的索引,从而导致大量对磁盘的写操作,在使用固态硬盘时这个问题更加严重。 HOT(Heap-Only-Tuples) 特性可以缓解这个问题,这在一些用例中也许是一个解决方案。因此,写入放大问题泄漏到了复制过程中,造成为了一些简单的更新而在副本间传播多个更新操作。在灾难恢复的场景中,由于数据中心之间可能相距较远,并且无法获得廉价、便利的带宽,就会导致重大问题。

在 Postgres 9.2 的一次常规更新中,一个 bug 导致了一些表的数据损坏。这是由于没有标记一些应该被标记为不活跃的数据所导致的。无法计算这个 bug 这所影响到的数据总数,而且由于复制是发生在物理层,这也就存在着损坏数据库索引的风险。

Postgres 的副本并没有真正支持多版本并发控制(MVCC)。副本必须和主节点使用一致的预写式日志(WAL: Write Ahead Log )。加上如果更新操作涉及其他事务中已打开的行,Postgres 会将其阻塞,这在很大程度上会影响长事务(long running transaction)。一旦长事务阻塞了预写式日志线程,就会被 Postgres 终止,如果应用开发人员没有意识到这点,特别是在使用事务边界不透明的对象关系映射(ORM)时,就会带来问题。

再一次由于复制过程是工作在物理层,数据库更新不得不在所有副本间同时进行,不然复制无法正常工作。这意味着就 Uber 的规模来说,升级到当时的新版本真的会造成很多问题。这个问题已经自 9.4 版本之后使用 pglogical 修复了。

在决定 Uber 案例的设计方案时,设计者看重 MySQL 的优势有:拥有灵活的副本、每个连接使用轻量级的线程而不是进程、廉价的缓存。应对磁盘存储上的主要问题,则使用 InnoDB 存储,使压缩更高效而不会影响大量索引或引起 Postgres 中的写入放大问题。

Markus Winand Simon Riggs Robert Haas 针对 Uber 用例提出了一些很好的反驳。他们详细阐述了在诸多用例中如何解决上述问题,以及为什么并不是对每个案例都应该抛弃 Postgres 而使用 MySQL,反之亦然。

查看英文原文: Uber Engineering Moving from Postgres to MySQL


感谢百占辉对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-08-25 19:004376
用户头像

发布了 41 篇内容, 共 15.0 次阅读, 收获喜欢 3 次。

关注

评论

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

产品经理训练营作业 02

KingSwim

开发质量提升系列:标准模板(中)

罗小龙

最佳实践 方法论 28天写作

python爬虫入门-通过茅台脚本讲些爬虫知识,应用和价值

大佬sam

Python python 爬虫 2月春节不断更

产品训练营第二章作业(二)

Arnold

不会开发的你也能管理好企业漏洞,开源免费工具:洞察(insight II)

BigYoung

安全 安全漏洞 28天写作 2月春节不断更

一文看完TCP/IP协议基础知识点

Spring - IOC

小马哥

Java 架构师 spring 5 七日更

分页方式,看这一篇就够了。

大伟

分页

翻译:《实用的Python编程》00_Setup

codists

Python

学习计算机视觉

IT蜗壳-Tango

OpenCV 计算机视觉 2月春节不断更

管理笔记[4]:组织管理的目标就是实现1+1>2

L3C老司机

翻译:《实用的Python编程》README

codists

Python

28天瞎写的第二百三十五天:客服得有多专业?

树上

28天写作

持续交付

lidaobing

持续交付 28天写作

硬核!八张图搞懂 Flink 端到端精准一次处理语义 Exactly-once(深入原理,建议收藏)

五分钟学大数据

大数据 flink

产品训练营-作业3

简小一

京东支付SDK重构设计与实现

京东数科风险算法与技术

被接连封杀后,出海的“TikTok们”都打算如何做?

李忠良

28天写作

极客大学·产品经理训练营·第二章作业(二)

二大爷

极客大学 产品训练营

机器学习·笔记之:Matrices and Vectors

Nydia

精美的淘客项目完全开源啦,确定不来围观吗

Silently9527

Vue mybatis springboot uniapp

《学会写作》学习笔记之如何拟标题

JiangX

28天写作

「产品经理训练营」作业03:利益相关方识别

狷介

产品经理训练营

批判性思维自修课(六)

石君

28天写作 批判性思维

架构师训练营第十周作业

zamkai

为啥写的mybatis插件没用?一场mybatis插件加载机制的探索之旅

altantisor

spring Boot Starter mybatis源码

【并发编程的艺术】详解单例模式的实现方式(Java)

程序员架构进阶

设计模式 Java内存模型 七日更 28天写作 2月春节不断更

【LeetCode】子集问题debug模式查看数据变化

Albert

算法 LeetCode 2月春节不断更

产品训练营第三次作业

Geek_79e983

图解计算机结构与体系分类!!

冰河

编程 程序员 高并发 计算机结构 操作系统原理

创业失败启示录|样茶里的商机

阿萌

28天写作 创业失败启示录 青城 2月春节不断更

Uber系统从Postgres迁移到MySQL_数据库_Alex Giamas_InfoQ精选文章