分布式架构
目前主要的分布式架构有:
- 分库分表
- 集中写入(Oceanbase)
- 强存储分布式(spanner/TiDB)
- 日志即数据(Aurora)
以及达梦8中的透明分布式数据库(TDD)架构。
分布式数据库的共性在于:
- 多副本
- 采用Paxos或Raft协议保证副本强一致性
- 支持事务
- 计算-存储分离
分库分表
分库分表根据特定的拆分键将数据拆分成若干份,存放在不同的库中,在接收到应用发送的SQL后,由特定的数据库中间件/数据库服务解决数据分布在多个库上的问题。
此种方式的优势在于提升了存储扩展能力,提升IO性能以提升访问速度。
分库分表的实现
阶段一
多个应用业务模块全部对应到一个数据库服务上
阶段二
在一的基础上,添加一台数据库,与业务库保持数据同步,以保证在业务库故障时实现切换。
阶段三
在阶段二的基础上,将读写请求分离到不同服务器上,读写库之间保持数据同步。
阶段四
将应用的各个模块分离,每个模块的请求发送到不同库,根据模块业务的复杂度和特性配置不同的库节点数量。
分库分表的弊端
- 需要数据库中间件处理SQL中涉及的表分布在不同库/表上的情况,但中间件不是数据库引擎,没有完整的SQL能力,只能支持简单的DML。
- 严重依赖sharding key,必须精心设计利用sharding key。
- 数据分片让join操作很容易跨节点,存在性能隐患。
- 数据存储层是独立DB实例,无法为事务特性提供底层支持,只能放弃事务特性,或在外部基于XA实现,性能较差。
- 基于 DB实例间的同步复制实现数据副本,从节点故障导致事务无法提交。
总结
分库分表与分布式数据库的共性在于:
- 数据切分
- 水平扩展等
但本质差距在于:
分库分表的中间件层只有简单的SQL解析和结果集合并,简单的事务机制,缺乏完成的数据库职能。
广域分布式数据库
Spanner是Google的全球级分布式数据库,拥有极好的扩展性,可以扩展到数百万的机器,同时通过同步复制和多版本满足外部一致性,它有几个特别的功能:无锁读事务, 原子schema修改,读历史数据无block。
Spanner在F1和GFS之间。F1是Google开发的可容错的RDBMS,它的特点有:
- 7x24高可用
- 同时提供强一致性和弱一致
- 可扩展
- 支持SQL
- 事务提交延迟低,高吞吐
Colossus(GFS II)
分布式文件系统,对应开源的新HDFS
Spanner的使用环境有如下特点:
- 核心业务,不能停止
- 业务范围大,服务于全球市场
- 实时性要求不高
- 需要SQL特性,事务一致性等
广域范围内数据复制的难题:
- 光缆中断
- 设备基数大
- 传统的数据库副本技术在网络故障,设备故障时影响业务的持续性
进行事务并发控制(MVCC)所依赖的时间戳问题
- 事务的先后顺序
- 为判断先后顺序所需要的时间戳
- 实现全局一致的时间戳
数据副本一致性
Paxos协议
以分区为单位建立Paxos协议组,每个分区存在多个副本,组成员自动选举主从,不需要人工干预,多数派-成功过半即可判定达成一致,落后节点的数据推进等。
MVCC全局一致时间戳
GPS时钟+原子钟
全局授时延迟通过commit-wait机制,屏蔽不同数据中心的时钟差。
总结
广域分布式数据库为保证多副本高可用和分布式事务必然存在较长时间的延迟,对于响应时间要求很高的业务来说并不适合。
集中写入
业务的特点:
总数据量非常大,但较短时间的数据修改量较小。
例如oceanbase使用单台服务器记录一段时间的修改增量,并使用内存表和SSD的方式提高性能。
修改增量之外的基线数据分布在多台服务器上,查询时由特定服务将基线数据和修改增量融合后返回
此时写事务集中在updateserver上,读事务分散在多台基线数据上,及实现了跨行跨表事务,避免复杂的分布式写事务,又有较好的扩展性。
Oceanbase的lsm-tree数据结构
Oceanbase将内存分为MemTable,用于写;热点缓存用于读。所有的数据修改都先放到内存的MemTable中,这部分数据在内存中保存较长的时间,当内存空间快写满或到某个固定的时间或由人工触发,此时写入硬盘,后面与基线数据合并,形成新的基线数据。
日志即数据
这一理念的提出者-亚马逊aurora。难点在于IO层向计算层的通信。
Aurora数据库为云数据库,对于主从部署来说,每次进行增删改操作:
- 主节点的日志写入存储
- 主节点日志写镜像存储,向从节点发送日志
- 从节点apply日志,产生自己的日志,写入存储。
- 从节点的日志写入镜像存储
- 事务提交
日志即数据
将日志放到存储层。主节点的写入操作,不论有几个副本,只会有一次日志写入。淘汰了刷检查点,数据缓冲区换页等导致的网络IO。
多副本在存储层通过日志推演实现数据同步。
这种设计的好处在于降低计算-存储间的网络IO,提升性能
DMTDD实现
计算与存储分离,与DMDSC一同实现多点读写。
数据划片
将数据文件按照特定大小进行划片,每个数据分片称为一个区块,存储在不同的存储服务器中,同一区块的副本可有多个,互为备份。