MIT6.824/lecture-10-cloud-replicated-db-aurora/10.3.md
2022-01-25 02:41:31 +00:00

4.2 KiB
Raw Permalink Blame History

10.3 关系型数据库Amazon RDS

在MySQL基础上结合Amazon自己的基础设施Amazon为其云用户开发了改进版的数据库叫做RDSRelational Database Service。尽管论文不怎么讨论RDS但是论文中的图2基本上是对RDS的描述。RDS是第一次尝试将数据库在多个AZ之间做复制这样就算整个数据中心挂了你还是可以从另一个AZ重新获得数据而不丢失任何写操作。

对于RDS来说有且仅有一个EC2实例作为数据库。这个数据库将它的data page和WAL Log存储在EBS而不是对应服务器的本地硬盘。当数据库执行了写Log或者写page操作时这些写请求实际上通过网络发送到了EBS服务器。所有这些服务器都在一个AZ中。

每一次数据库软件执行一个写操作Amazon会自动的对数据库无感知的将写操作拷贝发送到另一个数据中心的AZ中。从论文的图2来看可以发现这是另一个EC2实例它的工作就是执行与主数据库相同的操作。所以AZ2的副数据库会将这些写操作拷贝AZ2对应的EBS服务器。

在RDS的架构中也就是论文图2中每一次写操作例如数据库追加日志或者写磁盘的page数据除了发送给AZ1的两个EBS副本之外还需要通过网络发送到位于AZ2的副数据库。副数据库接下来会将数据再发送给AZ2的两个独立的EBS副本。之后AZ2的副数据库会将写入成功的回复返回给AZ1的主数据库主数据库看到这个回复之后才会认为写操作完成了。

RDS这种架构提供了更好的容错性。因为现在在一个其他的AZ中有了数据库的一份完整的实时的拷贝。这个拷贝可以看到所有最新的写请求。即使AZ1发生火灾都烧掉了你可以在AZ2的一个新的实例中继续运行数据库而不丢失任何数据。

学生提问:为什么EBS的两个副本不放在两个数据中心呢这样就不用RDS也能保证跨数据中心的高可用了。

Robert教授我不知道怎么回答这个问题。EBS不是这样工作的我猜是因为对于大部分的EBS用户如果每一个写请求都需要跨数据中心传递这就太慢了。我不太确定具体的实现但我认为这是他们不这么做的主要原因。RDS可以看成是EBS工作方式的一种补救所以使用的还是未经更改的EBS工作方式。

如论文中表1所示RDS的写操作代价极高就如你所预期的一样高因为需要写大量的数据。即使如之前的例子执行类似于 x+10y-10这样的操作虽然看起来就是修改两个整数每个整数或许只有8字节或者16字节但是对于data page的读写极有可能会比10多个字节大得多。因为每一个page会有8k字节或者16k字节或者是一些由文件系统或者磁盘块决定的相对较大的数字。这意味着哪怕是只写入这两个数字当需要更新data page时需要向磁盘写入多得多的数据。如果使用本地的磁盘明显会快得多。

我猜当他们开始通过网络来传输8k字节的page数据时他们发现使用了太多的网络容量所以论文中图2的架构也就是RDS的架构很明显太慢了。

学生提问:为什么会慢呢?(教室今天好空)

Robert教授在这个架构中对于数据库来说是无感知的每一次数据库调用写操作更新自己对应的EBS服务器每一个写操作的拷贝穿过AZ也会写入到另一个AZ中的2个EBS服务器中另一个AZ会返回确认说写入成功只有这时写操作看起来才是完成的。所以这里必须要等待4个服务器更新完成并且等待数据在链路上传输。

如论文中表1描述的性能所担心的一样这种Mirrored MySQL比Aurora慢得多的原因是它通过网络传输了大量的数据。这就是性能低的原因并且Amazon想要修复这里的问题。所以这种架构增强了容错性因为我们在一个不同的AZ有了第二个副本拷贝但是对于性能来说又太糟糕了。