关于AWS AUORA FOR MYSQL MULTI MASTER 多活数据库的技术解析

AWS Aurora产品线在2019年8月新推出了Multi Master多活数据库,俗称双活,或者Active-Active集群。这款产品目前中文资料比较少,因此翻译整理如下。整篇文档不涉及产品机密,都使用官方公开的Blog和文档库的英文素材整理而成。供大家参考。

1.  什么是MULTI MASTER多活数据库

普通的Aurora区域高可用实例,在一个Region内只有一个实例是Writer角色,可以写入数据,或者叫做Master节点。其他节点都是只读节点,叫做Reader角色。一个Master最大可以带15个只读实例。遇到故障自动切换,按策略从15个中的一个从reader角色promote升级为writer角色,成为主节点。

Multi-Master实例,是指在一个Region内分布2个实例,且角色是writer,可以写入数据。跨多个Region的场景不支持。

2.  在哪些区域可以申请此服务

美国东部(弗吉尼亚北部us-east-1 NorthVirginia)、美国东部(俄亥俄us-east-2 Ohio)、美国西部(俄勒冈us-west-2 Oregon)和欧洲爱尔兰(eu-west-1 Ireland)区域。

3.  支持哪些版本

目前仅Aurora for MySQL 5.6系列支持。其他系列不支持。

4.  主要实现原理

由于有两个Writer节点,因此应用可以同时操作,没有传统数据库主备切换的中断和重连的时间。当任何一个Writer节点接受到活动数据后,将数据写入到6个副本返回写入成功。当磁盘写入成功后,通知另外一个Writer节点告知数据变化,并保存在缓存中。这个复制过程,复制方式是通过redo change records,有大约30ms的时延。

如果6个部分中的某个写入失败,则会触发回滚,其他几个节点写入成功了也会撤回,并给应用层返回一个死锁的错误信息。数据是分片(Page)写入,一个Page 16KB大小。

架构原理如下图所示。

5.  怎么开通服务

在可以用的Region内,选择Aurora,选择目前支持的MySQL 5.6系列,即可选择Multi-Master产品。如下截图。

开通后的效果如图。

6.  两个节点怎么调度

由于两个节点都可以写,两个节点各自都有独立的endpoint入口。建议使用Java的单例模式,维护一个对Writer Endpoint URL的健康检查,然后决定写入哪一个。其中一个失败可以快速将所有流量都切换到正常的writer调用上。同时,最好在业务上,也增加分实例写入的逻辑。避免冲突。

如下图所示。

通过控制台可以分别看到两个节点各自的endpoint,如下图所示。

7.  是否会出现冲突

当两个节点对同一个数据分页写入时候会出现冲突,并返回给应用程序。应用程序需要考虑并处理这种冲突。更好的实现方式就是,尽量把写入都放到一个节点上去完成。

如何模拟冲突,参考这个文档中间篇幅的“Conflict management”有示例代码。

关于更多冲突,参考这个文档

8.  数据一致性如何

Multi-Master Aurora提供的是写后读一致性,即read-after-write consistency,这意味着数据一旦写入完成,那么读取出来的总是最新的数据。

由于是两个Writer,这意味着,这存在写入和读取不是一个节点的问题。默认情况下,Multi-Master Aurora只提供本节点的read-after-write consistency保证。另外一个节点将在写入成功的数毫秒(ms)内,被通知到写入成功的状态,然后才能查询出来最新数据。

如下截图所示,两个Writer实例间的复制延迟。

如果希望两个节点之间都做到read-after-write consistency,即所谓的Global Read-After-Write Consistency(GRWC),那么需要调整配置启用这个功能。这个功能将损失轻微的读性能,以获得两个Active都保证read-after-write consistency一致性。这个开关由aurora_mm_session_consistency_level控制,其中Instance_RAW表示只有写入节点一致性,Regional表示两个节点都启用写后读一致性。例如如下截图。

9.  数据库实例和引擎层面有什么限制

目前Multi-Writer仅支持一个集群2个Writer,不支持第三个节点为Writer节点,也不支持第三个节点是Reader节点。如下截图。

目前目前Multi-Writer仅支持在单一Region内有效,Aurora的跨Region建立Replica无效。

关于引擎方面,不支持binlog复制。关于其他限制,参考这里的文档

10.SQL层面有何限制

有少量SQL限制,参考这里的文档。(与上边的文档是同一份文档的不同标签位置)

11.需要大量读敏感的操作怎么处理

由于Multi-Master目前仅支持2个Writer,而没有Read Replica,要有大量读敏感应用,可以把其中一个节点设置为制度状态,调用mysql.rds_set_read_only存储过程实现。参考这里的文档的页面中部的标题“Using Instance Read-Only Mode”的章节。因为原文这个小标题没有标签,因此没办法快速定位,需要在本文内搜索定位。

12.适合场景

Multi-Writer Aurora适合对MySQL有可用时间要求的场景,包括双机双活的应用、企业内部多租户的集中式数据库等。

13.参考信息来源

新产品发布(英文):https://aws.amazon.com/cn/about-aws/whats-new/2019/08/amazon-aurora-multimaster-now-generally-available/

技术原理(英文):https://aws.amazon.com/cn/blogs/database/building-highly-available-mysql-applications-using-amazon-aurora-mmsr/

使用操作(英文)https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-multi-master.html