本文共 3554 字,大约阅读时间需要 11 分钟。
Azure SQL DB Hyperscale是微软推出的一款Amazon Aurora竞品。Aurora采用了开源版本MySQL和PostgreSQL的前端,并将它们连接到强大的后端云存储引擎,而Hyperscale采用了SQL Server的前端(查询优化器和查询处理器),并将它们连接到新的后端。
SQL DB Hyperscale是一种基于SQL的高度可扩展的服务层,适用于单个数据库,可根据工作负载需求进行调整。 借助SQL DB Hyperscale,数据库可以快速自动扩展至100TB,无需预先配置存储资源,并显著扩大应用程序增长的潜力,而不受存储大小的限制。
当数据库服务器在物理硬件上运行时,看起来像这样:
通常,如果你让DBA画出数据库故障转移架构图,他们画出来的会是这张图的多个副本,它们跨越了多台独立的服务器。数据库服务器(SQL Server、Postgres、MySQL、Oracle等)通过将记录命令复制到其他副本来保持数据同步:
一种不太常见的做法(在技术上是可行的)是将数据库服务器与文件存储分离开。你可以将数据库放在文件服务器上,然后通过UNC路径来访问它们。
如果数据库服务器满载,可以启动另一个数据库服务器,将数据和日志文件附加到新服务器上,然后继续提供服务。这是一种不太常见的做法,它存在一些问题,比如网络问题、启动另一个数据库服务器太慢,等等。但如果你在云端这么做会怎样?
RAID的职责是:
在这个新设计中,我们将构建一个更强大的存储子系统。我们将用另一种更强大的设计来替换RAID,而在这个新设计中,我们将为存储分配比之前更多的职责:
以下是新的架构图:
当你进行数据插入时:
这样做的优势在于:
在传统的SQL Server中,如果数据库很大,你可以创建多个数据文件,并将每个数据文件放在单独的卷中。
在Hyperscale中,微软通过一种更优雅的方式自动做到这一点:你看到的数据文件实际上是页面服务器。当上一个页面服务器达到约80%时,会自动为你添加另一个页面服务器,这个服务器在数据库中显示为新的数据文件。
Aurora和Hyperscale所面临的挑战(我不想将它们视为缺点,因为它们是可以被修复的):
AWS Aurora和Azure SQL DB Hyperscale在这方面采用了相同的方法,将删除/更新/插入操作委托给日志服务,让日志服务直接修改数据文件。
之前说过,日志服务可以添加更多的数据库和数据库副本,而无需额外开销。既然如此,为什么不利用这个优势呢?
在Azure SQL DB Hyperscale中,这是借助Always On Availability Group监听器来实现的。当应用程序要查询一个可读副本时,应用程序在连接期间指定ApplicationIntent = ReadOnly,并被自动重定向到其中的一个可读副本。
同样,在AWS Aurora中,应用程序连接到一个用于只读连接的DNS名称。AWS有一个有趣的特性:对于某些类型的查询,Aurora将跨多个可读副本进行并行化查询。DBA很喜欢这个特性,但如果你的查询总是需要涉及多个副本,那么你的脚下可能踩着一颗定时炸弹:你将无法进行大量的并行查询,并且AWS会对你执行的每个IO收取费用。这是在往糟糕的查询上砸钱——但有时候这样做也无可厚非。
缓存当然变得有点奇怪了。使用传统的SQL Server Availability Group,数据库引擎可以接收到每一个日志变更,因此它知道需要修改哪些页,而且即使缓存提供的是过时的数据也没关系。现在,数据页由日志服务负责修改,那么就存在副本会提供过时数据的风险。在我看来,我并不太担心这一点,因为Availability Group也可能发生类似的问题。异步复制可能会发生延迟(甚至暂停),并且副本可能会在应用变更时落后。
这种设计具有巨大的优势:副本之间不需要发生交互,也不需要在物理位置上靠近彼此。它们只是从数据文件和日志文件中读取数据,不需要知道任何有关刷新数据和日志文件的信息。
如果你符合以下这些条件,那么你应该考虑使用AWS Aurora或Azure SQL DB Hyperscale:
如果你想了解更多关于这些内容的信息,请访问以下资源:
英文原文:
转载地址:http://kwbxa.baihongyu.com/