亚马逊AWS官方博客
在 Amazon Aurora Global Database 中使用写入转发构建全球分布式 MySQL 应用程序
AWS于2018年正式推出Amazon Aurora全球数据库。Aurora全球数据库主要支持两类主要用例,其一为灾难恢复类解决方案,旨在以更优的恢复点目标(RPO)与恢复时间目标(RTO)处理区域整体故障,同时最大程度降低受保护数据库集群遭受的性能影响。使用Aurora全球数据库,我们通常可以实现5秒以内的RPO与1分钟以内的RTO。即使写入工作负载巨大,新的灾难恢复方案对源集群及目标集群的性能影响也将被控制在可忽略不计的水平。
Aurora全球数据库的第二大主要用例,是在最多5个远程区域中建立Amazon Aurora集群的读取副本,用以服务这些区域周边的邻近用户。与直接接入地理跨度更大的主区域相比,访问位置更接近的本地附近区域将为用户带来更低的读取延迟。
下图所示,为在两个区域之间使用MySQL逻辑复制的示例。随着查询数量的逐步增加,我们在目标集群上观察到的复制时间延迟也开始呈指数级增长。此外,测试配置中能够处理的查询数量峰值约为每秒35000次。
相比之下,下图所示为使用Aurora全球数据库时,相同工作负载与实例大小情况下的对应性能表现。其中复制时间延迟始终保持在1秒以内,每秒查询峰值约为20万次(5.7倍)。
读取副本写入转发
除了为各区域周边的用户提供更低的读取延迟之外,运行在远程区域当中的应用程序可能还需要执行数据库写入。为此,应用程序需要执行以下操作步骤:
- 建立从各远程区域指向主区域的连接。
- 在应用程序代码中将读取与写入流量拆分开来,保证将读取数据发送至周边区域的本地集群,并将写入数据发送至主区域。
- 管理写入与后续读取操作之间的一致性,因为Aurora全球数据库将以异步方式进行复制,所以虽然延迟较低、但仍然存在数据复制滞后情况。如果未能正确加以管理,则此前应用程序对主区域执行的写入操作,不一定会正确体现在后续指向本地集群的读取结果当中。
借助Aurora全球数据库提供的读取副本写入转发新功能,我们可以更轻松地立足远程区域执行写入操作。通过写入转发,应用程序先将写入操作发送至本地读取集群,再由该集群随后以透明方式把写入转发至主区域。如此一来,应用程序即可将写入操作发送至任意Aurora全球数据库远程集群,从而简化应用程序的开发考量。下面来看写入转发机制的几项主要优点:
- 托管解决方案 – 将远程集群上发出的写入操作,以透明方式转发至主集群。
- 无复制冲突 – 由于所有写入均作用于主集群,因此不会发生与复制相关的更新冲突。
- 简单 – 您可以向远程集群发出写入操作,而后执行读取操作,这些操作将体现此前完成的写入结果。
- 灵活 – 您可以在多种读取一致性级别中做出选择,借此在一致性与性能之间取得平衡。
为了简化应用程序开发并面向远程Aurora全球数据库集群执行写入,写入转发机制为用户提供以下功能:
- 使用跨Amazon骨干网络,使用安全连接连通自动托管的远程集群与主集群。
- 我们可以对远程集群中的同一实例执行读取与写入操作,而无需额外拆分读取与写入流量,或者管理单独的连接、会话或事务。
- 提供多种一致性模式,帮助用户在一致性与性能之间寻求平衡点。
Aurora全球数据库写入转发功能的基本原理,在于接收来自远程集群中某一实例上应用程序的写入语句,而后将该语句与必要的上下文一同转发至主集群,在该主实例上执行写入语句。该语句的任何执行结果(包括警告与错误)都将返回至远程实例,并最终返回至应用程序。整个过程对应用程序而言完全透明,我们只需要在集群上启用写入转发功能,并为需要执行写入操作的各个会话设置一致性模式即可。
要使用写入转发功能,大家还需要注意以下几点:
- 您需要设置
aurora_replica_read_consistency
选项,在会话当中启用写入转发功能。 - 全面支持
INSERT
,UPDATE
以及DELETE
等操作,但不支持根据临时表结果修改永久表的操作。 - 可使用锁定读取(
SELECT … FOR UPDATE, SELECT … LOCK IN SHARE MODE
)。 - 支持使用
PREPARE
与EXECUTE
语法的预处理语句。 - 不支持存储过程,存储过程必须在主集群上执行。
- 不支持DDL语句,DDL语句必须在主集群上执行。
若需了解更多详细信息,请参阅使用Amazon Aurora全球数据库。
一致性模式
当应用程序面向远程集群执行写入语句时,该语句的结果将在主集群上执行,结果立即返回至应用程序。换言之,无论我们使用哪一种一致性模式,事务本身的持久性都将不受影响。但是,当主集群发生变更之后,相关结果需要一段时间才能被复制回远程集群以实现远程读取。根据应用程序中的具体事务类型,我们可能需要/不需要保证写入后读取一致性。具体来看,我们可能希望首先等待复制完成,以确保最新读取能够体现上一项写入操作带来的变化;也可能希望保证较高的系统性能并继续执行下一条语句,而不必等待集群间复制完成。为了满足这些具体要求,Aurora全球数据库在写入转发当中提供多种可配置的一致性模式选项。
一致性模式的配置作用于会话层级,并由aurora_replica_read_consistency
参数负责控制。在默认情况下,此参数将被设置为空值;大家需要将此选项设置为session
, global
或者eventual
,而后才能使用写入转发功能。
会话一致性
在将aurora_replica_read_consistency
设置为session
之后,我们可以确保位于同一会话中的读取操作首先等待上一项写入操作,待复制完成后才实际执行读取。如此即可确保该会话中体现出写入变更,并并不保证能够体现其他会话发出的变更。
全局一致性
在将aurora_replica_read_consistency
设置为global
之后,我们可以确保读取查询将始终等待复制变更被追平在读取操作开始时间点。这意味着远程集群上执行的读取操作将能够体现主集群上发生的所有变更。尽管这种模式能够带来最强大的写入后读取一致性,但同时也会给系统性能造成巨大影响。在使用此模式时,查询的等待时间将至少等同于复制操作的滞后时间。
最终一致性
在将aurora_replica_read_consistency
设置为eventual
之后,读取查询将不再受到复制滞后的影响。由于远程副本无需等待复制完成,读取操作的延迟水平将大大降低, 需要权衡的是,不确保写之后紧接着读操作能马上看到之前写操作的修改。需要注意的是,写入操作仍然有效;在后续查询当中,主集群将在正常应用写入变更后将确认结果返回至远程集群。需要注意的是,写入操作的响应将即时完成,只是读取操作的数据变更结果可能无法及时被复制至远程集群。
在Aurora全球数据库中设置写入转发
假定存在一个预配置集群,要在Aurora全球数据库上启用写入转发功能,我们首先需要创建一个全局集群。具体操作步骤如下:
- 在Amazon RDS控制台中,选择Database。
- 选择您的源集群。
- 在Actions下拉菜单中,选择Add region。
- 在Add an AWS Region页面中的Global database identifier位置,为您的全局数据库输入一项名称,例如globalcluste。此名称即代表同时包含写入与读取区域的全球集群。
- 在Secondary Region部分,选择您的目标区域。 本文示例选择EU(Ireland)区域。
- 在当前页面中的其余设置部分,使用同样的设置创建一个Aurora DB集群,但请注意考虑以下几项设置区别:
在不同区域间写入
要在读取区域中执行写入操作,我们需要完成以下操作步骤:
- 接入写入区域内的集群,使用以下代码创建一个新schema:
- 接入读取区域以确认该区域内的所有条目是否正常存在。详见以下操作代码:
- 设置读取一致性模式,插入一行,检查当前表内容。详见以下操作代码:
总结
Amazon Aurora全球数据库允许用户创建全局分布式应用程序,保证为远程区域内的本地读取操作提供支持。以此为基础,您可以在灾难恢复解决方案中实现极优的RPO与RTO水平,也可以向世界各地的用户提供延迟更低的读取响应。通过写入转发功能,我们现在还能够让全局应用程序以更少的代码变更在远程区域内轻松执行写入操作。
欢迎大家即刻体验Amazon Aurora全球数据库与写入转发带来的精彩体验!
本篇作者