在 Amazon Elastic Beanstalk 节点之间共享数据

Posted

技术标签:

【中文标题】在 Amazon Elastic Beanstalk 节点之间共享数据【英文标题】:Share data across Amazon Elastic Beanstalk nodes 【发布时间】:2016-07-13 18:28:51 【问题描述】:

我有一个 Spring Boot 应用程序,它在启动时会下载大约 300 MB 的数据并将其保存到路径 /app/local/mydata。目前,我只有一个带有单个节点的开发环境,这不是问题。但是,一旦我创建了一个(比如说)10 个节点的 prod 实例,每个节点单独下载相同的 300 MB 数据会浪费数据带宽。这会给从中下载数据的服务带来很大压力。而且数据流入/流出 EC2 会产生成本。

我可以使用 touchfile 构建一个逻辑,以确保只有一个盒子下载数据,而其他盒子则等到下载完成。但是,我不知道在哪里下载这些数据,以便其他节点也可以读取。

有什么建议吗?

【问题讨论】:

【参考方案1】:

如果您想将其保存在文件中,请将其下载到 S3,但听起来您可能需要将数据放入数据库 (RDS) 或缓存在 Redis (ElastiCache) 中。

我不确定“touchfile”是什么,但我认为您的意思是某种文件锁定机制。我不认为这是跨多个服务器进行协调的最佳选择。我可能会使用具有一致读取和条件写入的 DynamoDB 表作为分布式锁定机制。

您下载的数据多久更改一次?也许您可以安排一个 Lambda 函数来定期刷新数据并更新数据库或其他什么?

一般来说,你需要停止考虑使用网络服务器的本地文件系统来处理这类事情。

【讨论】:

该服务每 3 小时下载大约 300 MB。已经有@ScheduledSpring注解每3小时触发一次下载。 'touchfile' 技巧确实是你所理解的。我同意这不是一个好方法。我喜欢你使用 S3 的建议。是否可以像从 Java FileSystem 那样对它进行写入和读取?如果没有,那么我会遇到问题,因为我正在使用的库将数据下载到FileSystem。很遗憾,我无法修改库。 这似乎最好作为在单个服务器上运行的计划作业来处理。如果下载和处理数据的时间少于 5 分钟,您或许可以通过 Lambda 安排此操作。否则,cron 作业可能效果最好。 我建议您详细了解可供您使用的不同 AWS 服务及其工作方式。使用@Scheduled 意味着作业将在每台Web 服务器上运行。因此,现在您必须处理并发问题,并且还要担心 Elastic Beanstalk 缩减操作会杀死可能正在下载数据的服务器。如果是我,我根本不会在 Elastic Beanstalk 上运行计划作业。 谢谢马克。你的 cmets 确实有帮助。我将阅读 S3 和其他服务。

以上是关于在 Amazon Elastic Beanstalk 节点之间共享数据的主要内容,如果未能解决你的问题,请参考以下文章

Django 在 Amazon Elastic Beanstalk 上的迁移命令被杀死

Amazon Elastic Beanstalk 在运行任何命令时不断询问凭据

在 Amazon Elastic Beanstalk 上安装 Anaconda

Elastic Beanstalk 是不是支持 Amazon 的 Aurora DB?

在 Amazon Elastic Compute Cloud (Amazon EC2) 上托管 twitter 流 api 的优缺点是啥

Amazon Elastic Beanstalk:多个应用程序可以共享一个 Amazon RDS 数据库实例吗?