google f1 mysql_数据库NewSQL之谷歌F1系统

2024-02-27 21:10

本文主要是介绍google f1 mysql_数据库NewSQL之谷歌F1系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

介绍

谷歌对数据系统性能有极高的要求,MySQL这样的系统都很难令其满意,所以谷歌设计F1数据库,其目标是让其具备高度的可扩展性和高度稳定性,除了必备的SQL语言支持外,F1还提供ad hoc类型查询。

基本构架

243644_0.png

用户通过客户端语料库(client library)和F1交互。用户发出的请求首先送到某个F1服务器,F1服务器负责之后的任务分配和数据处理。

为了减少处理请求造成的延时(latency),F1的客户端和与之直接相连的负载均衡器会首先向最近的F1服务器相连,但是如果附近的F1服务器非常繁忙或者出现故障,那么就会找其他远一点的服务器。

F1服务器通常和spanner服务器放在一个数据中心,因为这样可以提高数据读写的速度,不过F1服务器也可以连接其他数据中心的spanner服务器。spanner从一个叫做CFS(Colossus File System)的文件系统调取数据,相连的spanner和CFS永远是在同一个数据中心的,也就是说,某个数据中心的spanner不会和另一个数据中心的CFS相连。

因为F1服务器没有存储数据,F1服务器可以根据访问流量的大小随意增减。

整个F1系统处理请求可以在单个节点上完成,也可以在多个节点上分布完成,关键看哪个延时更小。如果是用分布式的方式处理请求,F1会指定多个进程(process)来完成,一个从属服务器(slave server)接管一个进程。多个从属服务器由一个主服务器(master server)管理。F1也支持MapReduce。

Spanner

F1和spanner是同时被研究开发出来的,但是spanner更加偏向于底层处理,例如缓存,数据共享和搬运,数据位置计算等等。

F1本身是关系型数据库,所以数据是一行一行地放在了列表(table)里。spanner将所有数据分成了一个个由很多行数据组成的集群(cluster),或者叫做目录(directory)。每一个目录至少有一个分段(fragment),大的目录通常有好几个分段。一个目录的多个分段组成了一个组(group),每一个数据中心存放了一个组的副本。

spanner在处理查询语句的时候使用二阶段锁(two-phase locking)和二阶段提交(two-phase commit),这样信息交互在网络中增加了一倍,增加了延时。为了保证数据的一致性(consistency),spanner使用时间戳(timestamp)给每一条事务排序,保证全球的事务有序执行。

数据模型

F1的数据模型和关系型数据库相似,都有数据概要(schema),但在此基础上也有扩展。

F1数据概要下的表格(table)是分层的。子表格(child table)里面的所有key必须包含母表格(parent table)里面的key。根表格(root table)里的每一行叫做根行(root row),所有根据某条根行衍生出来的子表格行组成一个spanner目录

Protocol Buffers

普通数据库的一个缺点是,数据结构里的数据要通过繁琐的代码转换成数据库数据之后才能被存入数据库,谷歌使用Protocol Buffer语料库(library),使得表格的每一列支持结构化数据类型。

数据索引

F1有两种索引,一种是局域索引(local index),局域索引的key必须包含根行的key作为前缀。局域索引的key和索引到的结果都和实际的根行放在同一个spanner目录下,所以局域索引的修改占用了事务中很少的一部分用时。

另一种索引是全局索引(global index)。和局域索引不同的是,全局索引的key不包含根行的key,并且和索引的数据分开存放。很多目录都可以访问全局索引,全局索引存放在多个spanner服务器里。如果修改了一条被索引的行,那么更新索引就需要用到2PC(2 phase commit)。全局索引在扩展性方面做得不是很好。比如说,一个新增1000行数据的事务会让索引新增几百条记录,2PC处理这几百条新增的记录会变得很慢。目前谷歌正在研究让全局索引有更好地扩展性的方法。

修改数据概要(schema)

F1数据库是一个全球范围的数据库,这意味着世界上所有人都可以修改里面的同一份数据概要,谷歌要求在这个过程中不允许出现任何故障或者表格上锁(table locking)。

那么如何实现呢?谷歌修改概要的方法是用非同步法,也即是说不同的F1服务器在同一时候可能储存两个本质相同但概要内容不同的数据库。对此,谷歌设计了自己的算法。

事务执行

F1有三种类型的事务:

1. 只读(read-only)事务

2. 直接映射到spanner的事务:此类型的事务直接由spanner处理。

3. 读写事务:为了防止在读取的时候数据被其他事务修改,F1还会给出上一次被修改的时间,数据一旦被更新,这个时间也会随之更新。

默认形式下,F1客户端使用读写事务模式。这样做的优点有

- 读取数据不需要数据锁,而且不会和改写数据相冲突,事务之间互不受影响。

- 某些事务本来就需要很长时间,这样也不会被禁止

- 事务在出错之后可以重新执行

- 客户端在发现远程服务器出现故障后,可以连接另一台服务器

- 事务执行过程中允许读取处理事务以外的数据

但是该模式也有缺点,就是如果某一数据被频繁调取,那么系统在这个数据上的工作效率(throughput)就很低。

数据锁

F1数据库中每一行数据都有一个锁列(lock column)。锁列可以由用户自由定制并且负责该行每一列数据的上锁。这样每一行的不同列就能被不同事务读取修改。

记录修改

F1需要记录过去对数据库的所有更改。F1记录每一条事务的修改记录时会包含每一行某一列修改前和修改后的值,还有primary key。这里的primary key包含根表格的key和提交事务时候的时间,所有这些记录放在了另外一个表格中。这些记录在F1相关应用中有重要作用。

客户端

在F1之前,很多谷歌的数据库应用都是用MySQL的ORM,ORM不适合在F1中使用,因为扩展性不高。于是谷歌设计了自己的API。同时F1也支持NoSQL和SQL。

事务查询处理

F1支持单点事务处理和分布式事务处理,单点OLTP由一个F1服务器处理,分布式OLAP由F1下的从属服务器(slaver)共同处理。

处理远程数据

在F1中,SQL中的join命令要求读取多个数据中心的数据,这会带来网络延时,解决办法是数据批量传送(batching)和流水线操作(pipelining)。

数据计算通常是一部分计算好之后就被输出,减少等待时间。这样做的好处是并行高效和减少存储缓冲,但缺点是数据不能被排序。

分布式计算

每一个事务执行计划包含了几十个子计划,每一个子计划由几个从属服务器执行,同时,数据划分(partitioning)技术也在此处用到。

这篇关于google f1 mysql_数据库NewSQL之谷歌F1系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/753602

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境