如何使用REST API和数据库扩展Java应用程序?

我有一个典型的无状态Java应用程序,它提供REST API并在Postgresql数据库中执行更新(CRUD)。

然而,客户的数量正在增长,我觉得有必要

  • 增加冗余,以便在发生另一个失败时发生
  • 为此,我可能需要一个负载均衡器?
  • 通过不淹没网络和一台服务器的CPU来提高响应速度(但负载均衡器将如何不被淹没?)
  • 也许我需要分发数据库?
  • 我希望能够无缝更新我的应用程序(我已经看到了一个名为kubernetes的东西):逐个杀死每个冗余节点并立即用更新版本替换它
  • 我的应用程序还存储了一些图像文件,这些文件在磁盘大小上快速增长,我需要能够分发它们
  • 所有这一切都必须是可备份的

这是我现在拥有的图表(Java app和DB都在同一台服务器上):

在此处输入图像描述

缩放这个的最佳/正确方法是什么?

谢谢!

Web服务器:

在负载均衡器后面的多个服务器上运行您的应用程序。 使用AWS Elastic Beanstalk或使用EC2 + Autoscaling Groups + ELB滚动您自己的解决方案。

您提到了对负载均衡器“泛滥”的担忧,但如果您使用亚马逊的Elastic Load Balancer服务,它将自动扩展以处理您获得的任何流量,这样您就不必担心这种担忧。

数据库服务器

将数据库移动到RDS并启用多重故障转移。 这将创建一个热备用服务器,如果主服务器出现问题,数据库将自动进行故障转移。 (可选)添加只读副本以扩展数据库容量。

如果您尚未在Redis中开始缓存数据库查询。 有很多插件可以很容易地使用Hibernate来做到这一点。 如果您的应用定期执行相同的查询,则会对数据库服务器造成巨大负担。 将AWS ElastiCache或RedisLabs用于Redis服务器。

图片:

停止在Web服务器上存储图像文件! 这会产生许多可伸缩性问题。 将它们移到S3并直接从S3提供。 S3为您提供无限的存储空间,自动备份以及直接从S3提供映像的function,从而减少Web服务器的负载。

部署:

这里有很多解决方案,它只是一个人们喜欢哪种方法的问题。 如果您使用Elastic Beanstalk,那么它为部署提供了解决方案。 如果您不使用EB,那么有数百种解决方案可供选择。 我建议首先设计您的环境,然后选择适合您所设计环境的自动部署解决方案。

备份:

如果您这样做,您的Web服务器上应该没有太多备份。 使用Elastic Beanstalk,为了重建您的Web服务器,您需要的只是您已检入Git的代码和配置文件。 如果您最终必须备份EC2服务器,则需要查看EBS快照。

对于数据库备份,RDS将自动执行每日备份。 如果您希望在RDS之外进行备份,可以使用pg_dump和cron作业自行安排。

对于映像,您可以启用S3版本控制和多区域复制。

CDN:

你没有提到这一点,但你应该看一下CDN。 这样可以更快地提供应用程序,同时减少服务器的负载。 AWS提供CloudFront CDN,我还建议您查看CloudFlare。