zoukankan      html  css  js  c++  java
  • F1 Query: Declarative Querying at Scale

    F1相关的论文两篇,

    F1: A Distributed SQL Database That Scales

    F1 Query: Declarative Querying at Scale

     

    F1: A Distributed SQL Database That Scales

    F1是一个Globally-distributed的数据库系统,用于替换传统的Sharded Mysql,用于Google的广告系统

    目标,

    可以简单scaleup,传统的sharded mysql,扩容是很麻烦的,因为要重新分shard

    高可用

    并且保证ACID

    这篇文章的主要贡献,为了达到这些目标,做的trade-off和sacrifices

    F1是架构在Spanner上,所以可扩展存储,同步副本,强一致性,全局有序这些事由spanner保证的,那么其实对于F1而言设计就可以比较轻了

    F1做了存储分离,分布式的设计,自然和传统Sharded Mysql比,latency会增加并难以控制,

    F1解决延迟的方法,主要是两个,一个是hierarchical关系表,一个是大量使用batch,并行和异步

    基本架构,

    F1 server作为查询引擎,和Spanner和CFS是分离的,但为了就近查询,部署的时候这些系统是co-located

    最关键的,F1 server是无状态的,这样就可以随意scale up

     

     F1,有一个slave pool,由master管理,普通的查询用不到,但是如果需要使用分布式查询的时候,那么就需要用slave pool里面的F1 processes扩大并行度

    Data Model

    前面说了,F1为了避免延迟不稳定的问题,提出的解决方案

    Hierarchical Schema,看右边的图,其实很容易理解,就用冗余,去范式化

    这样的好处,避免join;数据会clustered,这对分布式数据库很关键;update成本低,因为数据都clustered在一起

     使用Protocol Buffer

     

    索引,

    独立的索引表,事务性的,强一致性

    index分为local和global,全局索引和row无关,如果大的事务需要更新大量的全局索引,一定会影响查询性能,因为也要保证索引的事务性

    这里的建议,少用global索引,尽量用小事务

    Schema Change

    SchemaChange的难点主要是因为,对于分布式数据库,如何保证原子性和同步;如何保证change的过程中,不影响读写和可用性

    F1说为了避免影响可用性,一定要异步,但是异步就会导致不一致,同时不同的F1server会用不同的shema更新数据库

    怎么解决?

    schema change算法,

    首先,保证同时最多只有两个schema active,并且没有schema都有lease,哪怕网络不通,过期后无法使用

    再者,把schema change切分成multiple phase,保证phase之间是没有冲突的

    这里没有太详细说,参考reference

    Transaction

    这里提出,最终一致性,对于应用的开发者的负担是很重的,因为需要很多逻辑去处理各种错误,乱序,迟到的数据

    所以F1要求保证强一致性

    F1支持如下几种事务,

    Snapshot用于只读事务

    悲观事务,直接用Spanner就可以

    乐观事务,F1默认使用,每一行都有一个隐藏column存最新的commit更新时间,每次返回row的时候会带上,

    这样client再次commit的时候,会开一个小事务去check更新时间是否发生变化

    乐观锁的好处不言而喻,坏处,

    并且这里的行锁,也可以变成column级别,更细粒度的锁

    本篇最关键的是,F1是构建在Spanner之上的,存储和计算分离,所以把复杂的部分放到存储,F1是无状态的,所以他说的,Scaleup,可用性,一致性就都已经解决了;

    然后再分享一些经验,包含data model,schema change,事务等

    F1 Query: Declarative Querying at Scale 

    F1 Query提出了数据库系统的理想形式,cover大家对于数据库的所有需求,太牛逼了,如果不是google提的,一定会被人骂

    F1 query是上一篇F1的进化版本,

    区别在于,更彻底的,federated query引擎,兼容更多的data source;而F1只是读,Spanner和Mesa的数据

    F1的需求有哪些,

    比较核心的,

    数据是碎片化的,存在很多存储系统里面

    云原生架构,存储和计算分离,带来的问题是,latency的high variance

    架构

    其实这篇论文的主要内容在overview就已经讲完了

    他不是发明了一种引擎来解决所有的问题,而是把之前所有的方案集成到一个db里面

    查询执行

    查询的执行考虑到就近原则,哪怕google的网络很牛逼,近些还是快的

    执行的过程如下,

    SQL parse,优化,生成物理执行计划后,

    和普通的执行不一样,这里先要区分是Interactive执行,还是Batch执行

    DataSources

    对于多种datasources,需要提供一种关系型的抽象,像Hive一样,右边是例子,

     论文后面还讲了一些细节,但没有太多特别的东西,有兴趣的可以看看

  • 相关阅读:
    Eth-Trunk 技术
    MSTP技术
    STP生成树原理及不足
    表示数值的字符串(python)
    字符流中第一个不重复的字符(python)
    连续子数组的最大和(python)
    和为S的两个数字(python)
    数组中重复的数字(python)
    构建乘积数组(python)
    idea中查看类层级class hierarchy
  • 原文地址:https://www.cnblogs.com/fxjwind/p/12665701.html
Copyright © 2011-2022 走看看