关于亚马逊网络服务:AWS – HA NFS – 最佳实践

AWS - HA NFS - Best practices

任何人都有在 AWS 上实施 NFS 的合理策略,使其不是 SPoF(单点故障),或者至少在实例崩溃时能够快速恢复?

我读过这篇 SO 帖子,关于与多个 EC2 实例共享文件的能力,但它没有回答如何在 AWS 上使用 NFS 确保 HA 的问题,只是可以使用 NFS。

很多在线资产都说AWS EFS可用,但它仍处于预览模式,仅在俄勒冈地区可用,我们的主要VPC位于加利福尼亚state北部,因此无法使用此选项。

其他在线资产说 GlusterFS 是一种可行的方法,但经过一些研究后,由于竞争条件和性能问题,我觉得实施此解决方案并不自在。

另一个选项是 SoftNAS,但我想避免将未知的 AMI 引入严格控制的同质环境中。

离开NFS。 NFS 是我们在我们的开发环境中使用的并且工作正常,但它是开发的,所以如果它崩溃了,我们会在系统修复问题时去喝几杯啤酒,但在生产环境中,这显然是不行的。

此时我能想到的最佳解决方案是创建一个 EBS 和两个 EC2 实例。两个实例都将正常更新(通过 puppet)以保持堆栈对齐(内核、nfs 库等),但只有一个实例会挂载 EBS。我们在活动 NFS 实例上设置了一个监视器,如果它出现故障,我们会收到通知,然后我们手动分离并附加到备份 EC2 实例。我想我们还创建了一个也可以取消/重新连接的网络接口,因此我们只需要在 DNS 中维护一个 IP。

虽然我想我们可以使用 keepalived 和允许自动分离/重新附加的 IAM 策略自动执行此操作。

--更新--

EBS 卷似乎绑定到特定的可用区,因此重新连接到另一个 AZ 中的实例是不可能的。我能想到的唯一其他选择是:

  • 在公共子网中的每个 AZ 中创建 EC2(每个都有 EIP)
  • 为 TCP:2049 创建路由 53 健康检查
  • 为 nfs-1 (AZ1) 和 nfs-2 (AZ2) 创建路由 53 故障转移策略
  • 这里唯一的问题是,保持两个 NFS 服务器同步的最佳方法是什么?只是在它们之间运行一个 rsync 脚本?

    或者是否有我完全错过的最佳实践?


    有几个选项可以构建高可用性 NFS 服务器。虽然我更喜欢使用 EFS 或 GlusterFS,因为所有这些解决方案都有其缺点。

    a) DRBD
    可以在 DRBD 的帮助下同步卷。这允许您镜像您的数据。在不同的可用区中使用两个 EC2 实例以实现高可用性。缺点:配置和操作复杂。

    b) EBS 快照
    如果超过 30 分钟的 RPO 是合理的,您可以使用定期 EBS 快照来从另一个可用区的中断中恢复。这可以通过运行单个 EC2 实例、用户数据脚本和用于定期 EBS 快照的 cronjob 的 Auto Scaling 组来实现。缺点:RPO > 30 分钟。

    c) S3 同步
    可以将充当 NFS 服务器的 EC2 实例的状态同步到 S3。备用服务器使用 S3 保持最新状态。缺点:大量小文件的 S3 同步将花费太长时间。

    我建议观看 AWS re:Invent 的演讲:https://youtu.be/xbuiIwEOCAs


    AWS 已审查并批准了许多 SoftNAS AMI,这些 AMI 可在 AWS Marketplace 上获得。联合发布的 AWS 上的 SoftNAS 架构白皮书提供了更多详细信息:

    • 安全性(第 4-11 页)
    • 跨 AZ 的 HA(第 13-14 页)

    您还可以尝试 30 天免费试用,看看它是否满足您的需求。
    http://softnas.com/tryaws

    全面披露:我为 SoftNAS 工作。