如何使用 REST API 和数据库扩展 Java 应用程序?
How do I scale a Java app with a REST API and a Database?
我有一个典型的无状态 Java 应用程序,它提供 REST API 并在 Postgresql 数据库中执行更新 (CRUD)。
但是客户的数量在增长,我觉得有必要
- 增加冗余,这样如果一个失败,另一个就会发生
- 为此我可能需要一个负载平衡器?
- 通过不淹没网络和仅一台服务器 CPU 来提高响应速度(但是负载平衡器如何不被淹没?)
- 也许我需要分发数据库?
- 我希望能够无缝更新我的应用程序(我见过一个叫做 kubernetes 的东西这样做):一个一个地杀死每个冗余节点并立即用更新版本替换它
- 我的应用程序还存储了一些图像文件,这些文件的磁盘大小增长很快,我需要能够分发它们
- 所有这些都必须是可备份的
这是我现在的图表(Java 应用程序和数据库都在同一台服务器上):
缩放这个的 best/correct 方法是什么?
谢谢!
网络服务器:
运行 您的应用在多个服务器上,在负载均衡器后面。使用 AWS Elastic Beanstalk 或使用 EC2 + Autoscaling Groups + ELB 推出您自己的解决方案。
您提到了对负载均衡器 "flooding" 的担忧,但如果您使用 Amazon 的弹性负载均衡器服务,它会自动扩展以处理您获得的任何流量,因此您无需担心这个关注。
数据库服务器:
将您的数据库移至 RDS 并启用多可用区故障转移。这将创建一个热备用服务器,如果您的主服务器出现问题,您的数据库将自动故障转移到该服务器。 (可选)添加只读副本以扩展您的数据库容量。
如果您还没有开始在 Redis 中缓存您的数据库查询。有一些插件可以很容易地用 Hibernate 做到这一点。如果您的应用程序定期执行相同的查询,这将减轻您的数据库服务器的巨大负载。将 AWS ElastiCache 或 RedisLabs 用于您的 Redis 服务器。
图片:
停止在网络服务器上存储图像文件!这会产生很多可扩展性问题。将它们移至 S3 并直接从 S3 提供服务。 S3 为您提供无限存储 space、自动备份以及直接从 S3 提供图像的能力,从而减少您的网络服务器上的负载。
部署:
这里有太多的解决方案,以至于人们更喜欢哪种方法就成了一个问题。如果您使用 Elastic Beanstalk,那么它会提供部署解决方案。如果您不使用 EB,那么有数百种解决方案可供选择。我建议先设计您的环境,然后选择适合您设计的环境的自动化部署解决方案。
备份:
如果你做对了,你的网络服务器上就不会有太多的备份。使用 Elastic Beanstalk,为了重建您的 Web 服务器,您所需要的只是您签入 Git 的代码和配置文件。如果您最终不得不备份 EC2 服务器,您将需要查看 EBS 快照。
对于数据库备份,RDS 会自动执行每日备份。如果您想要在 RDS 之外进行备份,您可以使用 pg_dump 和 cron 作业自行安排这些备份。
对于图像,您可以启用 S3 版本控制和多区域复制。
CDN:
你没有提到这个,但你应该看看 CDN。这将使您的应用程序得到更快的服务,同时减少服务器上的负载。 AWS 提供了 CloudFront CDN,我也推荐看看 CloudFlare。
我有一个典型的无状态 Java 应用程序,它提供 REST API 并在 Postgresql 数据库中执行更新 (CRUD)。
但是客户的数量在增长,我觉得有必要
- 增加冗余,这样如果一个失败,另一个就会发生
- 为此我可能需要一个负载平衡器?
- 通过不淹没网络和仅一台服务器 CPU 来提高响应速度(但是负载平衡器如何不被淹没?)
- 也许我需要分发数据库?
- 我希望能够无缝更新我的应用程序(我见过一个叫做 kubernetes 的东西这样做):一个一个地杀死每个冗余节点并立即用更新版本替换它
- 我的应用程序还存储了一些图像文件,这些文件的磁盘大小增长很快,我需要能够分发它们
- 所有这些都必须是可备份的
这是我现在的图表(Java 应用程序和数据库都在同一台服务器上):
缩放这个的 best/correct 方法是什么?
谢谢!
网络服务器:
运行 您的应用在多个服务器上,在负载均衡器后面。使用 AWS Elastic Beanstalk 或使用 EC2 + Autoscaling Groups + ELB 推出您自己的解决方案。
您提到了对负载均衡器 "flooding" 的担忧,但如果您使用 Amazon 的弹性负载均衡器服务,它会自动扩展以处理您获得的任何流量,因此您无需担心这个关注。
数据库服务器:
将您的数据库移至 RDS 并启用多可用区故障转移。这将创建一个热备用服务器,如果您的主服务器出现问题,您的数据库将自动故障转移到该服务器。 (可选)添加只读副本以扩展您的数据库容量。
如果您还没有开始在 Redis 中缓存您的数据库查询。有一些插件可以很容易地用 Hibernate 做到这一点。如果您的应用程序定期执行相同的查询,这将减轻您的数据库服务器的巨大负载。将 AWS ElastiCache 或 RedisLabs 用于您的 Redis 服务器。
图片:
停止在网络服务器上存储图像文件!这会产生很多可扩展性问题。将它们移至 S3 并直接从 S3 提供服务。 S3 为您提供无限存储 space、自动备份以及直接从 S3 提供图像的能力,从而减少您的网络服务器上的负载。
部署:
这里有太多的解决方案,以至于人们更喜欢哪种方法就成了一个问题。如果您使用 Elastic Beanstalk,那么它会提供部署解决方案。如果您不使用 EB,那么有数百种解决方案可供选择。我建议先设计您的环境,然后选择适合您设计的环境的自动化部署解决方案。
备份:
如果你做对了,你的网络服务器上就不会有太多的备份。使用 Elastic Beanstalk,为了重建您的 Web 服务器,您所需要的只是您签入 Git 的代码和配置文件。如果您最终不得不备份 EC2 服务器,您将需要查看 EBS 快照。
对于数据库备份,RDS 会自动执行每日备份。如果您想要在 RDS 之外进行备份,您可以使用 pg_dump 和 cron 作业自行安排这些备份。
对于图像,您可以启用 S3 版本控制和多区域复制。
CDN:
你没有提到这个,但你应该看看 CDN。这将使您的应用程序得到更快的服务,同时减少服务器上的负载。 AWS 提供了 CloudFront CDN,我也推荐看看 CloudFlare。