熟悉MariaDB中复制的工作方式,该解决方案变得直观明了。
通过使用mysqldump
将现有数据库复制到新服务器来创建副本数据库服务器,并特别注意选项--master-data
和--single-transaction
以进行备份。将结果加载到新的数据库服务器上会创建原始数据库的副本,因为它在您开始进行备份时已经存在。 InnoDB MVCC确保每个表中每行的版本(如其在备份开始时的版本)是新服务器上加载此备份的结果。 (是的,您必须使用InnoDB,因为您仍然应该这样做。)
然后,您将新数据库(作为从属)连接到旧数据库(作为主数据库),指示它从该数据库开始复制时间点 - 由备份中包含的主日志坐标标识的时间点 - 备份开始的时间点。
您等待从属设备与主设备同步。
使用主站上的SHOW MASTER STATUS;
和从站上的SHOW SLAVE STATUS;
来监控复制状态,确定从站与主站是否确实是“最新”的时间是微不足道的。 MariaDB复制是“异步的”,因为主设备上的更改是在从设备上进行更改之前完成的,但是对于具有适当容量的从服务器,典型的复制滞后时间为次序或毫秒......并且很容易决心。在停止/启动您的应用程序所需的时间内,任何延迟的数据都可以确认已完成复制。
使从属设备可写(典型情况下,从设备设置为只读模式,唯一的更改源是复制SQL线程,当然可以写入该线程)...然后监控复制以验证同步,停止应用程序,将应用程序指向新数据库,验证复制仍然同步,启动应用程序...完成。现在,从主数据库断开从属设备并放弃旧主设备。
当然,真正实现零停机时间实际上是不可能的,因为在某些时候,应用程序必须重新配置才能连接到不同的数据库......但总停机时间基本上取决于您输入或自动执行必要的操作步骤来轮询两个数据库服务器并比较复制坐标,并进行转换。
在陈述显而易见的风险时,绝对不要在数据库服务器上放置除数据库以外的其他任何东西,也不要将其与应用程序并置。甚至不需要讨论生产中的例外情况。一个常常出现的问题,如here,here,here和here所经常出现的问题往往不是由于人们忽视这一原理,在同一台服务器上运行应用程序及其数据库。性能和稳定性不仅存在风险,而且出现的症状也给MySQL(或MariaDB或Percona服务器)出现故障(“崩溃”)(实际上应用程序出现故障时)提示OS迫使数据库崩溃,努力在面对不可避免的内存耗尽的情况下保持整体机器的稳定性。
在没有停机的情况下扩展单台机器意味着无需重启即可添加CPU和RAM。不确定EC2上是否可行。如果您已经有一个负载平衡器,则您准备好更强大的机器并准备好失败转移。但是您也需要在新机器上拥有所有当前数据。所以我想你至少需要一些只读模式来复制数据。 – Thilo
@Thilo我怎么能保证,此刻我重定向流量的新实例,其数据将与原始数据的最新? –
所以我想你至少需要一些只读模式来复制数据。 – Thilo