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://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-multi-master.html