在备份期间,我需要“空闲”Apache,以便我可以停止 MySQL,然后备份 MySQL 和 SQLite 数据库。对数据库的唯一访问是通过 Apache。
目前,我正在考虑使用修改 Apache 配置的脚本来执行此操作,以将所有访问重定向到“站点关闭”页面,然后:
apache2ctl graceful
systemctl stop mysqld
但是,这似乎不是一个特别好的主意。graceful
不会阻止所有的童工,并且可能会apache2ctl
立即返回。这是一个非常低容量的服务器,备份在一个时区的半夜运行,我很确定没有请求会持续超过一分钟。
sleep 60
有没有一种“好”的方法来处理这个问题,而不是仅仅在之后添加一个graceful
?我在想做一个graceful-stop
而不是打扰网站下页,设置GracefulShutdownTimeout
为 60 秒,并且也休眠 60 秒可能是一个更好的主意。
如果可以接受长时间关闭它,则停机过程相对容易。或多或少你在做什么。
在停机之前,当它仍在运行时,请考虑在网站上提醒它正在进行维护。组织对此的期望各不相同,一些系统有一个横幅,表明它今晚将关闭,一些有一个单独的维护日历。
由于 Web 服务器正在关闭,因此没有多少机会显示维护页面。可能暂时不会打扰。也许在未来,这将在负载均衡器之后,并且可以在连接被耗尽时显示静态页面。
在可用的情况下,使用相同的服务管理器来启动和停止所有应用程序。使用一个工具可以一致地报告状态、依赖性、处理失败停止的清理以及其他功能。令人困惑的是,并不是每个发行版都喜欢使用 apachectl 程序,但这很好,因为httpd 如何通过信号停止已被详细记录。
停止网络,然后停止数据库服务器。依靠服务管理器(在本例中为 systemd 单元)提供相对优雅的关闭,类似于
apachectl graceful-stop
. 阅读单元以了解它们如何实现的详细信息。如果您通过复制实时数据库文件进行备份,请注意没有进程仍在访问它们。复制仍在写入的文件存在副本损坏和备份错误的风险。在正常情况下,优雅停止将快速阻止新请求。并且在轻负载下,清理和关机工作完成得很快。棘手的部分是确保即使在特殊情况下也是如此。
仔细的备份可以检查是否没有任何文件打开,例如
fuser
在脚本中。可能还会向任何剩余进程发送信号,例如 SIGTERM。需要停机时间,再加上对确保文件关闭有点偏执,使得这种文件复制备份方法并不像看起来那么容易。考虑其他在线备份方法,例如使用数据库的内置方法热复制其数据或将导出转储到文件。
为了完整起见,另一种选择是一致的、在线的、存储级别的快照并复制这些文件。也避免了停机时间,但由于数据库从未关闭,因此可能会更加棘手。安全地执行此操作意味着暂停写入,并了解数据库如何进行启动恢复。
偶尔测试恢复。实际在测试环境中将数据恢复到某个暂存数据库,启动起来,抽查数据是否正确。