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一样,右边是例子,

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

原文地址:https://www.cnblogs.com/fxjwind/p/12665701.html