CalvinFS拿了FAST 15最佳论文;找到了失联十三年的小伙伴;年终/年初整理资料,发现做团委工作的 King 师兄对Calvin有兴趣;最近其他团队对分布式事务和存储问题/兴趣较多……几件事激发了我写这本文的动机,要知道上一篇是2012年的(虽然一直有做个人学习、工作笔记)。
 
Yale的CalvinFS最有价值的就是元数据管理部分,也就是Calvin(的修改版)。没有跨IDC的Calvin,也就没有跨IDC的CalvinFS。以下的内容以旁观者角度写,一些问题简单描述,但是实际上非常难处理,Calvin等分布式系统的作者可能是花了大量精力才完成。在进入Calvin内容之前先提两个东西。
 
一个是ACID和CAP——因为里边都有A、C,所以放一起提:P 。ACID是数据库的概念,说的是事务;CAP是分布式系统的概念,说的是不存在三者完美的系统。A和C在两者里边是不同的。ACID里边的A是说原子性,而CAP里的A是可用性;而关于C,前者说的是相关内容(如索引与数据、关联等)的进行一致地变化,后者一般说的是同一内容几个副本一致进行变化,。ACID里边I是隔离性,D是持久性,都比较好理解。CAP中的P则是说分区容忍。
 
另一个是2PC和Paxos。首先,Paxos变种太多的,网上资料经常把几种变种混成一个,建议想了解还是看书或是原始论文吧。提分布式事务就会提到2PC、3PC、PAXOS,中间那种一般没人用不说。2PC主要问题在于阻塞,非coordinator服务挂掉基本都有较好的方案处理,而coordinator在prepare收到全部都是ok后挂掉……而PAXOS方面,自从有了zookeeper之后,也很多人用起来了,除了同步数据外,还有一些应用场景是HA选主等。
 
一般高大上的功能都伴随着CAP中某方面的妥协,Calvin也不例外。机器挂掉或是IDC出故障等P方面的问题总是存在的,一般只能在A和C里做选择,calvin主要牺牲的是A可用性(这个跟Spanner的选择是类似的,其实也是现在慢慢被认可的方向)。spanner得益于其truetime全局逻辑时间的设计,达到了外部一致性的级别,现实系统不可能做得更好。而Calvin则选择了顺序一致性,也就比外部一致性弱一些。但是所有的系统或设计都是分场景的,Calvin也不例外,虽然它提供了强一致的级别,支持ACID,但不代表一定要在所有场景下无条件放弃对A的追求。强一致的事务只是提供了一种选择,在不需要这方面保证(隔离性I、一致性C)时,直接跳过这一层可提升性能(可用性方面);虽然强一致带来的代价一定要存在,但是可以考虑把代价转移到不常用的地方去,比如读写场景中,增加写延时来优化读性能;同时,即便是写场景,一定程度上牺牲延迟,但是换取更大吞吐也成为很多跨IDC系统的设计方向。
 
 
上边提到了事务和一致性,这方面在calvin里的实现是很有意思的,走了一条跟时间流行方向不同的路线。分布式系统设计中,事务是一个难点。2PC的阻塞问题通过虚拟节点可以缓解,spanner在2pc下层放了paxos是一个意思。但是这总是一个问题,而且典型系统中的并发更新带来的死锁问题,在更新操作变重的分布式系统中会被放大。calvin直接干掉了2PC,这是通过把更新操作而不是更新结果做同步来达到,其实也就是用全局的队列(paxos实现),来同步操作日志。而死锁方面则通过预先定义读写set和ordered lock来规避(一些事务不能预先定义读写set的要用到OLLP机制)。这种事务设计,对单个机器上的请求返回速度比较敏感,特别是为了批量处理而人为地引入了一个最大10ms等待时间之后。calvin用了一个warm up的方案来弥补,挺有意思的,思想就是把一些事情放到事务开始前,把数据提前load到内存。但是需要注意到的是,因为同步的是操作日志而不是结果,所以要求各副本在收到相同日志后,应该有相同的结果,也就是说不确定性因素(如本机硬盘坏)等引起的问题不能abort事务。这是相比2PC方案的缺点,在这种情况下,出问题的副本只能自行同步/恢复到正确副本的状态上去。这里边有一个想要吐嘈的地方:哪些场景下应该warm-up,应该warm-up哪些数据,这两个问题是warm-up机制需要处理的,而calvin论文中对前者是直接实验出一个经验值,后者是暂时没有好方案……
 
Calvin除了deterministic这点外,其他是很多思路包括跨IDC延时现状的情况下,尽力提升吞吐和主要场景性能等现在已经是大多数分布式系统设计时的同识/方向。其设计的线性化扩展能力也是其他系统也在追寻的,虽然我对它的性能扩展能力有一些疑问……
 
 
写得比较随意,如有错漏还请指正。同时如上文所说,一些问题的处理是很有难度的,希望不要因为这里的轻描淡定而误导成calvin的解决方案很简单。

几句话说说跨IDC分布式数据库Calvin的更多相关文章

  1. Java连接数据库的辣几句话

    Java连接数据库的辣几句话 1.java连接Oracle数据库 使用以下代码三个步骤: 1.下载ojdbc.jar包并导入项目中.附下载地址:http://download.csdn.net/det ...

  2. 怎样打造一个分布式数据库——rocksDB, raft, mvcc,本质上是为了解决跨数据中心的复制

    摘自:http://www.infoq.com/cn/articles/how-to-build-a-distributed-database?utm_campaign=rightbar_v2& ...

  3. 从NoSQL到NewSQL,谈交易型分布式数据库建设要点

    在上一篇文章<从架构特点到功能缺陷,重新认识分析型分布式数据库>中,我们完成了对不同"分布式数据库"的横向分析,本文Ivan将讲述拆解的第二部分,会结合NoSQL与Ne ...

  4. 分布式数据库中间件 MyCat 搞起来!

    关于 MyCat 的铺垫文章已经写了三篇了: MySQL 只能做小项目?松哥要说几句公道话! 北冥有 Data,其名为鲲,鲲之大,一个 MySQL 放不下! What?Tomcat 竟然也算中间件? ...

  5. DTCC 2020 | 阿里云李飞飞:云原生分布式数据库与数据仓库系统点亮数据上云之路

    简介: 数据库将面临怎样的变革?云原生数据库与数据仓库有哪些独特优势?在日前的 DTCC 2020大会上,阿里巴巴集团副总裁.阿里云数据库产品事业部总裁.ACM杰出科学家李飞飞就<云原生分布式数 ...

  6. 云时代的分布式数据库:阿里分布式数据库服务DRDS

    发表于2015-07-15 21:47| 10943次阅读| 来源<程序员>杂志| 27 条评论| 作者王晶昱 <程序员>杂志数据库DRDS分布式沈询 摘要:伴随着系统性能.成 ...

  7. 我和小美的撸码日记(3)之中的一个句话搞定MVC表单页数据绑定与提交

    另外献上在<线体验Demo地址>希望大家也能从中得到一些启示. 地址:http://121.40.148.178:8080/ . username:guest,password:12345 ...

  8. Oracle得知(十五):分布式数据库

    --分布式数据库的独立性:分布数据的独立性指用户不必关心数据怎样切割和存储,仅仅需关心他须要什么数据. --本地操作 SQL> sqlplus scott/tiger --远程操作 SQL> ...

  9. 分布式数据库Google Spanner原理分析

    Spanner 是Google的全球级的分布式数据库 (Globally-Distributed Database) .Spanner的扩展性达到了令人咋舌的全球级,可以扩展到数百万的机器,数已百计的 ...

随机推荐

  1. vim 配置半透明

    转载两个博客 链接一 链接二

  2. PHP 7 安装 Memcache 和 Memcached 总结

    Memcache 与 Memcached 的区别 Memcached 是 Memcache 的升级版,优化了 Memcache,并增加了一些操作方法.所以现在基本都是用最近版本的. PHP 7 下安装 ...

  3. Linux内存子系统及常用调优参数

    1>内存子系统 1>组件: slab    allocator buddy    system kswapd pdflush 2>虚拟化环境: PA:进程地址: HA:虚拟机地址: ...

  4. 用C#开发的双色球走势图(原创)值得园友拥有

    首先声明,个人纯粹无聊之作,不作商业用途. 我相信每个人都拥有一个梦想那就是有朝一日能中500W,这个也一直是我的梦想,并默默每一期双色球或多或少要贡献自己一点点力量,本人并不属于那种铁杆的彩票迷,每 ...

  5. c# 协变与抗变

    定义 协变:与原始类型转换方向相同的可变性称为协变. 抗变:与派生类型转换方向相同的可变性称为抗变. 补充: 参数是协变的,可以使用派生类对象传入需要基类参数的方法,反之不行 返回值是抗变的,不能使用 ...

  6. day 64 Django 第五天 多表对多表的对应关系ORM

     一.查 设置 Author表  在 views文件中 # 作者表 class Author(models.Model): id =models.AutoField(primary_key=True) ...

  7. String对象的简单方法(特别讲解length()方法的实现。

    length() 返回字符串中的字符数 charAt(index) 返回字符串中指定位置的字符 concat(s1)    将本字符串和字符串s1连接,返回一个新字符串 toUpperCase() 返 ...

  8. Weekly Contest 132

    1025. Divisor Game Alice and Bob take turns playing a game, with Alice starting first. Initially, th ...

  9. 因子和(luoguP1593)(等比数列求和+逆元)

    输入两个正整数\(a\)和\(b\),求\(a\cdot b\)的因子和.结果太大,只要输出它对9901的余数. Input 仅一行,为两个正整数\(a\)和\(b\)(\(0≤a,b≤5000000 ...

  10. 尺寸单位em,rem,vh,vw

    这几天做demo,看了网上教程有用到尺寸单位vh,vw, 这些单位不是很熟悉,所以上网上找了些资料来认识了这些不认识的单位 1.em 在做手机端的时候经常会用到的做字体的尺寸单位 说白了 em就相当于 ...