RDS多可用区之谜:实例(Instance)与集群(Cluster),为何功能支持大不同?

76 阅读7分钟

在云数据库的世界里,我们总是在追求两个目标:高可用性高性能。AWS RDS的“多可用区(Multi-AZ)”部署正是为实现这些目标而设计的。但大家可能没有留意,Multi-AZ旗下有两位“大将”:一位是身经百战的Multi-AZ DB实例,另一位是后起之秀Multi-AZ DB集群

最近,我的同事遇到了一个棘手的问题:他部署的RDS for MySQL Multi-AZ DB集群 无法开启审计日志(Audit Logging),而这对于他们的安全合规至关重要。AWS官方客服给出的建议是——换成 Multi-AZ DB实例

这究竟是为什么?难道名字里带“集群”的,还不如“实例”吗?今天,我们就来揭开这个谜底,彻底搞懂它们的区别,让我们在做技术选型时不再迷茫。

image.png

划重点:两种架构,两种哲学

首先,我们必须明确一个核心观点:Multi-AZ实例和Multi-AZ集群是两种完全不同的高可用架构。 它们的设计哲学、工作原理和适用场景都有天壤之别。


1. Multi-AZ DB 实例:经典的主备(Primary/Standby)架构

这是我们最熟悉,也是最“经典”的RDS高可用方案。

架构解析:

  • 一个主库(Primary):位于一个可用区(AZ),处理所有的读写请求。
  • 一个备库(Standby):位于另一个不同的可用区,处于“热备”状态。
  • 同步复制:数据通过底层的块存储级别(如EBS)进行同步复制。当应用写入数据时,该操作会同时提交到主库和备库的存储上,确认成功后才返回成功。
  • 备库不可读:这是关键!这个备库是完全被动的,它不接受任何读写请求,它的唯一使命就是在主库宕机时,随时准备接管工作。

工作模式可以比喻为:一个专职保镖。 这个保镖(备库)时刻跟在老板(主库)身边,老板做什么他都同步记录,但他从不参与具体业务(不处理读请求)。一旦老板出事,他立刻顶上,成为新的老板。

与审计日志的关系: 在这种架构下,主数据库实例是一个完整且标准的MySQL数据库引擎。因此,它支持绝大多数MySQL的原生功能。我们可以通过参数组(Parameter Group)来配置server_audit_logging等参数,启用AWS提供的MariaDB Audit Plugin,从而实现详细的审计日志记录。因为所有操作都发生在这个独立的主实例上,审计机制可以清晰地工作。


2. Multi-AZ DB 集群:读写分离增强的“类Aurora”架构

这是AWS在2021年左右推出的较新的部署选项,它借鉴了其王牌产品Aurora的设计思想。

架构解析:

  • 一个主库(Writer):位于一个可用区,处理写请求。
  • 两个备库(Readers):分别位于另外两个不同的可用区,处于“热备”状态。
  • 共享存储:这是与实例模式最根本的区别!集群中的三个实例(1个Writer,2个Reader)共享一个逻辑上的、高度冗余的存储卷。数据写入时,实际上是写入这个共享存储层,而不是通过实例间复制。
  • 备库可读:这也是它的核心优势!这两个备库是可读的,可以将应用的读请求分流到这两个备库上,从而实现读写分离,提升应用的整体读性能。

工作模式可以比喻为:一个带了两个助理的团队领导。 团队领导(主库)负责决策和修改文件(写操作),两个助理(备库)则可以随时查阅文件(读操作)来回答问题。他们操作的是同一个共享文件柜(共享存储),确保了信息的一致性。

与审计日志的关系: 现在,我们来回答那个核心问题:为什么集群不支持审计日志?

原因就在于它的共享存储架构高度托管的特性

  1. 抽象的存储层:标准的MySQL审计插件(如MariaDB Audit Plugin)通常需要将日志写入数据库实例本地的文件系统。但在集群架构中,实例本身是“无状态”的计算节点,底层是共享存储。这种设计使得传统的、基于实例文件的审计机制难以适配。
  2. 功能与架构的权衡:AWS在设计Multi-AZ集群时,首要目标是提供极致的读性能扩展比传统实例更快的故障转移(通常在35秒内)。为了实现这种高度优化的架构,AWS对底层进行了大量定制和抽象,这导致一些需要深度访问数据库实例底层资源的、较为“传统”的功能(如审计插件)无法兼容。

简单来说,AWS为了给“两个可读备库”和“更快的故障转移”这两个巨大优势,在功能上做了一些取舍,审计日志就是其中之一。这是一个典型的架构红利与功能兼容性之间的权衡

对比一览:实例 vs. 集群

特性Multi-AZ DB 实例 (Instance)Multi-AZ DB 集群 (Cluster)
核心架构主备架构,独立存储读写分离,共享存储
备库数量1个2个
备库可读性 ✅ (核心优势)
读性能无法通过备库扩展可扩展至3倍(1写+2读)
故障转移速度较快 (通常60-120秒)非常快 (通常35秒内)
功能兼容性,支持审计日志等多数功能受限,不支持审计日志等特定功能
适用场景需要高可用和合规性(如审计)的通用生产环境需要高可用,且有极高读性能要求的场景
背后哲学可靠性与兼容性优先性能与极致可用性优先

实用建议:我应该如何选择?

现在,答案已经非常清晰了。对于前面提到的情况,AWS客服的建议是完全正确的。

  1. 如果审计日志是强制要求:出于安全、合规(如金融、医疗行业标准)或内部风控的目的,必须使用审计日志。那么,应该选择 Multi-AZ DB实例。这是获得该功能的唯一途径。

  2. 如果应用读压力巨大:如果业务是读多写少,比如内容平台、社交Feed流等,并且愿意为了极致的读性能和更快的故障转移,放弃审计日志(或采用其他方式监控,如查询日志到CloudWatch),那么 Multi-AZ DB集群 仍然是一个非常强大的选择。

如何从集群切换到实例? 通常,如果需要创建一个新的Multi-AZ DB实例,然后通过数据库迁移服务(DMS)或手动的导出/导入方式将数据迁移过去,最后在应用层切换数据库连接地址。这个过程需要规划,以尽量减少停机时间。

结论

“Multi-AZ”的世界比我们想象的要丰富。实例追求的是兼容性和坚如磐石的可靠性,而集群则是在此基础上,为极致读性能和快速恢复开辟了新的道路。它们没有绝对的优劣,只有场景的匹配度。

理解了它们底层的架构差异,我们就能明白为什么有些功能“时有时无”,并自信地为我们的应用挑选出最合适的“守护神”。