Spanner

Spanner的设计反映了Google多年来在分布式存储系统领域上经验的积累和沉淀,它采用了Megastore的数据模型,Chubby的数据复制和一致性算法,而在数据的可扩展性上使用了BigTable中的技术。新颖之处在于,它使用高精度和可观测误差的本地时钟来判断分布式系统中事件的先后顺序。Spanner代表了分布式数据库领域的新趋势——NewSQL

Megastore

Megastore是在Bigtable的基础上提供了友好的数据库功能支持。是介于关系型数据库(RDBMS)和NoSQL之间的存储技术。

Megastore的数据模型

Megastore的数据模型是在模式(schema)中定义的且是强类型的(strongly typed)。每个模式都由一系列的表(tables)构成,表又包含有一系列的实体(entities),每个实体中又包含一系列的属性(properties)。属性是命名的且具有类型,这些类型包括字符型(strings)、数字类型(numbers)或者Google的Protocol Buffers。这些属性可以被设置成必需的(required)、可选的(optional)或者可重复的(repeated,即允许单个属性上有多个值)。

在Megastore中,所有的表要么是实体组根表(Entity Group Root Table),要么是子表(Child Table)。所有的子表必须有一个参照根表的外键,这个外键是通过ENTITY GROUP KEY来声明的。

BigTable

BigTable是在Google File System的基础上设计的分布式存储系统。

Google的三驾马车:MapReduce、Bigtable和GFS

Google的三驾马车:MapReduce(《MapReduce: Simplified Data Processing on Large Clusters》),Bigtable(《Bigtable: A Distributed Storage System for Structured Data》)和GFS(《The Google File System》)

背景

在21世纪初,互联网上的内容,大多数企业需要存储的数据量并不大。但是Google不同,Google的搜索引擎的数据基于爬虫,而由于网页的大量增加,爬虫得到的数据也随之急速膨胀,单机或简单的分布式方案已经不能满足业务的需求,所以Google必须设计新的数据存储系统,其产物就是Google File System(GFS)。

不过,在Google的设计中,为了尽可能的解耦,GFS仅负责数据存储而不提供类似数据库的服务。也就是说,GFS只存数据,而对数据的具体内容一无所知,自然也就不能提供基于内容的检索功能。

所以,更进一步,Google开发了Bigtable作为数据库,向上层服务提供基于内容的各种功能。

此外,Google 的搜索结果依赖于PageRank算法的排序,而该算法又需要一些额外的数据,比如某网页的被引用次数,所以他们还开发了对于的数据处理工具MapReduce,在读取了Bigtable数据的技术上,根据业务需求,对数据内容进行运算。

其总体架构如下,GFS能充分利用多个Linux服务器的磁盘,并向上掩盖分布式系统的细节。Bigtable在GFS的基础上对数据内容进行识别和存储,向上提供类似数据库的各种操作。MapReduce则使用Bigtable中的数据进行运算,再提供给具体的业务使用。

NoSQL

NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。NoSQL用于超大规模数据的存储。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。没有声明性查询语言,没有预定义的模式,包括键值对存储、列存储、文档存储、图存储,没有ACID属性,只保证最终一致性,符合CAP原理

NoSQL的主要优势

  • 高可用性和可扩展性,自动分区,轻松扩展
  • 不保证强一致性,性能大幅提升
  • 没有关系模型的限制,极其灵活

横向扩展&纵向扩展

  • 横向扩展(scale-out):也称为水平扩展,用更多的节点支撑更大量的请求。 通俗来说,就是多增加几台API服务器,一起服务。
  • 纵向扩展(scale-up):也称为垂直扩展,扩展一个点的能力支撑更大的请求。通俗来说,就是把API服务器换成性能更好的机器。

关系数据库的ACID规则(又称事务一致性)

  • A (Atomicity) 原子性:原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。
  • C (Consistency) 一致性:一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。
  • I (Isolation) 独立性:所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。
  • D (Durability) 持久性:持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。
MySQL的架构

MySQL的架构,从概念上分为四层,分别是接入层、服务层、存储引擎层和系统文件层

  • 最顶层是接入层,不同语言的客户端通过mysql的协议与mysql服务器进行连接通信,接入层进行权限验证、连接池管理、线程管理等
  • 次顶层是服务层,包括sql解析器、sql优化器、数据缓冲、缓存等
  • 次底层是存储引擎层(InnoDB),mysql中存储引擎是基于表的。
  • 最底层是系统文件层,保存数据、索引、日志等。
MVCC

MVCC,即Multi-Version Concurrency Control,多版本并发控制,在DBMS中实现对数据库的并发访问。

  • 为什么要使用MVCC?数据库通常使用锁来实现隔离性。

    • 最原生的锁:锁住一个资源后会禁止其他任何线程访问同一个资源。
    • 读写锁:读锁和读锁之间不互斥,而写锁和写锁、读锁都互斥。
    • MVCC :使用了一种不同的手段,每个连接到数据库的读者,在某个瞬间看到的是数据库的一个快照,写者写操作造成的变化在写操作完成之前(或者数据库事务提交之前)对于其他的读者来说是不可见的。
  • MVCC用来解决读—写冲突的无锁并发控制,就是为事务分配单向增长的时间戳。为每个数据修改保存一个版本,版本与事务时间戳相关联。读操作只读取该事务开始前的数据库快照。
Redo log & Bin log & Undo log
  • Redo log:记录了数据操作在物理层面的修改,mysql中使用了大量缓存,缓存存在于内存中,修改操作时会直接修改内存,而不是立刻修改磁盘,当内存和磁盘的数据不一致时,称内存中的数据为脏页(dirty page)。为了保证数据的安全性,事务进行中时会不断的产生redo log,在事务提交时进行一次flush操作,保存到磁盘中。redo log是按照顺序写入的,磁盘的顺序读写的速度远大于随机读写。当数据库或主机失效重启时,会根据redo log进行数据的恢复,如果redo log中有事务提交,则进行事务提交修改数据。这样实现了事务的原子性、一致性和持久性。
  • Bin log:是mysql服务层产生的日志,常用来进行数据恢复、数据库复制,常见的mysql主从架构,就是采用slave同步master的binlog实现的。
  • Undo log:当进行数据修改时,除了记录redo log外,还会记录undo log。undo log用于数据的撤回操作,它记录了修改的反向操作,比如,插入对应删除,修改对应修改为原来的数据,通过undo log可以实现事务回滚,并且可以根据undo log回溯到某个特定的版本的数据,实现MVCC。

一致性

  • 一致性包含数据一致性和事务一致性,事务一致性即事务的ACID规则,复制是导致出现数据一致性问题的唯一原因。将一份数据存储在超过一台数据库中(即复制)原因有三:

    • 即使一部分数据库出现故障,系统也能正常工作(高可用)
    • 使数据与用户在地理上接近(降低延迟)
    • 扩展可以处理读请求的机器数量(可扩展性、提高读取吞吐量)
  • 数据一致性分为强一致性和弱一致性。强一致性也叫做线性一致性,除此以外,所有其他的一致性都是弱一致性的特殊情况。所谓强一致性,即复制是同步的,弱一致性,即复制是异步的。
    • 强一致性可以保证从库有与主库一致的数据。如果主库突然宕机,我们仍可以保证数据完整。但如果从库宕机或网络阻塞,主库就无法完成写入操作。
    • 在实践中,通常使一个从库是同步的,而其他的则是异步的。如果这个同步的从库出现问题,则使另一个异步从库同步。这可以确保永远有两个节点拥有完整数据:主库和同步从库。 这种配置称为半同步。
    • 最终一致性:当用户从异步从库读取时,如果此异步从库落后,他可能会看到过时的信息。这种不一致只是一个暂时的状态——如果等待一段时间,从库最终(从写入主库到反映至从库之间的延迟)会赶上并与主库保持一致。
    • 读写一致性:也称为读己之写一致性,保证用户刷新页面,他们总会看到自己刚提交的任何更新。如何实现?
      • 对于某些特定的内容,都从主库读。
      • 客户端可以在本地记住最近一次写入的时间戳,发起请求时带着此时间戳。从库提供任何查询服务前,需确保该时间戳前的变更都已经同步到了本从库中。

CAP原理

CAP原理,又称布鲁尔定理,它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性(Consistency):每次读取的数据都应该是最近写入的数据或者返回一个错误, 而不是过期数据,也就是说,数据是强一致的。
  • 可用性(Availability):每次请求都应该得到一个响应,而不是返回一个错误或者失去响应,不过这个响应不需要保证数据是最近写入的,也就是说系统需要一直都是可用正常使用的,不会引起调用者的异常,但是并不保证响应的数据是最新的。
  • 分隔容忍(Partition tolerance) :指的是因为网络原因,部分服务器节点之间消息丢失或者延迟了,系统依然应该是可以操作的。
  • BASE是NoSQL数据库通常对可用性及一致性的弱要求原则:
    • Basically Available --基本可用。系统出现了不可预知的故障,但还是能用,相比较正常的系统而言会有响应时间上的损失和功能上的损失。
    • Soft-state --软状态/柔性事务。允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性,即允许系统在多个不同节点的数据副本存在数据延时。
    • Eventually Consistency – 最终一致性。上面说软状态,然后不可能一直是软状态,必须有个时间期限。在期限过后,应当保证所有副本保持数据一致性,从而达到数据的最终一致性。这个时间期限取决于网络延时、系统负载、数据复制方案设计等等因素。

Chubby

Chubby是一个面向松耦合分布式系统的锁服务,通常用于为一个由大量小型计算机构成的松耦合分布式系统提供高可用的锁服务,它的底层一致性实现是以Paxos为基础的。

分布式系统的锁服务

是一种跨机器的互斥机制来控制共享资源的访问。

  • 需要具备的条件

    • 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行(互斥)
    • 高可用的获取锁与释放锁
    • 高性能的获取锁与释放锁
    • 具备可重入(可以重复获取相同的锁)特性
    • 具备锁失效机制,防止死锁
    • 具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败
  • 实现方式
    • 基于数据库实现
    • 基于缓存(Redis等)实现
    • 基于ZooKeeper实现

Redis

全称Remote Dictionary Server,是一个开源的使用ANSI C语言编写、遵守 BSD 协议(一种开源节流协议)、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

ZooKeeper

是一个为分布式应用提供一致性服务的开源(Apache协议)组件,它内部是一个分层的文件系统目录树结构,规定同一个目录下只能有一个唯一文件名。

Paxos

是一种基于消息传递且具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一,其解决的问题就是在分布式系统中如何就某个值(决议)达成一致 。Paxos算法运行在允许宕机故障的异步系统中,不存在消息伪造和篡改(非拜占庭将军问题),不要求可靠的消息传递,可容忍消息丢失、延迟、乱序以及重复。它利用大多数 (Majority) 机制保证了2F+1的容错能力,即2F+1个节点的系统最多允许F个节点同时出现故障。

拜占庭将军问题

含义:在存在消息丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的。

NewSQL

NewSQL 提供了与 NoSQL 相同的可扩展性,而且仍基于关系模型,还保留了极其成熟的 SQL 作为查询语言,保证了ACID事务特性。简而言之,NewSQL就是在在传统关系型数据库上集成了 NoSQL 强大的可扩展性。

传统的SQL架构设计基因中是没有分布式的,而 NewSQL 生于云时代,天生就是分布式架构。

NewSQL的主要特征

  • SQL 支持,支持复杂查询和大数据分析。
  • 支持 ACID 事务,支持隔离级别。
  • 弹性伸缩,扩容缩容对于业务层完全透明。
  • 高可用,自动容灾。

Spanner学习记录相关推荐

  1. Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)

    Pytorch学习记录-torchtext和Pytorch的实例1 0. PyTorch Seq2Seq项目介绍 1. 使用神经网络训练Seq2Seq 1.1 简介,对论文中公式的解读 1.2 数据预 ...

  2. HTML5与CSS3权威指南之CSS3学习记录

    title: HTML5与CSS3权威指南之CSS3学习记录 toc: true date: 2018-10-14 00:06:09 学习资料--<HTML5与CSS3权威指南>(第3版) ...

  3. springboot @cacheable不起作用_Springboot学习记录13 使用缓存:整合redis

    本学习记录的代码,部分参考自gitee码云的如下工程.这个工程有详尽的Spingboot1.x教程.鸣谢! https://gitee.com/didispace/SpringBoot-Learnin ...

  4. 【Cmake】Cmake学习记录

    Cmake学习记录 1.1 常例 add_library(gen_reference_infogen_reference_info/gen_reference_info.hgen_reference_ ...

  5. ASP.NETCore学习记录(一)

    ASP.NETCore学习记录(一) asp.net core介绍  Startup.cs  ConfigureServices  Configure  0. ASP.NETCore 介绍 ASP.N ...

  6. Android开发技术周报176学习记录

    Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...

  7. add函数 pytorch_Pytorch学习记录-Pytorch可视化使用tensorboardX

    Pytorch学习记录-Pytorch可视化使用tensorboardX 在很早很早以前(至少一个半月),我做过几节关于tensorboard的学习记录. https://www.jianshu.co ...

  8. java之字符串学习记录

    java之字符串学习记录 public class StringDemo { public static void main(String[] args) { //静态初始化字符串 String s1 ...

  9. Redis的学习记录

    Redis的学习记录 1.先导了解 1.1 NOSQL概述 1.1.1 为什么要用NoSql? 1.1.2 NoSql了解 1.1.3 NoSql特点 1.1.4 NoSQL的四大分类 2. Redi ...

最新文章

  1. matlab 一个赋值变量赋值,MATLAB 基本语法----变量与赋值
  2. python强大体现在哪些方面-python应用于哪些方面
  3. 使用WordPress的Kyma plugin同Kyma断开连接的实现
  4. 15年3月c语言试卷,2015年3月二级C语言新增无纸化真题试卷(三)
  5. bzoj1051[kosaraju算法]求强连通分量
  6. poj 1860 bellman 求正环
  7. KDevelop下如何选择不同的源文件进行执行
  8. C#语法基础(二)---数组stringArrayList
  9. Spring 学习记录6 BeanFactory(2)
  10. c语言汇率转换代码_原生JS实现汇率转换功能代码实例
  11. 北京师范大学远程教育计算机考试时间,北京师范大学网络教育2020年报名截止时间...
  12. A搜索算法(python)之八数码问题
  13. 联通4g 小米不显示无服务器,小米旗舰机断流严重,信号满格消息却发不出去?...
  14. 【数据结构笔记】3.栈和队列
  15. 华为AC旁路二层组网隧道转发示例
  16. 算法:字符串全部子序列、子串、全排列
  17. geogebra使用技巧
  18. 开源版禅道的使用教程
  19. 上海亚商投顾:信创概念掀涨停潮
  20. JNLP : Java Glossary

热门文章

  1. JavaScript(二十一)淘宝购物车demo
  2. 广域网技术——SRv6隧道类型及数据转发
  3. 车尾灯实战01-认识车尾灯测试项目及测试环境和常用工具
  4. nodejs+vue高校教室自习室预约租赁系统
  5. npm5 packag-lock.json
  6. 论文阅读>烟雾检测:Video-based Smoke Detection Algorithms: A Chronological Survey
  7. 49学习容器管理平台 Docker Swarm 的基本概念和应用,包括节点管理、服务编排
  8. JAVA动态表单,自定义表单,自定义字段
  9. 微服务架构中10个常用的设计模式
  10. 如何理解不足转向和过度转向?