昨晚(1204)邀请在 PingCAP 工作的老弟屈鹏到 dubbogo 社区在线讲解 TiDB,其间讲到 TiDB 并没有百分百兼容 MySQL,因为 MySQL 有些 bug,TiDB 将错就错照着实现了,而有些 bug 实在无法也去照着兼容实现,线上有社区同学质疑道,MySQL 也有 bug 吗?

且不论只要是软件都会有 bug,TiDB 为了兼容 MySQL,其 bug 也要兼容实现,实在令人匪夷所思。其中一些原因是银行在替换 MySQL 的过程中,对 TiDB 进行评估时,判断标准是 TiDB 的计算结果与 MySQL 是否一致,TiDB 为了做到结算结果一致,其中一些功能便会依照 MySQL Bug 一并实现。

1 一次思想实验

这便引申出一个话题,如何在不可靠的软硬件体系之上构建可靠的计算体系。作为吃瓜群众一方,我们可以与银行一方,进行如下思想实验:

吃瓜群众:你们银行方面不知道 MySQL 有 bug 吗?
银行:我们是知道的。
吃瓜群众:那为何不绕开这个 bug?
银行:含有此 bug 的 MySQL 功能很重要,不能因为这个 bug 便舍弃功能不用。诚如不能因为会拉屎撒尿,便否认熊猫不是可爱的动物。
吃瓜群众:换一个 DB 不行吗?
银行:bug 分为已知 bug 和 未知 bug,我们使用 MySQL 已久,它的大部分问题我们是清楚的。如果换一个我们不熟悉的 DB,且不说切换后导致的开发运维成本,新 DB 即便保证在这个功能上无 bug,它肯定还有其他潜在的 bug,因为所有的软件都有 bug。或者说,他们都不会保证他们 100% 不会不出 bug。
吃瓜群众:所有的软件都必然会有 bug?
银行:是的。就算软件不会出 bug,底层的硬件体系也不能保证 100% 不出问题。
吃瓜群众:硬件也不可靠吗?
银行:是的,AWS 就曾出过一次事故,某次阳光紫外线照射到 AWS 的机器内存后,导致一些 bit 位翻转,而新数据的 checksum 恰好又与老数据的 checksum 一致,这便导致了一次严重事故。当然这种事故,大概也只有亚马逊这种级别的公司有实力和意愿去追究发现,如果资损不严重,一般实体是不愿意去深究的。其实我们的整个通信体系也不是 100% 可靠的,譬如 TCP 协议以及其依赖的 IP 层协议包都有一个 checksum 字段,这些都是整个软硬件体系不可靠的明证。
吃瓜群众:那你们银行如何保证我们财产的安全性?
银行:针对 MySQL 已有的 bug,如果该功能非主要功能,则事前规避不用。如果该功能很重要,则调查触发已知 bug 的边缘条件,然后在上层应用中规避。银行每天还会进行常规性的对账,核对资损,通过事后补偿的手段保证资金的绝对安全性。

2 Go sync.Pool

关于 MySQL bug 的话题,让我回想起前一阵子 dubbogo 所依赖的网络库 getty 遇到的一次问题。今年 9 月 11 日【真是一个好日子】集团相关同学反馈 getty “在一个大量使用短链接的场景,XX 发现造成内存大量占用,因为大块的buffer被收集起来了,没有被释放”。

通过定位,发现原因是 sync.Pool 把大量的 bytes.Buffer 对象缓存起来后没有释放。集团的同学简单粗暴地去掉了 sync.Pool 后,问题得以解决。复盘这个问题,其根因是 Go 1.13 对 sync.Pool 进行了优化:在 1.13 之前 pool 中每个对象的生命周期是两次 gc 之间的时间间隔,每次 gc 后 pool 中的对象会被释放掉,1.13 之后可以做到 pool 中每个对象在每次 gc 后不会一次将 pool 内对象全部回收。

所以,Go 官方没有 ”修复“ sync.Pool 的这个 bug ,其上层的 dubbogo 还能稳定运行,当他们 ”修复“ 之后,上层的 dubbogo 运行反而出了问题。

Go 语言 另外一个比较著名的例子便是 godebug=madvdontneed=1。Go 1.12 对其内存分配算法做了改进:Go runtime 在释放内存时,使用了一个自认为更加高效的 MADV_FREE 而不是之前的 MADV_DONTNEED,其导致的后果是 Go 程序释放内存后,RSS 不会立刻下降。这影响了很多程序监控指标的准确性,在大家怨声载道的抱怨后,Go 1.16 又改回了默认的内存分配算法。

3 Gosling 的看法

关于软件的 bug 是否应该修复这个问题,个人的看法是,对于出现的大部分 bug 我们当然需要修复。但对于一些有着悠久历史的 bug,需要慎重对待。

今年 11 月,Java之父 James Gosling 在一次名为 ”你需要的软件可靠性越高,静态类型语言的帮助就越大“ 的采访中,有如下论道。

经常让人感到不适的地方是:如果某个功能存在 bug,人们为这个 bug 采取了变通方法,如果你修复了 bug,你可能会打破这些变通方法。在 Java 世界中,确实有过这样的例子,我们要么决定不修复 bug,要么引入一种正确的方法,这甚至体现在硬件上。

现代的数字世界就是在这套看似 ”不可靠“ 的软硬件体系之上构建出来的。换言之,我们需要做的是,如何在有 bug 的软硬件体系上,构建出一个可稳定运转且最终数据一致的数字世界。即便后退一步,如果做不到数据严格一致,如何把资损控制在最小范围, 控制到我们可接受的范围内。

MySQL 的 bug 必须修复吗?相关推荐

  1. MySQL恢复 利用innodb_force_recovery修复MySQL数据页损坏

    现象:启动MySQL服务时报1067错误,服务无法启动. 查看xxx.err错误日志发现有数据页损坏信息: InnoDB: Database page corruption on disk or a  ...

  2. EasyTable2.1 功能更加强大,bug全面修复的html table插件!

    2015年5月25日更新,目前et已经升级到2.1的版本了,具体请看链接:http://download.csdn.net/detail/sinolzeng/8735873 我已经将所有内容做成dem ...

  3. mysql batch insert 遇到错误跳过_这是MySQL的bug吗?

    前语:不要为了读文章而读文章,一定要带着问题来读文章,勤思考.在此,建议大家为本公众号加"星标".如文章写得好,望大家阅读后在右下边"在看"处点个赞,以示鼓励! ...

  4. Alibaba-AndFix Bug热修复框架的使用

    目录(?)[+] AndFix 这篇主要介绍alibaba的AndFix项目的使用,下一篇介绍 AndFix原理及源码解析. Github:https://github.com/alibaba/And ...

  5. Alibaba-AndFix Bug热修复框架原理及源码解析

    小憩之后,继续为你解读AndFix热修复框架,呵呵. 上一篇Alibaba-AndFix Bug热修复框架的使用已经介绍了AndFix的使用,这篇主要介绍AndFix原理以及源码解析. AndFix原 ...

  6. mysql无法启动修复_记一次MySQL无法启动及修复经历

    记得有次本地的MySQL无法启动,网上说,去删掉InnoDB日志就行,我就傻乎乎的去删掉了InnoDB相关的文件,果然,没有任何问题,正常启动了. 可是谁曾想,过了几天,故障复现了,我就按部就班的又去 ...

  7. 携程回应突发故障:「bug已修复」;罗永浩再嘲iPhone11浴霸相机;React 16.10.0发布|极客头条...

    快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...

  8. 光遇服务器修复时间,光遇:测试服调整,瞬间Bug被修复?几家欢喜几家愁

    原标题:光遇:测试服调整,瞬间Bug被修复?几家欢喜几家愁 光遇:测试服调整,瞬间Bug被修复?几家欢喜几家愁 前言: 大家好,我是喜欢玩游戏.聊游戏的孟婆小叔.虽然光遇并非是竞技类游戏,主打社交文化 ...

  9. 怀旧服服务器维护后刷稀有怪么,魔兽怀旧服,这些BUG被修复了,别再尝试了

    原标题:魔兽怀旧服,这些BUG被修复了,别再尝试了 "随着怀旧服各阶段相继开放,4阶段中期祖格副本的期待度已经并没有之前预想中那么高,而7分钟的BUG神哈卡首down也彰显着团本削弱给玩家带 ...

最新文章

  1. unity2018关联不到vs_律道|蓝月传奇VS烈焰武尊:角色扮演类游戏独创性如何认定?...
  2. python compiler库_Python之compiler:compiler库的简介、安装、使用方法之详细攻略
  3. TCP/IP详解--学习笔记(11)-TCP交互数据流,成块数据流
  4. JavaScript window.location物
  5. java chinapay_通过PHP/Java Bridge来实现ecshop的chinapay支付接口
  6. 密码学哈希函数_哈希函数在密码学中的应用
  7. Linux设备树相关函数
  8. PotPlayer优化与最高画质设置(最强本地播放器)
  9. Dijkstra及其堆优化
  10. 用Python 操作Web 前端 基础 1
  11. Grasshopper and Rhino: Python Scripting Grasshopper和Rhino:Python脚本 Lynda课程中文字幕
  12. Python实现读写txt文件的方法
  13. 教你一招:Win10系统如何正确卸载edge浏览器?
  14. 阿里云虚拟主机和服务器的区别
  15. 2.4 zio入门——ZIO类型参数
  16. 恢复计算机管理员权限软件,帮您修复win10系统管理员权限的恢复步骤
  17. 隔壁住了个十分好看的妹子,作为程序员的我会怎么办?
  18. spread运算符_JavaScript中的Spread运算符有什么用?
  19. SpringCloud停更服务一览表
  20. Python装饰器——四两拨千斤还是杀鸡用牛刀?

热门文章

  1. 微型计算机组装实验报告虚拟,微型计算机组装与维护实训(附光盘)
  2. ai外呼营销系统_为了让居民预约口罩少出门,长宁这个街道使用AI技术智能语音外呼系统...
  3. 代码详细解析简单常用DOS命令 java会用这些就够了!
  4. 揭秘:蚂蚁金服bPaaS究竟是什么?
  5. java 分布式电子商务云平台b2b b2c o2o需要准备哪些技术??
  6. 代理服务器https协议单站点开通注意事项
  7. SSIS技巧--优化数据流缓存
  8. [笔记][mooc]《程序设计入门—C语言》
  9. 常用的web安全处理
  10. 整理你的个人IT资料库