我正在运行 Google Cloud 托管实例组 (Ubuntu) 来运行 Web 服务器,今天早上服务器离线了。我检查了服务器状态,发现全部数据丢失。所有 apache2 文件、apache2 和 PHP 服务、模块等都丢失了,就像是全新安装的一样。
起初我以为这与我没有为服务器分配静态 IP 有关,但登录 SSH 后我注意到我的 Web 服务器上的所有 www 和 apache2 文件都消失了。
我注意到今天早上我的服务器达到 CPU 使用率的自动缩放点时发生了这种情况。显然它创建了另一个实例,但上面没有数据。
我目前正在设置另一个 VM 实例,但显然出现了严重错误。我应该怎么做才能防止这种情况发生/
答案1
数据丢失
从评论来看,数据消失是因为它位于托管实例组中的实例中。当该组需要更多资源时,会根据实例模板。据推测,模板不包含任何在给定实例上收集的数据,因此新实例不包含任何数据。这正是丢失存储在这些实例上的数据的原因。
数据差异
此外,如果没有系统在实例之间同步数据,直接在这些实例上存储数据几乎会立即导致数据差异。假设一个组有 2 个实例(A和乙)负载均衡器将请求发送到实例A导致写入。片刻之后,负载均衡器向实例发送新请求乙查找最近写入的数据。它将一无所获。因此,必须同步数据,这可能非常昂贵且容易出错,或者更好的方法是将数据迁移到扩展实例组之外。
无状态实例设计
在一个GCE 讨论组关于扩展单个虚拟机的帖子Kamran 描述了如何防止这种数据丢失/差异。由于实例没有持久状态(关闭后继续存在),因此可以将它们视为无国籍者使给定组中的所有实例无状态的优点是可以预期任何组中的实例以相同的方式运行并以相同的方式处理任务。因此,这非常适合水平扩展(拥有更多实例来处理更多工作,而不是简单地拥有更强大的实例)。
实例组外的存储
通常,这种无状态设计要求您将数据/文件存储迁移到实例组之外。对于 SQL,可以将数据移动到实例组可访问的 Cloud SQL 实例或 Cloud Datastore(用于 NoSQL 替代方案)。对于文件存储,可以将文件迁移到 Cloud Storage。您甚至可以使用云存储FUSE将给定的 GCS 存储桶作为文件系统挂载到托管实例上。