在云数据库的世界里,我们总是在追求两个目标:高可用性和高性能。AWS RDS的“多可用区(Multi-AZ)”部署正是为实现这些目标而设计的。但大家可能没有留意,Multi-AZ旗下有两位“大将”:一位是身经百战的Multi-AZ DB实例,另一位是后起之秀Multi-AZ DB集群。
最近,我的同事遇到了一个棘手的问题:他部署的RDS for MySQL Multi-AZ DB集群 无法开启审计日志(Audit Logging),而这对于他们的安全合规至关重要。AWS官方客服给出的建议是——换成 Multi-AZ DB实例。
这究竟是为什么?难道名字里带“集群”的,还不如“实例”吗?今天,我们就来揭开这个谜底,彻底搞懂它们的区别,让我们在做技术选型时不再迷茫。
划重点:两种架构,两种哲学
首先,我们必须明确一个核心观点: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)共享一个逻辑上的、高度冗余的存储卷。数据写入时,实际上是写入这个共享存储层,而不是通过实例间复制。
- 备库可读:这也是它的核心优势!这两个备库是可读的,可以将应用的读请求分流到这两个备库上,从而实现读写分离,提升应用的整体读性能。
工作模式可以比喻为:一个带了两个助理的团队领导。 团队领导(主库)负责决策和修改文件(写操作),两个助理(备库)则可以随时查阅文件(读操作)来回答问题。他们操作的是同一个共享文件柜(共享存储),确保了信息的一致性。
与审计日志的关系: 现在,我们来回答那个核心问题:为什么集群不支持审计日志?
原因就在于它的共享存储架构和高度托管的特性。
- 抽象的存储层:标准的MySQL审计插件(如MariaDB Audit Plugin)通常需要将日志写入数据库实例本地的文件系统。但在集群架构中,实例本身是“无状态”的计算节点,底层是共享存储。这种设计使得传统的、基于实例文件的审计机制难以适配。
- 功能与架构的权衡:AWS在设计Multi-AZ集群时,首要目标是提供极致的读性能扩展和比传统实例更快的故障转移(通常在35秒内)。为了实现这种高度优化的架构,AWS对底层进行了大量定制和抽象,这导致一些需要深度访问数据库实例底层资源的、较为“传统”的功能(如审计插件)无法兼容。
简单来说,AWS为了给“两个可读备库”和“更快的故障转移”这两个巨大优势,在功能上做了一些取舍,审计日志就是其中之一。这是一个典型的架构红利与功能兼容性之间的权衡。
对比一览:实例 vs. 集群
| 特性 | Multi-AZ DB 实例 (Instance) | Multi-AZ DB 集群 (Cluster) |
|---|---|---|
| 核心架构 | 主备架构,独立存储 | 读写分离,共享存储 |
| 备库数量 | 1个 | 2个 |
| 备库可读性 | 否 ❌ | 是 ✅ (核心优势) |
| 读性能 | 无法通过备库扩展 | 可扩展至3倍(1写+2读) |
| 故障转移速度 | 较快 (通常60-120秒) | 非常快 (通常35秒内) |
| 功能兼容性 | 高,支持审计日志等多数功能 | 受限,不支持审计日志等特定功能 |
| 适用场景 | 需要高可用和合规性(如审计)的通用生产环境 | 需要高可用,且有极高读性能要求的场景 |
| 背后哲学 | 可靠性与兼容性优先 | 性能与极致可用性优先 |
实用建议:我应该如何选择?
现在,答案已经非常清晰了。对于前面提到的情况,AWS客服的建议是完全正确的。
-
如果审计日志是强制要求:出于安全、合规(如金融、医疗行业标准)或内部风控的目的,必须使用审计日志。那么,应该选择 Multi-AZ DB实例。这是获得该功能的唯一途径。
-
如果应用读压力巨大:如果业务是读多写少,比如内容平台、社交Feed流等,并且愿意为了极致的读性能和更快的故障转移,放弃审计日志(或采用其他方式监控,如查询日志到CloudWatch),那么 Multi-AZ DB集群 仍然是一个非常强大的选择。
如何从集群切换到实例? 通常,如果需要创建一个新的Multi-AZ DB实例,然后通过数据库迁移服务(DMS)或手动的导出/导入方式将数据迁移过去,最后在应用层切换数据库连接地址。这个过程需要规划,以尽量减少停机时间。
结论
“Multi-AZ”的世界比我们想象的要丰富。实例追求的是兼容性和坚如磐石的可靠性,而集群则是在此基础上,为极致读性能和快速恢复开辟了新的道路。它们没有绝对的优劣,只有场景的匹配度。
理解了它们底层的架构差异,我们就能明白为什么有些功能“时有时无”,并自信地为我们的应用挑选出最合适的“守护神”。