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: 首先,你知道什么是应用服务器吗?应用服务器通常被描述为 ...
随机推荐
- 深入解读Python的unittest并拓展HTMLTestRunner
unnitest是Python的一个重要的单元测试框架,对于用Python进行开发的同事们可能不需要对他有过深入的了解会用就行,但是,对于自动化测试人员我觉得是要熟知unnitest的执行原理以及相关 ...
- 关于npm安装全局模块,require时报Error: Cannot find module 'XXX'的解决办法
系统环境:centos 下午使用npm安装"cheerio",想搞爬虫玩玩. npm安装有两种模式: 本地 # npm install cheerio 全局 # npm insta ...
- 【转】并行类加载——让tomcat玩转双十一 @双十一实战
原文:https://yq.aliyun.com/articles/4227?spm=5176.100239.yqblog1.20.cfRztB 摘要: 今年双十一,是应用容器的最新版本Ali-tom ...
- 利用firefox调试安卓手机端web
分2部分: 手机: 1.安装最新版firefox 2.打开浏览器,输入about:config 3.设置 devtools.debugger.remote-enabled 值为true devtool ...
- vuejs单一事件管理组件间的通信
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- sticky footer布局,定位底部footer
其作用就是当内容区域比较少时,让footer也能正常定位到底部,以前我们使用js来达到这种效果,其实用css也是完全可以的 <!DOCTYPE html> <html lang=&q ...
- juddi学习一
一.下载juddi 地址:https://mirrors.tuna.tsinghua.edu.cn/apache/juddi/juddi/3.3.4/ 二. 解压下载文件打开目录下的 进入bin目录, ...
- BroadcastReceiver简单应用实例
BroadcastReceiver是android四大组件之一,主要用于接收广播,它的简单实现方法如下: 1.定义继承BroadcastReceiver的MyReceiver类: /** * Crea ...
- 管中窥豹——从对象的生命周期梳理JVM内存结构、GC调优、类加载、AOP编程及性能监控
如题,本文的宗旨既是透过对象的生命周期,来梳理JVM内存结构及GC相关知识,并辅以AOP及双亲委派机制原理,学习不仅仅是海绵式的吸收学习,还需要自己去分析why,加深对技术的理解和认知,祝大家早日走上 ...
- MySQL学习笔记(四)—存储过程
一.概述 存储过程是数据库定义的一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.存储过程可以避免开发人员重复的编写相同的SQL语句,而且存储过程是在MySq ...