我有几个在 Amazon EC2 上运行的 ubuntu 实例,并且想通过在另一个区域(从快照生成)运行带有负载均衡器的重复实例来使它们更具容错能力——甚至使用弹性 IP 进行手动故障转移。
问题在于具体的数据,例如,如果文档根目录(即 /var/www)的内容不一样,那么从一个 Web 服务器故障转移到另一个 Web 服务器是没有用的。
在此示例中,我将 /var/www 的内容放在它们自己的卷上,以免影响根分区。有没有办法在不同区域的两个或多个实例之间共享一个卷?或者有没有办法让两个或多个不同的卷在各个区域之间保持同步?
答案1
正如 cyberx86 所说,EBS 卷不能安装在多个 EC2 实例上(即使在同一个可用区域内)。
第一个答案应该是将您的共享资产存储在 Amazon S3 中 - 这样,您可以通过 Capistrano/Mcollective/whatever 将您的代码直接部署到您的实时和备用 EC2 实例,并将您的静态内容(即图像、媒体)完全卸载到 S3,甚至可能使用 CloudFront 提供边缘缓存。
话虽如此,S3 不会进行跨区域复制(EU-West-1 到 US-East-1),但它确实在区域内提供“四个九”(99.99%)的可用性,因此不太可能出现整个区域的故障。对于“双重保障”方法,您可能需要在两个不同区域的 S3 存储桶之间配置一个 cron'd 同步过程 - 请查看s3cmd
文档带着--sync
旗帜。
如果将您的资产移植到 S3 太麻烦,并且您的故障转移机制是热备用(即您在另一个区域有一个始终就绪的克隆并进行手动故障转移),您可以配置一个 cron'drsync
运行以保持您的非版本控制资产同步(和以前一样,您应该始终将您的应用程序代码发布到所有服务器。
集群文件系统(例如 GlusterFS、GFS2)或块级复制(例如 DRBD)并不推荐与 EC2 一起使用(至少除非你花钱购买实例保证网卡带宽例如集群网络范围)。S3FS 已被证明非常慢,因为文件系统上的每个 IO 请求都必须通过 S3 API 调用来支持 - 详细信息如下:(1),(2)。
您可能会遇到由其他租户引起的网络拥塞(甚至自己造成拥塞) - 这些类型的解决方案最适合您控制(或至少对整个堆栈有影响)的环境。