0

如果我有一个托管我的Web应用程序和我的MariaDB数据库的EC2实例,并且我希望通过分离Web应用程序和数据库分成不同的实例,这样做的标准做法是什么,不会造成任何停机时间?对我来说这似乎是一个复杂的问题,但是我所看到的所有讨论保持Web和数据层与开始分离的好处的帖子大多讨论安全性好处,并且似乎没有强调使得可扩展性好处我认为这并不像看起来那么复杂。当您的应用程序和数据库位于同一实例上时,从一个EC2实例扩展到两个

此外,在这种情况下,如果扩大规模并保持应用程序和数据库耦合将不那么复杂,它将如何工作? - 记住0停机时间要求。

+0

在没有停机的情况下扩展单台机器意味着无需重启即可添加CPU和RAM。不确定EC2上是否可行。如果您已经有一个负载平衡器,则您准备好更强大的机器并准备好失败转移。但是您也需要在新机器上拥有所有当前数据。所以我想你至少需要一些只读模式来复制数据。 – Thilo

+0

@Thilo我怎么能保证,此刻我重定向流量的新实例,其数据将与原始数据的最新? –

+0

所以我想你至少需要一些只读模式来复制数据。 – Thilo

回答

0

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

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

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

您等待从属设备与主设备同步。

使用主站上的SHOW MASTER STATUS;和从站上的SHOW SLAVE STATUS;来监控复制状态,确定从站与主站是否确实是“最新”的时间是微不足道的。 MariaDB复制是“异步的”,因为主设备上的更改是在从设备上进行更改之前完成的,但是对于具有适当容量的从服务器,典型的复制滞后时间为次序或毫秒......并且很容易决心。在停止/启动您的应用程序所需的时间内,任何延迟的数据都可以确认已完成复制。

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

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

在陈述显而易见的风险时,绝对不要在数据库服务器上放置除数据库以外的其他任何东西,也不要将其与应用程序并置。甚至不需要讨论生产中的例外情况。一个常常出现的问题,如here,here,herehere所经常出现的问题往往不是由于人们忽视这一原理,在同一台服务器上运行应用程序及其数据库。性能和稳定性不仅存在风险,而且出现的症状也给MySQL(或MariaDB或Percona服务器)出现故障(“崩溃”)(实际上应用程序出现故障时)提示OS迫使数据库崩溃,努力在面对不可避免的内存耗尽的情况下保持整体机器的稳定性。

0

一个可能的解决方案:

把你的EC2实例前面的负载平衡器,intially只是指挥交通,以您有一个实例。

旋转起来,将运行你的网站的副本,让这一切configurely并指着DB上的第一个实例,然后它,所以它开始获得流量加入到负载均衡器的第二个实例

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

将原始实例从LB池中取出,以便网络流量现在仅进入#2和#3。

从#1实例中卸载网站,因此它只剩下运行数据库服务器。

相关问题