《大规模分布式存储系统》第七章 分布式数据库

时间:2021-08-05 21:50:32
  • 数据库中间层

    本部分主要是介绍SQL集群化涉及的一些组件,主要包括:proxy、数据节点、agent、元数据节点等,与目前主流分布式存储系统无异。目前基于SQL的分布式数据库,最被诟病的几个问题主要如下:

    1. 扩展性差,成倍扩容,甚至需要停止服务一段时间。

    2. 单机SQL性能较差,单机吞吐的限制,会导致可用性下降(与引擎相关)。

    3. 数据库复制,采用异步方式,可能有数据丢失。

    4. 数据迁移,设计大量的数据复制,性能更是不理想(与引擎相关)。


  • Microsoft SQL Azure

    Azure SQL 对事物的支持与Megastore中实体组类似,只有同机器且相关的数据才能事物,但是由于单机引擎仍然是SQL引擎,性能依然是槽点。分片内采用NWR实现一致性,包括全局分区管理器(记录元数据)亦是。


  • Google Spanner

特点

    支持外部一致性,跨数据中心的事务。


数据模型

    类似Megastore的实体组,每个用户的数据存储已在一个“目录”内。目录是Spanner的最小管理单元(负载均衡等)。一个表顺序的划分为多个子表,一个子表包含做个目录。


架构

    物理概念:Universe(一个Spanner实例)、Zones(一个zonde属于一个数据中心,一个数据中心可以多个zone,标准是网络通信,同一个zone内网络代价较小)。

    组件:Universe Master(zone级别的状态信息)、Placement Driver(跨zone的数据迁移)

、Location Proxy、Spanserver。

    元信息:目录与节点的映射关系,可能存储在元数据表中。


复制与一致性

    Spanserver底层是Colossus文件系统(与GFS相比,支持海量小文件,且实时性更好),每个数据中心一套Colossus。子表内分片间采用Paxos协议保持一致性。同机内(Paxos组内),通过锁表实现并发控制,跨机(Paxos组间),绕过锁表,主副本充当事务协调器,通过2PC实现跨Paxos的事务。


TrueTime

    GPS + 原子钟的方式,实现系统内全局时钟的一致性。TrueTime API结构返回时间戳 + 误差。


事务及并发控制

    不考虑TrueTime:即TrueTime API返回的时间戳认为准确,忽略误差。

Pasox组内读写事务:获取系统时间戳作为版本号,进行读写事务逻辑。

Pasox组内只读事务:获取系统时间戳作为版本号,返回比这个版本号小的数据。

Pasox组内快照读:版本号根据客户端参数设置,返回比这个版本号小的数据。

Pasox组间读写事务:主Pasox充当协调者,向其他Paxos的主副本发送Perpare消息,锁定数据,等待确认后发送Commit消息,提交逻辑,并释放数据。

Pasox组间只读事务:返回比版本号小的数据,防止读到不完整的数据(即另一个进行中的事务涉及到读的数据),等待一个时间待其他事务完成,否则回滚。


    考虑TrueTime:考虑TrueTime API返回的误差,严格保证事务提交的数据,相对复杂。


数据迁移

  • 总结

    本章分布式数据库,显示改造传统单机SQL到集群化介绍涉及的中间,再到Azure SQL,都是基于传统的数据库引擎,由于其性能、扩展性等问题已经很少被使用了,并且设计到的中间件与分布式存储的组件十分相似,故本文章笔记较少。

   Spanner作为跨时代的产品,引起了NeWSQL的浪潮,目前各大公司纷纷开始自研相关产品来更好的支持业务发展。主要的包括,阿狸的OcenBase、XDB(据报道XDB将替代OceaBase,内部已经停止OceanBase的更新和新业务上线了)、开源的CockRoachDB(目前百度有一批commiter参与其中,较为活跃)。