0

如果我有一个托管我的 Web 应用程序和 MariaDB 数据库的 EC2 实例,并且我想在某个时候通过将 Web 应用程序和数据库分离到单独的实例来进行扩展,那么在不导致任何停机的情况下这样做的标准做法是什么?对我来说,这似乎是一个复杂的问题,但我看到的所有讨论将 Web 和数据层与一开始就分开的好处的帖子大多都在谈论安全性好处,似乎并没有强调可扩展性的好处,这使得我认为这并不像看起来那么复杂。

此外,在同样的场景中,如果扩展并保持应用程序和数据库的耦合不那么复杂,它会如何工作?-- 牢记 0 停机时间要求。

4

2 回答 2

0

熟悉 MariaDB 中复制的工作方式,解决方案就变得很直观了。

您可以通过将现有数据库复制到新服务器来创建副本数据库服务器,mysqldump并特别注意选项--master-data--single-transaction进行备份。将结果加载到您的新数据库服务器上会创建原始数据库的副本,因为它在您开始进行备份时就已经存在。InnoDB MVCC 确保每个表中每一行的版本,因为它在备份开始时存在,是加载此备份后出现在新服务器上的版本。(是的,你必须使用 InnoDB,无论如何你都应该这样做。)

然后,您将新数据库(作为从属)连接到旧数据库(作为主数据库),指示它从同一时间点开始复制——由备份中包含的主日志坐标标识的时间点——开始备份的时间。

您等待从站与主站同步。

SHOW MASTER STATUS;在主服务器和从服务器上监视复制状态SHOW SLAVE STATUS;,确定从服务器何时确实与主服务器“当前”是很简单的。MariaDB 复制是“异步”的,因为主服务器上的更改是在从服务器上进行更改之前进行的,但是对于具有适当容量的从服务器,典型的复制延迟是数量级或毫秒……而且,再次,很容易决定。在停止/启动您的应用程序所需的时间内,可以确认任何延迟数据已完成复制。

使从属可写(通常从属设置为只读模式,唯一的更改源是复制 SQL 线程,当然仍然可以写入它)...然后监视复制以验证同步,停止应用程序,将应用程序指向新数据库,验证复制是否仍然同步,启动应用程序...完成。现在,断开从属数据库与主数据库的连接并放弃旧的主数据库。

当然,真正的零停机时间实际上是不可能的,因为在某些时候必须重新配置应用程序以连接到不同的数据库......但总停机时间基本上取决于您可以键入多快,或自动执行必要的步骤来轮询两者数据库服务器并比较复制坐标,并进行转换。

冒着明显的风险,永远不要将数据库以外的任何东西放在数据库服务器上,也不要将它与应用程序并置。生产中的任何例外情况都不应公开讨论。一个经常出现的问题,如这里这里这里这里所见这通常归因于人们无视这一原则,在同一台服务器上运行应用程序及其数据库。性能和稳定性不仅存在风险,而且出现的症状也给人一种(不正确的)印象,即 MySQL(或 MariaDB 或 Percona Server)有故障,“崩溃”,而实际上应用程序有故障,提示操作系统强制使数据库崩溃,以尝试在不可避免的内存耗尽时保持整体机器稳定性。

于 2016-10-03T04:25:20.053 回答
0

一种可能的解决方案:

在您的 EC2 实例前面放置一个负载均衡器,最初只是将流量引导到您拥有的单个实例。

启动第二个实例,该实例将运行您的网站副本,将其全部配置并指向第一个实例上的数据库,然后将其添加到负载均衡器中,以便它开始获得流量

可选:添加与第二个配置相同的第三个实例,也只运行网站的副本。

将原始实例从 LB 池中取出,这样 Web 流量现在只流向 #2 和 #3。

从 #1 实例中卸载网站,因此它只运行 db 服务器。

于 2016-10-03T11:36:33.783 回答