Files
MIT6.824/lecture-10-cloud-replicated-db-aurora/10.1-aurora-bei-jing-li-shi.md
2022-01-25 02:41:31 +00:00

8.6 KiB
Raw Blame History

10.1 Aurora 背景历史

今天的论文是Amazon的Aurora。Aurora是一个高性能高可靠的数据库。Aurora本身作为云基础设施一个组成部分而存在同时又构建在Amazon自己的基础设施之上。

我们之所以要看这篇论文,有以下几个原因:

  • 首先这是最近的来自于Amazon的一种非常成功的云服务有很多Amazon的用户在使用它。Aurora以自己的方式展示了一个聪明设计所取得的巨大成果。从论文的表1显示的与一些其他数据库的性能比较可以看出在处理事务的速度上Aurora宣称比其他数据库快35倍。这个数字非常了不起了。
  • 这篇论文同时也探索了在使用容错的通用General-Purpose存储前提下性能可以提升的极限。Amazon首先使用的是自己的通用存储但是后来发现性能不好然后就构建了完全是应用定制Application-Specific的存储并且几乎是抛弃了通用存储。
  • 论文中还有很多在云基础设施世界中重要的细节。

因为这是Amazon认为它的云产品用户应该在Amazon基础设施之上构建的数据库所以在讨论Aurora之前我想花一点时间来回顾一下历史究竟是什么导致了Aurora的产生

最早的时候Amazon提供的云产品是EC2它可以帮助用户在Amazon的机房里和Amazon的硬件上创建类似网站的应用。EC2的全称是Elastic Cloud 2。Amazon有装满了服务器的数据中心并且会在每一个服务器上都运行VMMVirtual Machine Monitor。它会向它的用户出租虚拟机而它的用户通常会租用多个虚拟机用来运行Web服务、数据库和任何其他需要运行的服务。所以在一个服务器上有一个VMM还有一些EC2实例其中每一个实例都出租给不同的云客户。每个EC2实例都会运行一个标准的操作系统比如说Linux在操作系统之上运行的是应用程序例如Web服务、数据库。这种方式相对来说成本较低也比较容易配置所以是一个成功的服务模式。

这里有一个对我们来说极其重要的细节。因为每一个服务器都有一块本地的硬盘在最早的时候如果你租用一个EC2实例每一个EC2实例会从服务器的本地硬盘中分到一小片硬盘空间。所以最早的时候EC2用的都是本地盘每个EC2实例会分到本地盘的一小部分。但是从EC2实例的操作系统看起来就是一个硬盘一个模拟的硬盘。

EC2对于无状态的Web服务器来说是完美的。客户端通过自己的Web浏览器连接到一些运行了Web服务的EC2实例上。如果突然新增了大量客户你可以立刻向Amazon租用更多的EC2实例并在上面启动Web服务。这样你就可以很简单的对你的Web服务进行扩容。

另一类人们主要运行在EC2实例的服务是数据库。通常来说一个网站包含了一些无状态的Web服务任何时候这些Web服务需要一些持久化存储的数据时它们会与一个后端数据库交互。

所以现在的场景是在Amazon基础设施之外有一些客户端浏览器C1C2C3。之后是一些EC2实例上面运行了Web服务这里你可以根据网站的规模想起多少实例就起多少。这些EC2实例在Amazon基础设施内。之后还有一个EC2实例运行了数据库。Web服务所在的EC2实例会与数据库所在的EC2实例交互完成数据库中记录的读写。

不幸的是对于数据库来说EC2就不像对于Web服务那样完美了最直接的原因就是存储。对于运行了数据库的EC2实例获取存储的最简单方法就是使用EC2实例所在服务器的本地硬盘。如果服务器宕机了那么它本地硬盘也会无法访问。当Web服务所在的服务器宕机了是完全没有问题的因为Web服务本身没有状态你只需要在一个新的EC2实例上启动一个新的Web服务就行。但是如果数据库所在的服务器宕机了并且数据存储在服务器的本地硬盘中那么就会有大问题因为数据丢失了。

Amazon本身有实现了块存储的服务叫做S3。你可以定期的对数据库做快照并将快照存储在S3上并基于快照来实现故障恢复但是这种定期的快照意味着你可能会损失两次快照之间的数据。

所以为了向用户提供EC2实例所需的硬盘并且硬盘数据不会随着服务器故障而丢失就出现了一个与Aurora相关的服务并且同时也是容错的且支持持久化存储的服务这个服务就是EBS。EBS全称是Elastic Block Store。从EC2实例来看EBS就是一个硬盘你可以像一个普通的硬盘一样去格式化它就像一个类似于ext3格式的文件系统或者任何其他你喜欢的Linux文件系统。但是在实现上EBS底层是一对互为副本的存储服务器。随着EBS的推出你可以租用一个EBS volume。一个EBS volume看起来就像是一个普通的硬盘一样但却是由一对互为副本EBS服务器实现每个EBS服务器本地有一个硬盘。所以现在你运行了一个数据库相应的EC2实例将一个EBS volume挂载成自己的硬盘。当数据库执行写磁盘操作时数据会通过网络送到EBS服务器。

这两个EBS服务器会使用Chain Replication9.5进行复制。所以写请求首先会写到第一个EBS服务器之后写到第二个EBS服务器然后从第二个EBS服务器EC2实例可以得到回复。当读数据的时候因为这是一个Chain ReplicationEC2实例会从第二个EBS服务器读取数据。

所以现在运行在EC2实例上的数据库有了可用性。因为现在有了一个存储系统可以在服务器宕机之后仍然能持有数据。如果数据库所在的服务器挂了你可以启动另一个EC2实例并为其挂载同一个EBS volume再启动数据库。新的数据库可以看到所有前一个数据库留下来的数据就像你把硬盘从一个机器拔下来再插入到另一个机器一样。所以EBS非常适合需要长期保存数据的场景比如说数据库。

对于我们来说有关EBS有一件很重要的事情这不是用来共享的服务。任何时候只有一个EC2实例一个虚机可以挂载一个EBS volume。所以尽管所有人的EBS volume都存储在一个大的服务器池子里每个EBS volume只能被一个EC2实例所使用。

尽管EBS是一次很大的进步但是它仍然有自己的问题。它有一些细节不是那么的完美。

  • 如果你在EBS上运行一个数据库那么最终会有大量的数据通过网络来传递。论文的图2中就有对在一个Network Storage System之上运行数据库所需要的大量写请求的抱怨。所以如果在EBS上运行了一个数据库会产生大量的网络流量。在论文中有暗示除了网络的限制之外还有CPU和存储空间的限制。在Aurora论文中花费了大量的精力来降低数据库产生的网络负载同时看起来相对来说不太关心CPU和存储空间的消耗。所以也可以理解成他们认为网络负载更加重要。
  • 另一个问题是EBS的容错性不是很好。出于性能的考虑Amazon总是将EBS volume的两个副本存放在同一个数据中心。所以如果一个副本故障了那没问题因为可以切换到另一个副本但是如果整个数据中心挂了那就没辙了。很明显大部分客户还是希望在数据中心故障之后数据还是能保留的。数据中心故障有很多原因或许网络连接断了或许数据中心着火了或许整个建筑断电了。用户总是希望至少有选择的权利在一整个数据中心挂了的时候可以选择花更多的钱来保留住数据。 但是Amazon描述的却是EC2实例和两个EBS副本都运行在一个AZAvailability Zone

在Amazon的术语中一个AZ就是一个数据中心。Amazon通常这样管理它们的数据中心在一个城市范围内有多个独立的数据中心。大概2-3个相近的数据中心通过冗余的高速网络连接在一起我们之后会看一下为什么这是重要的。但是对于EBS来说为了降低使用Chain Replication的代价Amazon 将EBS的两个副本放在一个AZ中。