InfoQ Uber为什么放弃Postgres选择迁移到MySQL?( 四 )
我们遇到的错误只出现在Postgres9.2的某些版本中 , 并且已经修复了很长时间了 。 但是 , 我们仍然担心此类错误会再次发生 。 新版本的Postgres可能还会出现此类错误 , 并且由于数据复制的方式 , 这类问题有可能被传播到所有的数据库中 。
副本MVCC
Postgres没有提供真正的副本MVCC支持 。 副本只应用WAL更新 , 导致它们在任何时候都具有与主数据库相同的磁盘数据副本 。 这种设计给Uber带来了麻烦 。
Postgres需要为MVCC维护旧数据的一个副本 。 如果流式复制遇到一个正在执行的事务 , 而数据库更新影响到了事务范围内的行 , 那么更新操作就会被阻塞 。 在这种情况下 , Postgres会暂停WAL线程 , 直到事务结束 。 如果事务处理要花费很长时间 , 这就会是个问题 , 因为副本可能严重滞后于主数据库 。 因此 , Postgres在这种情况下应用超时策略:如果一个事务导致WAL发生阻塞一定的时间 , Postgres将会终止这个事务 。
这种设计意味着副本通常会比主数据库落后几秒钟 , 很容易出现事务被终止的情况 。 例如 , 假设开发人员写了一些代码 , 需要通过电子邮件将收据发送给用户 。 根据编写方式的不同 , 代码可能会隐式地让数据库事务处于打开状态 , 直到电子邮件完成发送为止 。 尽管在执行不相关的阻塞IO时一直打开数据库事务是很糟糕的做法 , 但大多数工程师并不是数据库专家 , 他们可能也不知道有这个问题 , 特别是在使用隐藏了底层细节的ORM框架时 。
升级Postgres
由于复制发生在物理层面 , 所以我们无法在Postgres的不同版本之间复制数据 。 Postgres9.3的主数据库不能被复制到Postgres9.2的副本 , 而Postgres9.2的主数据库也不能被复制到Postgres9.3的副本 。
我们按照以下这些步骤从一个PostgresGA版本升级到另一个版本:
关闭主数据库
在主数据库上运行pg_upgrade命令 , 这个命令会就地更新主数据库数据对于大型数据库 , 通常需要花费数小时 , 并且在这个过程过程中无法从主数据库读取数据
再次启动主数据库
创建主数据库的最新快照 。 这一步骤完全复制了主数据库的所有数据 , 因此大型数据库也需要花费数小时
擦除所有副本 , 并将最新的快照从主数据库还原到副本上
将副本带回到复制层次结构中 。 等待副本完全跟上主数据库的所有更新
我们从Postgres9.1开始 , 并成功完成了升级过程 , 迁移到了Postgres9.2 。 但是 , 这个过程花费了数小时 , 我们无力承担再次执行这种升级过程的费用 。 到Postgres9.3发布时 , Uber的规模增长极大增加了我们的数据集 , 因此升级时间就变得更长了 。 因此 , 即使Postgres9.5已经发布了 , 我们的Postgres实例仍然是9.2版本 。
如果你的Postgres是9.4或更高版本 , 可以使用pgologic之类的东西 , 它为Postgres实现了一个逻辑复制层 。 你可以用它在不同的Postgres版本之间复制数据 , 这意味着可以从9.4升级到9.5 , 而不会造成大面积停机 。 不过 , 这个功能仍然是有问题的 , 因为它尚未被集成到Postgres主线中 。 而对于那些使用较旧版本的Postgres的人来说 , pgologic并不适用 。
3
MySQL架构
上文解释了Postgres的一些局限性 , 接下来 , 我们将解释为什么MySQL会成为Uber工程团队存储项目(例如Schemaless)的新工具 。 在很多情况下 , 我们发现MySQL更适合我们的使用场景 。 为了理解这些差异 , 我们研究了MySQL的架构 , 并将其与Postgres进行了对比 。 我们专门分析了MySQL的InnoDB存储引擎 。
InnoDB的磁盘表示
与Postgres一样 , InnoDB支持MVCC和可变数据等高级功能 。 关于InnoDB磁盘表示的详尽细节不在本文的讨论范围之内 , 我们将把重点放在它与Postgres的主要区别上 。
最主要的架构差异是:Postgres直接将索引记录映射到磁盘上的位置 , 而InnoDB使用了二级结构 。 InnoDB的二级索引有一个指向主键值的指针 , 而不是指向磁盘位置的指针(如Postgres中的ctid) 。 因此 , MySQL会将二级索引将索引键与主键相关联:
推荐阅读
- 前有iPhone 12,后有Mate 40,为什么我却攥着中兴天机Axon 20 5G不放
- 机核网|为什么我觉得《刺客信条》越来越差了:游戏性篇
- 捷途|买新车时,为什么4S店都要送贴膜?原来里面这么多猫腻,太坑了
- 做你一辈子的蜡笔|西方为什么不假思索的污蔑中国?因为我们的这个错误!
- 暖日科技盈如|这到底是为什么?,俄罗斯华人给出劝告:最好别跟俄罗斯女孩结婚
- 什么值得买|为什么要精养信用卡?因为信用卡背后有你想象不到的财富!
- 汽车之家|我想说因为了解因此喜欢,别人总问我为什么喜欢风光ix5
- 电动大咖|3的为什么是宏光MINI EV,打败特斯拉Model
- 给你说个车|都不会考虑四驱,这是为什么呢?,多数人在买SUV时
- |为什么每一年的高考试卷,要安排在监狱里面印刷?原因你可能不信