Aurora 存储与日志即数据库

共 18 题
📑 题目列表 18 题
#
★★★

1. Aurora Limitless 如何通过分片数据库(transaction router、shard group)实现写入水平扩展?跨分片事务与分布式 JOIN 有哪些限制?

Aurora Limitless 如何通过分片数据库(transaction router、shard group)实现写入水平扩展?跨分片事务与分布式 JOIN 有哪些限制?

  • Aurora Limitless 的路由器与分片架构
  • 写入水平扩展的机制
  • 跨分片事务与分布式 JOIN 的限制

Aurora Limitless Database 是 Aurora 的扩展功能,将数据按分片键(shard key)水平分布到多个分片组(shard group)中,每个 shard group 是独立的 Aurora 集群。请求先到达 Transaction Router(事务路由器),路由器根据 SQL 中分片键的取值将语句路由到对应 shard group 执行,从而把写入负载分散到多个集群,实现写入水平扩展。跨分片事务(涉及多个 shard group 的事务)与分布式 JOIN 是受限的:跨分片 JOIN 需要把数据在路由器层聚合,开销大、延迟高,因此官方建议尽量按分片键设计查询以避免跨分片操作;跨分片事务无法保证 ACID 的严格隔离,需要应用层处理分布式一致性。

Limitless 的核心思路是"分库分表 + 无状态路由":把单集群的写入瓶颈拆到多个集群,用分片键保证数据局部性。正因为跨分片操作代价高,它要求业务表设计时必须明确分片键,并把高频关联查询控制在单分片内,这与传统分库分表中间件的思路一致。

-- 创建分片数据库(分片在表级配置)
CREATE DATABASE sales_shard;
-- 建表时用 DISTRIBUTED BY 声明分片键
CREATE TABLE orders (
  id BIGINT PRIMARY KEY,
  customer_id BIGINT,
  amount DECIMAL(10,2)
) DISTRIBUTED BY (id);
#
★★★

2. Amazon Aurora DSQL 如何通过时间同步服务(类 TrueTime 的跨区时钟)实现跨区域强一致与多区域主动-主动?其事务延迟主要来自哪里?

Amazon Aurora DSQL 如何通过时间同步服务(类 TrueTime 的跨区时钟)实现跨区域强一致与多区域主动-主动?其事务延迟主要来自哪里?

  • 类 TrueTime 的跨区时钟同步原理
  • 多区域主动-主动的强一致实现
  • 事务延迟的主要来源

Aurora DSQL(Distributed SQL)借鉴 Spanner 的 TrueTime 思路,使用跨区同步的高精度时钟系统(区域间通过 GPS 和原子钟授时,并提供带误差上界的时钟区间),以此为核心实现跨区域强一致。它采用多区域主动-主动(active-active)架构,任一区域都可读写;事务提交时通过时间戳排序与跨区协调保证线性一致,冲突检测依赖时钟区间判断事务先后。事务延迟主要来自两部分:一是跨区域网络往返(为满足强一致,协调者需与其他区域通信,提交协议涉及多区域投票/确认);二是时钟同步与仲裁的额外开销。

传统强一致需要选主或串行化,无法做到多区域同时可写。DSQL 用"外部一致的时间戳 + 仲裁"替代单主,让每个区域都能在本地发起提交,再通过跨区协调保证串行化顺序,从而兼顾可用性与一致性,代价就是每次提交都要等待跨区 RTT(往返时延)。

#
★★★

3. Aurora 的 quorum 读写(4/6 与 3/6)与隔离故障域的设计

Aurora 的 quorum 读写(4/6 与 3/6)与隔离故障域的设计是怎样的?

  • 4/6 写 quorum 与 3/6 读 quorum 的含义
  • 六副本在三个可用区(AZ)的分布
  • 隔离故障域对可用性的影响

Aurora 的存储层将每个数据库的每个数据块复制到 6 个副本,分布在 3 个可用区(AZ),每个 AZ 2 个副本。写入需要 4/6 的 quorum 确认(即至少 4 个副本写入成功才算提交成功),读取需要 3/6 的 quorum。由于 4/6 与 3/6 之和为 7 > 6,任意时刻读写 quorum 必然重叠,从而保证读到的一定是最新已提交数据,避免读到旧值。隔离故障域设计体现在:副本分布在独立 AZ,即使一个 AZ 整体故障(2 个副本同时失效),剩余 4 个副本仍能满足 4/6 写 quorum,系统不中断。

quorum 机制的核心是"读写集合必相交"以维持强一致。Aurora 选择 4/6 写、3/6 读,而不是 3/3 写、3/3 读,是为了在容忍单个 AZ 故障(损失 2 个副本)时仍能写入,同时保持写读 quorum 相交。计算上 4+3=7>6,保证一致性;而 4/6 写意味着最多容忍 2 个副本失败仍可写。

#
★★

4. Aurora 的存储层故障恢复与段(segment)重建

Aurora 的存储层故障恢复与段(segment)重建机制是怎样的?

  • 存储层段的划分与副本管理
  • 段重建与保护间隔(protection group)
  • 故障恢复的过程

Aurora 存储层把数据划分成 10GB 大小的段(segment),每个段有 6 个副本分布在 3 个 AZ;多个段组成保护间隔(Protection Group,PG)。当某个存储节点故障导致段副本数低于目标时,系统会利用剩余健康副本作为源,在后台把缺失的段复制到新的可用的存储节点上,进行段重建(segment rebuild),恢复副本数量。重建过程是后台、增量、不阻塞正常读写的。由于 quorum 只需要 4/6 写,重建期间即使少一两个副本,读写仍可正常进行,从而保证了高可用。

段重建是 Aurora 存储层自愈的核心。它把数据分成小段以便快速并行重建,且利用 quorum 的冗余余量,在副本不足时仍能服务,直到重建完成后副本数恢复满额。这种"后台自愈 + quorum 冗余"的设计使得单点存储故障对业务近乎透明。

#
★★

5. Aurora 与传统 MySQL 在主从复制上的本质差异

Aurora 与传统 MySQL 在主从复制上的本质差异是什么?

  • 传统 MySQL 的 binlog 逻辑复制
  • Aurora 的存储层日志复制
  • 复制对象与延迟的差异

传统 MySQL 主从复制基于 binlog:主库把变更写成逻辑日志(binlog),从库拉取并回放,是"计算节点间复制完整数据变更"。Aurora 则不同:主实例只把 redo 日志(日志流)发送到共享存储层,存储层负责把日志应用到持久化数据;只读副本(reader)从存储层读取已持久化的数据,而不是从主实例接收并回放 binlog。因此 Aurora 的复制发生在"日志到存储"层面,副本不下载 binlog 也不重放事务,复制成本低、延迟更小,且所有副本共享同一份存储,天然不存在传统 MySQL 那种最终只会有一份数据、需要二次传输的问题。

本质差异在于"复制的内容"与"复制的层级"。传统 MySQL 复制的是逻辑变更(binlog),副本需要独立维护一份数据;Aurora 复制的是日志流到共享存储,所有计算节点共享同一份存储数据,副本只是"存储之上再加一层计算"。这带来更低的复制延迟和更简单的一致性,是计算与存储分离的体现。

#
★★

6. Aurora 本地写入转发(Local Write Forwarding)如何把只读副本上的写请求转发到主实例处理?适用场景与一致性/延迟注意事项是什么?

Aurora 本地写入转发(Local Write Forwarding)如何把只读副本上的写请求转发到主实例处理?适用场景与一致性/延迟注意事项是什么?

  • Local Write Forwarding 的转发机制
  • 适用场景与限制
  • 一致性(读己之写)与延迟注意事项

默认情况下,发往只读副本(reader)的写语句会报错。开启 Local Write Forwarding 后,只读副本上的写请求会被自动转发到主实例(writer)执行,并把结果回传给发起连接的副本。这样应用可以统一连到副本,而不必区分读写端点。适用场景主要是"读多写少、且希望单连接内读写混合"的应用,或应用无法按语句拆分读写路径的场景。注意事项:转发存在额外往返延迟;一致性方面,转发写入后,由于存储层复制极快,同一副本上通常能立即读到自己的写入(读己之写),但跨副本的严格读一致性仍需权衡;且该特性不适用于所有语句(如某些 DDL),并受副本与主实例间网络延迟影响。

Local Write Forwarding 本质是"使用副本的连接,把写 SQL 路由到主实例"。它简化了应用层读写分离的复杂度,但把网络开销与延迟转移到了转发链路上。其设计目标是可用性而非性能,因此适用于写占比低、对一致性要求不苛刻的场景。

#
★★

7. Aurora 的「Log is Database」架构,只写 redo 日志到存储层

Aurora 的「Log is Database」架构是什么?为什么它只写 redo 日志到存储层?

  • Log is Database 的原理
  • redo 日志驱动存储层的机制
  • 减少网络 IO 的优势

Aurora 的「Log is Database」架构指:计算节点(主实例)不把完整的修改后的数据页发送到存储层,而是只发送 redo 日志(日志流)到存储层。存储层收到日志后,负责把日志应用到数据页并持久化,在后台生成最终的数据块。这样主实例与存储层之间只传输日志而非数据页,大幅减少了网络 IO 与带宽。由于日志量远小于页面数据量,写入成本和网络开销显著降低,同时存储层可以异步、批量地应用日志,实现快速恢复。

传统数据库要么整页写盘,要么对远程存储传输整页。Aurora 颠倒了"日志在本地、数据在远端"的关系:把日志发送到存储,让存储来 apply 日志。日志是顺序小写,传输量小、可压缩,从而把网络 IO 降到最低,这是 Aurora 性能与成本优势的基石。

#
★★

8. Aurora 的 6 副本(3 AZ × 2)与 quorum 读写

Aurora 的 6 副本(3 AZ × 2)与 quorum 读写是如何设计的?

  • 6 副本的分布(3 AZ × 2)
  • 写 quorum 4/6、读 quorum 3/6
  • 高可用与强一致的平衡

Aurora 存储层把每个数据块保存为 6 个副本,分别放在 3 个可用区(AZ),每个 AZ 2 个副本,形成 3 AZ × 2 的拓扑。写入需要 4/6 个副本确认(写 quorum),读取需要 3/6 个副本(读 quorum)。由于 4+3=7>6,任意读写 quorum 必然相交,保证读到的最新已提交数据。该设计能容忍任意一个 AZ 完全故障(损失 2 副本)仍可写入,同时保持强一致。

3 AZ × 2 的副本分布是"防 AZ 级故障"的关键:一个 AZ 坏了只损失 2 个副本,剩余 4 个仍满足 4/6 写 quorum。相比 3 副本或 2 副本方案,6 副本提供了更高的容错能力,代价是存储成本更高。读写 quorum 相交是保证线性一致性的数学基础。

#
★★

9. Aurora 计算与存储分离带来的只读副本扩展优势

Aurora 计算与存储分离带来的只读副本扩展优势是什么?

  • 计算与存储分离的架构
  • 只读副本的快速横向扩展
  • 副本不复制数据的优势

在计算与存储分离的架构下,Aurora 的计算节点(主实例和只读副本)与存储层相互独立,所有计算节点共享同一份底层存储数据。因此添加只读副本(reader)时不需要复制或迁移数据,只需在共享存储之上启动新的计算节点即可,秒级完成扩展。这带来显著优势:读副本可以快速横向扩展以分散读流量;副本之间数据天然一致;副本扩展不增加存储、不产生数据复制开销。但也存在共享存储的约束,如副本数量与吞吐受底层存储能力限制。

传统 MySQL 加只读从库需要复制全量数据并追 binlog,耗时且消耗 IO。Aurora 因为副本共享存储,扩容只涉及"加计算节点",数据无需复制,因此扩展速度快、成本低。这是存算分离架构最直接的价值。

#
★★

10. Aurora 的并行查询与列存副本(Aurora Parallel Query)

Aurora 的并行查询与列存副本(Aurora Parallel Query)是如何工作的?

  • 并行查询(Parallel Query)的原理
  • 列存副本与 InnoDB 列存
  • 适用场景与限制

Aurora Parallel Query 利用存储层把计算下推到存储节点,让多个存储节点并行扫描数据,配合独立的列存副本(Aurora InnoDB Column Store,将行存数据组织成列存格式)来加速分析类查询。并行查询把扫描延迟、聚合等操作分散到 Aurora 存储的所有节点上并行执行,减少发回计算节点的数据量;列存副本则用列式存储压缩和对列聚合的高效性,显著提升大表上的分析查询性能。适用场景是 OLAP 风格的大表扫描、聚合、过滤查询;限制是其主要针对读为主的查询,写入仍走行存,且列存副本有额外的异步同步延迟。

Aurora 的并行查询本质是"存储层的并行执行 + 列存优化"。它把数据扫描从单个计算节点搬到存储节点的分布式并行环境中,减少数据传输与单点 CPU 瓶颈。列存副本进一步优化了列式算子。这让 Aurora 在保持 MySQL 兼容的同时,能处理中等规模的分析工作负载。

#
★★

11. Aurora 的存储层,6 副本跨 3 AZ、日志驱动复制与快速恢复?

Aurora 的存储层是如何通过 6 副本跨 3 AZ、日志驱动复制实现快速恢复的?

  • 存储层的 6 副本跨 3 AZ 拓扑
  • 日志驱动复制(Log is Database)
  • 崩溃恢复与快速恢复机制

Aurora 存储层将每个数据块保存为 6 个副本,分布在 3 个 AZ(每 AZ 2 副本),采用日志驱动复制:主实例只把 redo 日志发送到存储层,存储层各副本 apply 日志并持久化。由于日志是顺序追加的小量写入,复制同步快、带宽低。快速恢复体现在:崩溃后,存储层的各副本已经有日志,主实例只需与存储层交换日志位点,确认哪些日志已持久化,然后从存储层恢复已提交数据,无需像传统数据库那样重放大量 WAL 或处理未落盘页。aurora 的日志(redo)与应用(数据页持久化)分离,使得恢复过程主要是"确认日志位点 + 从存储读取",时间短、可预测。

关键区别是 Aurora 把"日志持久化"与"数据页持久化"都交给存储层,且日志在发送的那一刻就分布到多个副本。因此故障恢复时无需重放日志,只需对齐日志位点并读取存储中已应用的数据,恢复路径短、RTO 低。这也是"日志即数据库"带来的恢复优势。

#
★★

12. Aurora 故障转移的流程(检测、切换、应用重连)与 RTO 组成

Aurora 故障转移的流程(检测、切换、应用重连)与 RTO 组成是怎样的?

  • 故障检测与仲裁
  • 端点切换与角色提升
  • 应用重连与 RTO 组成

Aurora 故障转移(Failover)流程分三步:检测、切换、应用重连。检测:监控服务发现主实例异常,通过存储层 quorum 与心跳确认故障;切换:将某个只读副本或新实例提升为主角色,并更新集群的端点(endpoint)指向新主;应用重连:应用连接池中的现有连接被断开,需重新通过集群端点连接新主。RTO(恢复时间)主要由以下环节组成:故障检测时间、提升新主实例的时间、存储层日志对齐时间、应用重连与连接建立时间。Aurora 的 RTO 通常为数秒内(具体取决于副本提升与配置),其核心是共享存储让新主无需复制数据,只需提升即可快速接管。

RTO 的每次优化都对应一个环节:检测用快速健康检查缩短;切换用"预置副本 + 存储共享"加快(新主无需下载数据);重连用集群端点固定地址 + 应用连接池重试机制缩短。理解 RTO 组成,才能逐环节优化把故障转移做到秒级。

#

13. Aurora Serverless v2 的 ACU 弹性伸缩机制

Aurora Serverless v2 的 ACU 弹性伸缩机制是怎样的?

  • ACU(Aurora Capacity Unit)的含义
  • 弹性伸缩的触发与范围
  • 与 v1 和固定实例的差异

Aurora Serverless v2 以 ACU(Aurora Capacity Unit)作为容量单位,一个 ACU 约等于 2GB 内存加上对应的 CPU 与网络资源。它会根据负载(CPU 利用率、连接数等)自动在配置的最小与最大 ACU 之间分钟级调整容量,无需停机。扩容可在几秒内完成,缩容渐进。与 v1 不同,v2 支持秒级伸缩、不限制连接数、可直接访问数据库端点(无 proxy 层),容量粒度更细、更平滑。用户只需设置 Min ACU 和 Max ACU 边界,按实际使用量付费。

Serverless v2 的核心是把"实例规格"从固定值变成可伸缩区间,通过监控指标自动伸缩 ACU。它按用计费,适合负载波动大、难预测的场景。相比 v1 的"暂停/唤醒"模式,v2 提供连续伸缩,避免冷启动尖峰。

#

14. Aurora 的 Backtrack 与快速克隆(Copy-on-Write)

Aurora 的 Backtrack 与快速克隆(Copy-on-Write)机制是什么?

  • Backtrack 快速回滚的原理
  • 快速克隆的 Copy-on-Write
  • 适用场景

Backtrack 允许把 Aurora 集群快速回滚到过去某个时间点(分钟级),用于恢复误操作(如误删数据、误 UPDATE)。它依赖存储层维护的日志与应用位点,可在不重建数据库的情况下回卷数据。快速克隆(Clone)基于 Copy-on-Write(写时复制)技术:克隆时只创建元数据,不复制数据;只有被修改的存储页才在写入时复制,因此克隆瞬间完成且初始成本极低,非常适合创建测试、开发环境或做数据导出的临时副本。

Backtrack 与 Clone 都是复用存储层特性。Backtrack 利用已持久化的日志快速回退到旧位点;Clone 利用 Copy-on-Write 实现省空间的快照式克隆。二者都避免了传统"全量复制/重建"的高成本,是 Aurora 运维的常用工具。

#

15. Aurora 的副本读取与故障恢复,多可用区部署?

Aurora 的副本读取与故障恢复是如何通过多可用区部署实现的?

  • 多可用区(Multi-AZ)的副本分布
  • 只读副本的读取与故障切换
  • 存储层 3 AZ 的容灾

Aurora 默认将存储层 6 副本跨 3 个可用区(AZ)部署,计算节点(主实例和只读副本)也分布在多个 AZ。只读副本(reader)可以分散在不同 AZ 接受读流量,实现读扩展与跨 AZ 高可用。当主实例故障时,Aurora 会提升一个只读副本为新主(或在无副本时新建),由于存储层跨 AZ 有 quorum 冗余,且副本共享存储,切换后可立即从存储读取数据,实现快速恢复。多 AZ 部署保证了即使某个 AZ 故障,系统仍可通过其他 AZ 的副本与 quorum 继续服务。

多可用区部署是 Aurora 高可用的基础。它把存储与计算都分散到多个 AZ,既防得住"主机故障"(切换副本),也防得住"AZ 级故障"(存储 quorum 仍满足)。读流量通过只读副本在多个 AZ 负载均衡,进一步提升了可用性与扩展性。

#

16. Aurora 与自建 MySQL 的兼容性,协议、复制与迁移路径?

Aurora 与自建 MySQL 的兼容性如何?协议、复制与迁移路径是什么?

  • MySQL 协议与 SQL 兼容性
  • 与自建 MySQL 的复制/迁移
  • 迁移工具与路径

Aurora MySQL 保持与 MySQL 的高度兼容:使用 MySQL 原生协议,应用可用标准 MySQL 驱动连接,绝大部分 SQL、存储过程、触发器、视图等可在 Aurora 上运行。迁移路径包括:通过 mysqldump 逻辑导出导入、使用 AWS Database Migration Service(DMS)在线迁移、或利用 Aurora 的 binlog 兼容能力(Aurora 也输出 binlog)与自建库建立复制关系。此外可通过 AWS 的快照/克隆从自建库(经 RDS MySQL)迁移到 Aurora。需要注意部分高级特性(如某些插件、特定参数)与自建 MySQL 存在差异,迁移前需做兼容性评估。

兼容性决定了迁移成本。Aurora 通过兼容 MySQL 协议与 SQL 方言,让应用几乎零改动迁移;同时支持工具化迁移(DMS 在线、mysqldump 离线)和 binlog 复制,提供平滑的数据迁移路径。理解这些能帮助评估"是否/如何迁移到 Aurora"。

#

17. Aurora Serverless 与容量自动伸缩?

Aurora Serverless 与容量自动伸缩是如何工作的?

  • Aurora Serverless 的自动伸缩原理
  • 伸缩的驱动指标与上限
  • v1 与 v2 的差异

Aurora Serverless 会根据负载自动伸缩容量:系统监控 CPU、内存、连接数等指标,当负载上升时自动增加容量(ACU),负载下降时自动缩减,按实际用量计费(按秒计费)。v1 在无负载时可暂停为 0(暂停后需唤醒,冷启动有延迟),容量范围有限;v2 提供连续、秒级的伸缩,Min/Max ACU 可配置,支持更多内核与更大范围,且不会暂停。自动伸缩省去了手工调整实例规格的运维,适合负载波动大、难以预测的场景。

Serverless 的价值是"按需付费 + 免运维"。自动伸缩通过监控指标驱动,在配置的上下限之间调整容量。v2 相比 v1 改善了伸缩粒度、范围与冷启动问题,是更成熟的 Serverless 形态。

#

18. Aurora 的跨区域复制(Global Database)与灾备切换

Aurora 的跨区域复制(Global Database)与灾备切换是如何实现的?

  • Global Database 的跨区域复制机制
  • 灾备切换(switchover/failover)流程
  • RPO/RTO 与读写特性

Aurora Global Database 由一个主区域(primary)和多个跨区域(secondary)组成,主区域的数据通过存储层级别的日志复制到次级区域,复制延迟通常很低(亚秒到秒级)。次级区域主要用于读取(降低跨区域读延迟)和灾备。灾备切换有两种:Planned Switchover(计划内切换,主备对调,RPO 为 0,用于演练或迁移)和 Failover(故障切换,主区域故障时提升次级区域为主,RPO 可能非零,取决于复制延迟)。切换后应用需更新或通过全局端点/WRR 找到新主区域。

Global Database 的跨区域复制发生在存储层(日志级别),比基于 binlog 的应用复制延迟更低、更可靠。灾备切换的核心是"提升次级区域为主 + 更新全局端点"。理解 RPO 由复制延迟决定、RTO 由切换与重连决定,是设计跨区域灾备的关键。