由于我们的备份策略依赖于 RDS Postgresql 手动备份,因此在创建快照期间,我们遇到了 RDS 实例(单个可用区)可能停机的问题。根据 AWS 的说法:
在单可用区数据库实例上创建此数据库快照会导致短暂的 I/O 暂停,持续时间可能为几秒到几分钟,具体取决于数据库实例的大小和类别。
这实际上并不清楚我们如何确定数据库实例 I/O 在快照期间是否正常运行,因为如果数据库短时间停机,我们希望停止相应的 Web 服务器或将其从负载均衡器中取出,以确保客户端不会发生连接中断。
让我们颇感疑惑的是:
快照期间数据库是否真的有停机时间?AWS 只是提到“I/O 暂停”和“延迟”?我读到过停机时间仅在快照初始化期间持续很短的时间(从几秒到几分钟),我们能否知道停机时间是否已过去并且数据库实例已准备好提供服务(其快照仍在创建中)?
处理这些 IO 暂停的一般最佳实践是什么?似乎即使使用自动备份也会发生这种情况,这是否意味着在创建数据库快照时,网站每天都可能会停机?
答案1
答案来自于了解快照的工作原理。
在快照开始时,会向所有应用程序发送一条消息(命令),使其达到一致状态并将必要的数据刷新到磁盘。
刷新需要多长时间取决于内存中有多少数据、数据处于什么状态以及将数据写入磁盘需要多长时间。
一旦每个支持快照的应用程序完成冻结准备,快照过程就会对文件系统进行快照,这意味着如果要写入任何其他数据块,则首先为备份过程制作一份副本(COW - 写入时复制)。然后,解冻(恢复)消息/命令将发送到每个应用程序。
对于使用率不高的数据库,这个冻结/解冻过程可能只需要几百毫秒。对于需要刷新到磁盘的 GB 内存的大型数据库,则需要几秒钟的时间。
在冻结/解冻周期发生期间,新用户请求的磁盘 I/O 将被暂停。数据库仍在运行,但在磁盘/文件系统同步时所有请求都将暂停。收到解冻消息后,一切都将恢复。
对于主从数据库,主数据库不受影响。快照将在从属数据库上进行。这是 AWS RDS 的优秀功能之一。