AppBoxFuture(四). 随需而变-Online Schema Change
需求变更是信息化过程中的家常便饭,而在变更过程中如何尽可能小的影响在线业务是比较头疼的事情。举个车联网监控的例子:原终端设备上传车辆的经纬度数据,新的终端设备支持同时上传速度数据,而旧的车辆状态表数据量超过亿级,此时如果Alter table add column将会造成数据表上锁,导致上传或查询车辆状态数据等待。AppBoxFuture的存储引擎在设计之初也是采用锁表的方案,后来考虑到上述应用场景决定支持online schema change,但带来了另一个难题是如何保证分布式环境下的一致性。
在权衡了利弊后,作者决定采用如下草图所示的变更方案,主要是考虑工程实现上的便利性。实现的关键点是实体模型内有SchemaVersion标记,在添加删除列、索引、EntityRef引用外键时,SchemaVersion+1, 同时所有表分区的状态机内也有SchemaVersion标记当前的版本,如果变更过程中有旧版本的Insert\Update\Delete命令,则抛出SchemaChanged错误,由上层逻辑加载新的模型后重试。该方案的优点是实现简单,且变更过程对在线业务的影响较小,缺点是变更任务不支持回滚,如遇到网络或磁盘错误则任务会稍候重试(幂等),添加惟一索引例外,遇到主键冲突任务不会重试,改为通知上层删除该索引。

作者在虚拟机(I74C8G)内做了个单分区80万行记录添加列变更性能测试,如下动图所示:

测试结果如下约0.8秒就处理完一个分区80万行记录:
#01/17/2019 11:17:07 [Debug] [StoreService.UpdateModelAsync]: Entity[VehicleState] schema changed, 2 -> 3
MetaAlterTable::TryRunAsTask: 开始提议分区变更任务至68719476742
MetaAlterTable::TryRunAsTask: 分区提议成功68719476742
KVAlterPartion::TryRunAsTask: 分区批次处理完成
MetaAlterTable::TryRunAsTask: all partition done, elapsed time:0.847791s
MetaAlterTableDone::Apply: 移除变更任务, 剩余任务:0
KVAlterPartionDone::Apply: 移除分区变更任务, 剩余任务:0
如果您有问题或Bug报告,请留言或在Github提交Issue。
AppBoxFuture(四). 随需而变-Online Schema Change的更多相关文章
- schema change + ogg 变更手册
Check OGG until no data queuing in replication process:testRO:a)login test5 –l oggmgrb)oggc)#ggsci ...
- Online Schema Change for MySQL
It is great to be able to build small utilities on top of an excellent RDBMS. Thank you MySQL. This ...
- Java工程师:四个月小白变大咖,你能做到吗?
你眼中的Java工程师是什么样子? 技术大牛?闷骚男?IT民工?没有女朋友?全是汉子?很邋遢?贼眉鼠眼? 今天,中软国际卓越工程师,Java精英班正式开课啦.你想看看他们都是一群怎样的人吗? 今天的武 ...
- leveldb 学习记录(四) skiplist补与变长数字
在leveldb 学习记录(一) skiplist 已经将skiplist的插入 查找等操作流程用图示说明 这里在介绍 下skiplist的代码 里面有几个模块 template<typenam ...
- Online, Asynchronous Schema Change in F1
F1: A Distributed SQL Database That Scales http://disksing.com/understanding-f1-schema-change ma ...
- Schema 与数据类型优化
这是<高性能 MySQL(第三版)>第四章<Schema 与数据类型优化>的读书笔记. 1. 选择优化的数据类型 数据类型的选择原则: 越小越好:选择满足需求的最小类型.注意, ...
- “设计之变”--从iPhone应用到iPad应用
在做APP的iPad版本设计时,我们常常需要考虑:如何在延续iPhone版本设计特色和优点同时,充分利用iPad的特性更好地进行设计.本文从iPad和iPhone的差异性入手,试图总结这一设计过程中需 ...
- create schema 与create database的区别
概论第四版中增加了create schema (第三版好像没有这个内容),但是却没有提到create database.相反目前在大多数DBMS中(如SQL Server2000.Mysql等)都有 ...
- API和schema开发过程问题汇总
场景:在日常工作中很多都是重复性的劳动,有的坑踩过一次下次很可能还回踩到,所以很有必要将这些问题记录下来,提升工作效率! 1 API 2 schema 问题:提示schame中有元素没有定义 这个时候 ...
随机推荐
- 通过命令行操作MYSQL的方法 以及导入大的SQL备份文件
运行 输入CMD 进入 命令行窗口 输入Mysql.exe的路径 如:c:/wamp/bin/mysql.exe 回车 这时出现 welcome to the mysql ...的提示 进入成 ...
- js判断pc还是移动端
if (!/windows phone|iphone|android/ig.test(window.navigator.userAgent)) { //pc }else{ //h5 }
- React组件和生命周期简介
React 简介----React 是 Facebook 出品的一套颠覆式的前端开发类库.为什么说它是颠覆式的呢? 内存维护虚拟 DOM 对于传统的 DOM 维护,我们的步骤可能是:1.初始化 ...
- vue图片上传到七牛云
代码: <template> <div class="upload-info"> <div> <el-upload class=" ...
- js 原生: 身份证脱敏、唯一随机字符串uuid、对于高 index 元素的隐藏与显示
1. 对于高 index 元素的隐藏 与 显示 export const hideIndexEle = (cssStr)=>{ const player = getElementsByCss(c ...
- vue项目中引入mint-ui的方式(全部引入与按需引入)
参考哦 https://blog.csdn.net/qq_36742720/article/details/83620584 https://jingyan.baidu.com/article/c1a ...
- 使用jQuery.form库中ajaxSubmit提交表单时遇到的一些问题
初入前端,网上找的很多资料都不够详细,导致遇到很多问题,现记录如下: 1.首先引入 <script src="~/Scripts/jquery-1.10.2.js">& ...
- [编译] 4、在Linux下搭建nRF51822的开发烧写环境(makefile版)
星期日, 09. 九月 2018 07:51下午 - beautifulzzzz 1.安装步骤 1) 从GNU Arm Embedded Toolchain官网下载最新的gcc-arm工具链,写文章时 ...
- 查询结果集转换成HTML存储过程
工作中经常需要用SQLServer发送报警或者业务报表邮件,每次现拼串也不是办法,故写了一个TableResult to HTML的存储过程 USE master; GO -- Description ...
- 安卓开发笔记(十六):'Request(okhttp3.Request.Builder)' has private access in 'okhttp3.Request
当出现了'Request(okhttp3.Request.Builder)' has private access in 'okhttp3.Request的错误的时候,实际上是我们在写代码的时候少打了 ...