Facebook 宣布开源Python重写后的OnlineSchemaChange
本文会简要介绍,OnlineSchemaChange在经历从PHP到Python重写后的改进和变化
文章欢迎转载,但转载时请保留本段文字,并置于文章的顶部
作者:卢钧轶(cenalulu)
本文原文地址:https://github.com/cenalulu/cenalulu.github.io
英语原版: https://code.facebook.com/posts/1290069194423954
前言
Facebook早在2009年就开源了OnlineSchemaChange.php. 该工具主要设计初衷是用于补充当时MySQL对于在线表结构变更支持的空白,尽可能的减少表结构变更时对业务的影响。而在过去的几个月中这个工具经历了从PHP到Python重写,以及功能的新增和性能的改进。今天,重写后的OnlineSchemaChange正式宣布开源,可通过此链接访问:https://github.com/facebookincubator/OnlineSchemaChange
设计初衷和困境
最早,OSC是为了解决MySQL在进行表结构变更时锁表所带来的业务影响。同时,它也满足一部分DDL无法提供的功能。例如:ALTER TABLE IGNORE ... ENGINE=INNODB。
然而在PHP的使用过程中我们发现设计上缺陷和程序编写方式的问题导致这个工具的可扩展性较差,并且无法更好的进行功能测试。随着时间的积累,往这个工具增加新功能的难度越来越高,甚至修复bug都成了一个不可能完成的任务。同时功能测试的缺失也成为了吸纳社区贡献的一个重大阻碍,致使整个项目的活跃度下降。
因此在去年我们决定重写这个工具,同时加入更多我们向往已久的功能。
变化和改进
使用便捷
之前开源的OSC更多的像是一个概念和一段代码,本身无法直接使用。用户需要自己把核心逻辑封装成一个可执行的脚本。这个大大增加的OSC的可用度也从而导致了社区的接纳度不高。新版本的OSC.py是一个命令行可执行的脚本,很大程度上提高了易用性成为一个下载即可使用的工具。
同时,OSC.py的核心逻辑也独立成为Python Module存在。如果你的运维整体架构是基于Python搭建的那么新的OSC.py将可以很容易的融合到你的工具集当中。
可测试性
受到mysql-test-run的启发,新的OSC实现了一个类似的测试案例设计。及时是一个不懂Python的用户也可以非常容易的写出一个基于JSON+SQL的测试案例,提交一个issue来描述自己遇到的bug。同时这也使得吸纳社区patch的可靠性大幅提高。
同时受益于Python语言本身,整个工具也实现很高的单元测试覆盖度,可靠性有了很好的保障。
可靠性
和目前所有开源的在线表结构变更工具不同,OSC.py实现了一致性检验的功能。在Facebook数据一致性高于一切。一致性的检验可以让我们非常放心在任何时刻进行任何表结构变更而不用担心因工具bug而造成的数据丢失或者损毁。同时,一致性校验也是一种对社区用户负责的态度。MySQL的运行环境和配置参数千变万化,而Facebook的线上环境所能涵盖的只是一小部分。能在FB正常运行并不意味着这个工具就可以对bug免疫。一致性校验的存在可以让OSC.py优雅的避免各种环境变化所可能带来的潜在bug对数据的损坏。
要详细了解更多OSC.py带来的新特性可以查看这个wiki page
项目的展望
随着Row Based Replication的普及和在Facebook内部的全面部署,我们将会增加基于RBR binlog增量记录的功能,从而完全避免trigger模式带来的性能损耗。同时,我们也将会将原生在线表结构变更的支持增加到智能模式中,在实现一个工具满足所有表结构变更的需求的同时达到最小的不可用时间。
最后我们也非常希望和开源社区一起对OSC进行改进和开发,使之能成为一个更为可靠高效的DBA工具。
最后附上github的repo地址:https://github.com/facebookincubator/OnlineSchemaChange
Facebook 宣布开源Python重写后的OnlineSchemaChange的更多相关文章
- 2013 年 —— Facebook 在开源方面的工作介绍
自从 Facebook 的第一行PHP代码,第一句 MySQL 的 INSERT 语句,开源就已经是我们工程哲学中的一个重要的部分. 现在,我们使用.维护并为大量的主要项目做出了贡献——涉及多种领域如 ...
- 以正确的方式开源 Python 项目
以正确的方式开源 Python 项目 大多数Python开发者至少都写过一个像工具.脚本.库或框架等对其他人也有用的工具.我写这篇文章的目的是让现有Python代码的开源过程尽可能清 晰和无痛.我不是 ...
- 以正确的方式开源 Python 项目(转)
大多数Python开发者至少都写过一个像工具.脚本.库或框架等对其他人也有用的工具.我写这篇文章的目的是让现有Python代码的开源过程尽可能清晰和无痛.我不是简单的指——“创建一个GitHub库,提 ...
- 直接拿来用!Facebook移动开源项目大合集
直接拿来用!Facebook移动开源项目大合集 时间:2014-04-22 15:37 作者:唐小引 随着iOS依赖管理工具CocoaPods和大量第三方开源库成熟起来,业界积累了大量的优秀开源项目. ...
- 2014年Facebook的开源成就
2014是Facebook开源硕果丰硕的一年,其开源项目经理詹姆斯·皮尔斯(James Pearce)连续12天发布开源博客文章展示全年该社交网站在此领域取得的成就. 皮尔斯公布的成就包括以下内容: ...
- Nginx环境下常见的开源项目重写汇总
我们做PHP开发的,作者寒冰我觉得大部分时候都在跟开源的系统打交道.比如:Discuz.PHPCMS.ecshop.wordpress等开源系统.一般我们都是在本地搭建测试环境,用的web服务器都是a ...
- Facebook 正式开源其大数据查询引擎 Presto
Facebook 正式宣布开源 Presto —— 数据查询引擎,可对250PB以上的数据进行快速地交互式分析.该项目始于 2012 年秋季开始开发,目前该项目已经在超过 1000 名 Faceboo ...
- Python安装后在CMD命令行下出现“应用程序无法启动.............”问题
问题存在之一:系统是刚刚重做的精简版服务器系统(阉割版) AN就是在阿里云上刚开的Windows Server 2008 系统上碰到的 吓尿了都 症状: 正常安装python环 ...
- 6个最佳的开源Python应用服务器
6个最佳的开源Python应用服务器 首先,你知道什么是应用服务器吗?应用服务器通常被描述为是存在于服务器中心架构中间层的一个软件框架. AD: 首先,你知道什么是应用服务器吗?应用服务器通常被描述为 ...
随机推荐
- 浅谈HashMap的内部实现
权衡时空 HashMap是以键值对的方式存储数据的. 如果没有内存限制,那我直接用哈希Map的键作为数组的索引,取的时候直接按索引get就行了,可是地价那么贵,哪里有无限制的地盘呢. 如果没有时间限制 ...
- jquery.zclip.js 不起作用
最近有用到复制的这个功能,选用jQuery的插件,正常使用的时候,没有任何问题: $('#copy_mobile_watch_address').zclip({ path: '/dist/plugin ...
- JDBC连接数据以及操作数据
好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...
- jQuery选择器对应的DOM API ——选择元素
英文原文:http://blog.garstasio.com/you-dont-need-jquery/selectors/愚人码头注: 原作者的写这文章的意图是让我们抛弃jQuery,You Don ...
- pyqt样式表语法笔记
pyqt样式表语法笔记 pyqt QSS python 样式表 因为软件课设的原因开始学习使用pyqt4,才发现原来它也有样式表,而且语法跟css基本相同,而且一些功能实现起来感觉比js要简单方便得多 ...
- FB,Flash,as3 Bug集
一.Flash builder 报错 当导入3.0的项目时运行出现如下错误: 进程已终止,没有建立到调试器的连接.error while loading initial content 启动命令详细信 ...
- Excel图表-创意雷达图-原创图表
p{ font-size: 15px; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid #aaa; width: 99%; ...
- java代码打印打印杨辉三角
郑州大学 徐峰 public class Print { void print(){ int[][] a=new int[6][6]; for(int i=0;i<a.length;i++){ ...
- 取消putty右键粘贴功能
还是非常喜欢putty的.就是右键默认的粘贴功能比较讨人厌.
- WPF 中使slide控件拖动完成后改变变量值
这个问题一开始觉得还是挺简单的,网上也看到不少解决方案. 首先一个最简单最直接的方案就是自定义一个名为FinalValue的依赖属性.随后重载OnThumbDragCompleted函数,在Thumb ...