当您的应用程序和数据库位于同一实例上时,从一个EC2实例扩展到两个

时间:2016-10-03 00:40:39

标签: amazon-web-services amazon-ec2 server scaling horizontal-scaling

如果我有一个承载我的Web应用程序和我的MariaDB数据库的EC2实例,并且我想在某个时候通过将Web应用程序和数据库分成单独的实例来扩展,那么这样做的标准做法是什么,而不会产生< em>任何停机时间?对我来说这似乎是一个复杂的问题,但是我所看到的所有帖子都讨论了保持Web和数据层与开始时分离的好处,主要是谈论安全性好处,似乎并没有强调可扩展性带来的好处。我认为它并不像看起来那么复杂。

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

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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

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

冒着说明问题的风险,不要在数据库服务器上放置除数据库之外的任何内容,也不要将其与应用程序并置。生产中没有例外甚至可以讨论。如herehereherehere所见,经常出现的问题往往是由于人们无视此原则,运行应用程序和它在同一台服务器上的数据库。性能和稳定性不仅存在风险,而且出现的症状也会给MySQL(或MariaDB或Percona Server)出错(“崩溃”)(实际上应用程序出错)提示(错误)的印象,提示操作系统强制崩溃数据库,试图在不可避免的内存耗尽时保持整体机器的稳定性。

答案 1 :(得分:0)

一种可能的解决方案:

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

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

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

将原始实例从LB池中取出,这样网络流量现在只会转到#2和#3。

从#1实例卸载网站,因此只保留运行数据库服务器。