Amazon RDS 每个实例多个数据库的优点/缺点

Amazon RDS 每个实例多个数据库的优点/缺点

我运营两个完全独立的网站。我正在将其 MySQL 数据库迁移到 Amazon RDS。

我不会进行多 A/Z 部署 - 让我们从这个问题中删除该变量。

我不确定是要创建一个包含两个数据库的 RDS 实例,还是创建两个包含一个数据库的 Amazon RDS 实例。为了回答这个问题,先忽略成本。我不会达到 1 TB 的数据限制,所以我们就忽略它吧。但是,确保其中一个网站崩溃不会影响另一个网站,这一点非常重要。

根据本文件 - http://docs.amazonwebservices.com/AmazonRDS/latest/UserGuide/Concepts.DBInstance.html

我假设,如果我编写了糟糕的代码,导致给定 RDS 实例中的一个数据库崩溃,则可能会导致整个 RDS 实例崩溃(从而无意中影响其他数据库)。对吗?

针对该评论,我们确实考虑过两个 RDS 实例,每个实例都有自己的数据库。我只是想确保这样做确实有好处 - 我假设好处是这些数据库在不同的实例上时不会相互影响。我以为即使在同一个实例上,它们也不会相互影响,但听起来事实并非如此。

--EDIT Hop3less - 感谢您的回答 - 但是,当我说两个 RDS 实例只有一个数据库时,我的意思是每个实例都有一个数据库。只是想确保您明白我不是指两个 EC2 实例。我假设单个 RDS 实例仍然是单点故障?

答案1

没错,如果您有两个实例和一个数据库,那么您的单点故障就是单个数据库 - 任何影响数据库的事物(例如负载过多,或意外删除它,或其他什么)都会影响使用它的两个站点。

如果您有一个包含两个数据库的实例,那么您的单点故障就是该实例,并且任何影响该实例的事件(例如,操作系统的磁盘空间不足)都会影响使用它的两个站点。

唯一能让您的网站完全独立的设置是让每个网站在自己的实例上运行,并拥有自己的数据库。(即使这也不是“完全”独立,但完全独立到您可以控制的程度 - 如果两个实例共享的硬件或基础设施出现问题,它们都会受到影响。)

答案2

我同意@HopelessN00b 的建议,即为了让您的每个站点完全独立,您应该在自己的实例上运行每个数据库。然而,即使这不是一个完全独立的设置,但使用云中的数据库可以最大限度地降低某些风险。由于您关心数据库的高可用性,并且您计划将它们移动到 RDS,我想建议您研究 Xeround 的云数据库选项作为 RDS 的替代方案。如果我理解正确的话,Xeround 提供了一个分布在多台服务器上的数据库,并且也有复制功能,这两个功能都可以处理故障转移(这里有一些关于分布式系统和复制。 :)

答案3

CPU 和内存将成为单一争用点,更不用说每个应用程序的 IO 配置文件了。如果一个应用程序突然变得比另一个应用程序更受欢迎,缓冲池的 LRU 算法将从一个应用程序分页行和索引数据,转而支持另一个应用程序,这会导致分页应用程序的性能下降,因为它的读取必须转到磁盘。

mysql> SHOW ENGINE INNODB STATUS;

将为您的应用提供缓冲池指标,以监控此类争用是否正在发生。(http://dev.mysql.com/doc/refman/5.5/en/innodb-buffer-pool.html

从 DR 的角度来看,任何快照或 PITR 恢复都会使两个应用程序都停止运行,并强制回滚这两个应用程序。使用单独的实例,您就不会有这种依赖关系。

答案4

因此...具有多个数据库/模式的单个 RDS:

  • 可能更便宜
  • 更易于管理(单根凭证)
  • 需要确保多可用区以避免维护停机
  • 单个快照包含所有数据库
  • 回滚一个意味着回滚所有
  • 不太可能达到每个帐户的默认 RDS 数量限制
  • 此 RDS 实例发生故障意味着所有数据库停机或需要故障转移到辅助数据库

具有单个数据库/模式的单个 RDS

  • 成本更高。请记住,每个 RDS 都有最小存储大小。
  • 更难管理
    • 多个根凭证
    • 需要兼顾可能不同的配置
  • 一个 RDS 的维护停机不会影响任何其他 RDS
  • 回滚一个数据库不会影响任何其他数据库,尽管现在由于多个快照而成本更高
  • 更快的快照/复制?
  • 此 RDS 实例的故障不会影响任何其他数据库

我认为这确实取决于具体情况。如果您有多个相互依赖的数据库,那么将其放入单个 RDS 中是有意义的(尤其是成本方面)。如果一个数据库的中断会破坏整个过程,那么它们也可能驻留在同一个 RDS 中。但是,如果您有两个彼此没有关系的数据库(例如员工信息和客户订单(假设这里没有佣金),那么一个数据库的故障不应该影响另一个数据库,它们可能应该驻留在不同的 RDS 中。如果两个数据库由不同的团队或单个团队管理,情况也是如此。不让两个团队共享一个 RDS 实例可能更有意义。

相关内容