Amazon Aurora解读(SIGMOD 2017)

数据库90

Amazon在SIGMOD 2017发表了论文《Amazon Aurora: DesignConsiderations for High Throughput Cloud-Native Relational Databases》,第一次公开介绍了Aurora的设计理念和内部实现,下文是我对论文的解读,如有理解不准确的地方,欢迎大家批评指正。

>> 摘要

Aurora是亚马逊云服务AWS中的关系型数据库服务,主要面向OLTP场景。本文会详细介绍Aurora的架构以及设计背后的理念。 Aurora 基本设计理念是在云上环境下,数据库的最大瓶颈不再是计算或者存储资源,而是网络,因此基于一套存储计算分离架构,将日志处理下推到分布式存储层,通过架构上的优化来解决网络瓶颈。 下文首先会介绍Aurora如何做到不仅减少了网络资源消耗,同时还能快速故障恢复且不丢失数据,接着会介绍Aurora如何做到异步模式下分布式存储节点的一致性,最后会介绍Aurora在生产环境使用的经验。

>> 1. 概述

在云上环境下,存储计算分离作为解决系统弹性和伸缩性的方案越来越普遍。广义来说,任何数据库,底下文件系统挂一个分布式存储,即可以认为做到了存储计算分离。通过存储计算分离,可以透明添加存储节点,剔除故障节点,进行故障切换,扩展存储空间等。在这个背景下,IO不再成为数据库的瓶颈,因为IO压力可以打散在多个存储节点上,反而是网络成为瓶颈,因为数据库实例与所有存储节点的交互都需要通过网络,尤其是为了提升数据库性能,数据库实例与存储节点可能是并行交互的,这进一步加重了网络压力。传统数据库中的IO操作是需要同步执行的,当需要进行IO等待时,这往往会导致线程上下文切换,影响数据库性能。比如IO读操作,当需要访问一个数据页时,如果在缓冲池没有命中,则需要进行磁盘IO,那么读线程需要等待IO完成才能继续其它操作,同时这种动作可能会进一步引发刷脏页等。另外一个我们熟悉场景是事务提交操作(IO写操作),事务提交成功返回前一定要等待事务对应日志刷盘才能返回,由于事务是串行提交,因此其它事务也必须同步等待这个事务提交。 传统数据库中的两阶段事务尤其不适合与分布式云环境,因为二阶段提交协议对系统中参与的节点和网络要求很高,自身容错能力有限,这点与大规模分布式云环境中,软件和硬件故障是常态的特征是矛盾的。

本文介绍的Aurora是一个云上环境全新的数据库服务可以很好的解决上述传统数据库遇到的问题。 它基于存储计算分离的架构,并将回放日志部分下推到分布式存储层,存储节点与数据库实例(计算节点)松耦合,并包含部分计算功能。 Aurora体系下的数据库实例仍然包含了大部分核心功能,比如查询处理,事务,锁,缓存管理,访问接口和undo日志管理等;但redo日志相关的功能已经下推到存储层,包括日志处理,故障恢复,备份还原等。Aurora相对于传统数据库有三大优势,首先,底层数据库存储是一个分布式存储服务,可以轻松应对故障;其次,数据库实例往底层存储层只写redo日志,因此数据库实例与存储节点之间的网络压力大大减小,这为提升数据库性能提供了保障;第三,将部分核心功能(故障恢复,备份还原)下推到存储层,这些任务可以在后台不间歇地异步执行,并且不影响前台用户任务。下文会详细介绍Aurora如何实现这些功能,主要包括三大块:
1.如何基于Quorum模型保证底层存储的一致性
2.如何将redo日志相关的功能下推到存储层
3.如何消除同步点,分布式存储下如何做检查点和故障恢复

>> 2. 可扩展高可用存储

2.1复制和容错处理

Aurora存储层的复制基于Quorum协议,假设复制拓扑中有V个节点,每个节点有一个投票权,读 或 写 必须拿到Vr 或 Vw个投票才能返回。为了满足一致性,需要满足两个条件,首先Vr + Vw > V,这个保证了每次读都能读到拥有最新数据的节点;第二,Vw > V/2,每次写都要保证能获取到上次写的最新数据,避免写冲突。比如V=3,那么为了满足上述两个条件,Vr=2,Vw=2。为了保证各种异常情况下的系统高可用,Aurora的数据库实例部署在3个不同AZ(AvailablityZone),每个AZ包含了2个副本,总共6个副本,每个AZ相当于一个机房,是一个独立的容错单元,包含独立的电源系统,网络,软件部署等。结合Quorum模型以及前面提到的两条规则, V=6 ,Vw=4,Vr=3,Aurora可以容忍任何一个AZ出现故障,不会影响写服务;任何一个AZ出现故障,以及另外一个AZ中的一个节点出现故障,不会影响读服务且不会丢失数据。

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长