很难提供具体的答案,因为您的问题非常广泛。
但...
如您所知,最好克隆实例,以便在 LB 之后,每个实例的行为相同。有很多方法可以做到这一点。据我所知,Digital Ocean 没有提供通用机制1。
注意其他云平台包括实例组的概念,您可以在其中定义模板(d 实例),然后让平台自动为您维护 X 个实例(根据需要添加|删除)。
让我们分解问题:您有一些静态内容(例如 PHP、Web 服务器)和一些动态内容(例如您的数据)。在您的应用程序中将它们分开也会很有用。
静态内容
你在这里有很多选择。最简单的可能是创建一个主液滴,然后使用Snapshots克隆主液滴。我建议您编写脚本(例如doctl)创建 master 以便您能够在需要时重现它的创建。此外,一旦您有了代码,请将其检入源代码控制工具(供后代使用)。您还可以使用例如doctl 脚本从头开始创建多个相同的Droplet。
因为想要自动创建(云)资源是一种常见的做法,所以有一些工具可以帮助实现这一点。一个,流行的工具是Terraform,虽然我没有使用过它(请参阅DigitalOcean 的提供者,你应该能够使用它来创建,不仅是 Droplets,而且是负载平衡器。有一个学习曲线,但很可能一项不错的投资(Terraform 超越了数字海洋)。
一种补充方法是考虑将您的应用程序容器化。然后,您的部署脚本将能够拉取/运行容器映像,而不是安装软件。这应该(!)创建一个更可预测的部署机制,它使您能够考虑使用面向容器的(Linux)操作系统(例如CoreOS、RancherOS)。这些带来的优势包括更小的连接表面、更容易的升级和更简单的部署(创建容器操作系统、运行 PHP 应用程序容器),但代价是您必须熟悉它们。
动态内容
如果动态内容是基于文件的,一个常见的解决方案是使用某种形式的共享卷,允许在一个地方管理此内容,但在多个 Droplet 之间共享它。我的理解(!?)您目前无法在多个 Droplet 之间共享一个卷。为了解决这个问题,您可能希望探索运行类似NFS的东西,它可以使多个 Droplet 共享文件。或者,您可以使用 Spaces。最坏的情况是,您可以跨多个 Droplet 复制文件,但要注意结果可能不一致的后果。
如果动态内容在数据库中,您可以自己运行数据库(集群)并将每个 Droplet 指向其端点。或者您可以使用 Digital Ocean 的托管数据库(服务)。
Digital Ocean 包括一个Kubernetes 托管服务。
这为您提供了一种部署解决方案的 X 实例的方法,包括定义负载均衡器和共享(持久)卷,但使用 Kubernetes 可能会超出您的需求(并且还需要您将应用程序容器化)。
也就是说,请参阅此处并请注意,这是在DigitalOcean 提供其托管 Kubernetes 产品之前编写的;原则保持不变。
不过,我建议您阅读 Kubernetes。
在我看来(!),它应该是大多数基于云的应用程序的部署方式。