IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 经典论文研读:《F1:A Distributed SQL Database That Scales》 -> 正文阅读

[大数据]经典论文研读:《F1:A Distributed SQL Database That Scales》

一 简介

F1是Google提出的分布式关系型数据库,支持便捷的水平伸缩。这篇论文是NewSQL分布式数据库架构的基石。论文首先定义了F1分布式数据库设计的关键方向:

  • 可伸缩性:数据库要提供对业务透明的水平扩展能力,并支持数据迁移、数据rebalance
  • 可用性:提供高可用的数据服务
  • 一致性:这里特指强一致性
  • 易用性:需要支持索引、ad-hoc类查询接口
    F1的设计理念是兼顾传统SQL数据库的功能完备于NoSQL数据库的灵活伸缩能力。

F1采用Spanner作为基础数据库(Google提出的分布式NoSQL数据库,后文介绍),并继承了Spanner数据库的特性。在此基础上,F1扩展出了分布式关系型数据库关键能力:

  • 分布式查询
  • 事务级索引
  • schema变更
  • 变更历史记录

为了缓解分布式数据库引入到高时延,F1做了一些性能优化的工作,使得F1能在性能上和传统数据库持平。

  • 通过数据schema定义让数据内聚,内举的数据相邻存放,提高了访存局部性,减少了RPC访问次数
  • 由于F1的使用者大量使用批处理、并行处理、异步读取等操作,F1设计了新的ORM接口,可以限定一次查询内部RPC访问次数的上界

二 整体架构

在这里插入图片描述

Load Balancer
查询时,默认访问最近DataCenter,并在必要时执行负载均衡。
F1 Server
F1 Server无状态(几乎)的数据查询服务,不存放任何数据,而是通过访问Spanner查询数据。
Slave Pool
Slave Pool由F1进程组成,整个集群共享Slave Pool中的进程。
F1 Master
当计算并发度较高影响时延时,F1 Master会从Slave Pool中分配进程交给F1 Server管理。Slave进程会分担部分查询工作。F1 Master会监听Slave进程的状态。

三 数据模型

表层级结构

广告场景中“customer->canpaign->adgroup”的逐层一对多的表层级关系,抽象为root表和子表的模型。其中customer表为root表,campaign是customer的子表,adgroup是campaign的子表。
在这里插入图片描述

子表与其父表存放在一起(就好像子表是父表中的一列),这样存放有几点好处:

  • 当想查询一个customer下的的所有adgroup时,只需要简单的range查找即可
  • 当需要进行双表Join操作时,只需要利用有序数组合并的算法即可
  • 更新时,由于同一个customer的数据存放在一起,可以避免单个更新操作引起Spanner集群事物同步

protobuf列类型

F1中对protobuf列类型做了很多扩展,可以将protobuf列看作是可嵌套的schema结构。F1在SQL语法上也做了相关的支持。
在这里插入图片描述
索引
支持本地索引和全局索引。
本地索引:在建立索引时,必须确定root表的主键值(如CustomerId),这样的设计是为了限定索引的覆盖范围,避免跨机器构建与查询。
全剧索引:无需指定root表主键值,但是性能会比较差,尤其是面对大批量事务操作时

四 Schema变更

F1支持schema变更有很大挑战,有如下几个原因:

  • F1是一个庞大的分布式数据库,其数据中心扩地域分布
  • schema结构加载在本地内存中,很难保证跨机器原子更新
  • 在schema变更时,需要保证查询和事务持续进行
  • 系统的可用性和时延不能收到schema变更的影响

为了避免造成不可接受的影响,schema变更采用分批更新模式,即不同F1 Server上使用的schema可能不一样。
同时,为了解决schema不兼容变更导致数据库崩溃的问题,F1也做了一些设计:

  • 每个Server至少加载两个schema版本,但是只使用其中一个对外提供服务;当时机合适的时候,会释放旧版本schema
  • 两阶段提交:先更新schema,然后准备好数据,最后再提供服务

五 事务

F1支持三种事务:

  • 快照
    这是一种只读事务,使用方可以指定时间戳获取特定的数据版本。
  • 悲观事务
  • 乐观事务

F1在每行数据中隐式插入了一个行锁,行写入时会记录当前更新的时间戳;当执行批量事务时,会加一个短周期的悲观锁,用来依次校验时间戳是否重冲突,一旦冲突,则事务提交失败

F1默认使用乐观锁,但是乐观锁有两个问题:

  • 乐观锁依赖于行锁,而只有已经存在的行,才能加锁;当数据中出现新增行时,可能出现数据覆盖
  • 当并发度比较高时,吞吐量低

支持使用方自定义列簇锁

行锁本质上是对一行中的所有列加锁。F1也支持使用方通过自定义“列子集锁”,这样可以增加并发吞吐。

六 修改历史记录

F1会记录所有的变更操作,这写记录有很多变种用法:

  • 用于通知变更
    类似于DB的bin log。
  • 用于更新Client缓存
    客户端会缓存数据库的部分状态。客户端可以通过监听变更记录来更新缓存。

七 客户端设计

F1客户端支持ORM接口、SQL接口和NoSQL接口。

八 查询处理

在这里插入图片描述

F1查询时会根据Query执行中心查询或者分布式查询,上述例子是一个分布式查询的例子。F1会将SQL解析成多个步骤,执行类似于MapReduce的拆解和聚合。在查询时,所有的数据访问均为远程访问。

在访问时,时延主要来源于两个地方:网络和磁盘吞吐。其中网络的延迟可以通过批访问和流水线访问来缓解;磁盘延迟通常是因为硬件吞吐量限制,而F1底层使用的CFS分布式存储,吞吐量量得到了保障。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 20:48:45  更:2022-10-08 20:48:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 5:22:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码