跨VM分发层

时间:2012-01-09 16:42:06

标签: java architecture virtual-machine multi-tier

虽然这是一个以Java为中心的问题,但它确实适用于任何使用多层架构的系统。

在3层体系结构中,您通常有3层:

  • 客户端代码所在的客户端/演示文稿层;和
  • 业务逻辑所在的中间件层;和
  • RDBMS和其他数据繁重的系统所在的 data / eis

在Java领域,对于Web应用程序,这可能如下所示:

  • 应用程序服务器,例如GlassFish运行“Web层”(包含Web应用程序中的客户端层的WAR)以及“业务层”(EJB,中间件等);和
  • 体现数据层的RDBMS服务器

在虚拟化/集群环境中,这些应用程序(GlassFish,RBMBS,如Oracle或PostgreSQL等)将在VM上运行。

我的问题:在这些虚拟机中分配/分发这种3层架构的标准方法是什么?意思是,以下任何一种“策略”可能可行,但不是优先

  1. 一台虚拟机(假设所有虚拟机都是Ubuntu服务器,因此成本/价格不会影响等式)运行GlassFish和RDBMS(全部3层)
  2. 两个虚拟机:运行GlassFish的应用服务器虚拟机和运行的数据库服务器虚拟机,比如PostgreSQL
  3. 三个虚拟机:两个运行GlassFish的应用服务器虚拟机,但是1个GlassFish实例仅运行WAR(Web层),而第二个FlassFish实例运行中间件/ biz逻辑;然后是第三个数据库服务器
  4. 显然,如果所有服务器(所有层)都在同一个VM上运行,它们可以更快或更高效地运行,因为它们不会因网络延迟而陷入困境。但他们会在同一个虚拟机上,这需要我需要大型硬件才能支持它们。此设置可能还存在安全问题。

    每个人都有利弊。我对哪些策略最能实现以下目标感兴趣:(1)最大化吞吐量/速度,(2)最适合集群/云环境,(3)最大化安全性。

    提前致谢!

2 个答案:

答案 0 :(得分:2)

  

(1)最大化吞吐量/速度,

这完全取决于您的申请。例如,数据库可能是你的瓶颈,在这种情况下你在JVM中的作用非常重要。

  

(2)最适合群集/云环境

如果您要分发系统,则最有可能要分发您的表示层。这是因为他们所做的工作取决于客户的数量,每个客户所做的工作在很大程度上是独立的。 (在表示层中)

  

和(3)最大化安全性。

拥有更多虚拟机并不能保证提高安全性。应该设置您的JVM,以便在其中运行的不同应用程序完全分离。如果你想防止拒绝攻击并且你的后端服务被其他系统使用,你可能想要将它们分开,否则它没有多大区别。

答案 1 :(得分:1)

我认为您的问题的答案在很大程度上取决于此应用程序行为,数据库使用情况等...如果不查看当前的性能指标(如已提及的其他答案),则无法说明。我发布了一些我的想法作为指导。

数据库

大多数组织在不同的主机中运行RDBMS,并且一些工程师会选择永远不会虚拟化这些,这取决于他们的数据库供应商最佳实践对他们的案例的说法(也就是说,我通常认为VM等同于物理主机和我尽可能使用它们。

性能方面,RDBMS通常需要内核调优或非常规文件系统策略,并将它们放在不同的主机中可以提供帮助。如果需要在高可用性模式或群集中设置数据库,将其与应用程序服务器分开也可以使事情变得更容易。请注意,如果您需要这样做,数据库调优可能是一个困难的主题,如果认真对待,它通常涉及对齐磁盘中的分区,尝试通过巧妙地分配数据库数据段/文件来减少磁头移动,考虑DBMS和操作系统缓存大小和策略......所有这些都会影响在同一主机上运行的其他应用程序,所以我宁愿单独留下数据库。

此外,RDBMS通常服务于多个应用程序(这有很好的理由:有时某些集成需要访问多个应用程序数据库)。将它们与应用程序服务器分开有助于

此外,数据库系统有自己的升级,备份,分发/群集和管理过程,并且通常由不同的人员维护,而不是应用程序服务器。因此,如果单独考虑,整个数据库管理主题更容易处理。如果数据库成为瓶颈,您可以单独使用数据库,而无需考虑其他层是否会影响性能。

我建议将RDBMS单独保存在单个主机中,以适应合理规模的生产环境。但是,当然,如果您没有性能,管理或可用性要求,则可以考虑将共享服务器用于所有内容。

Glassfish的

一般而言,如果要将Java EE应用程序部署到多个服务器(用于负载平衡或高可用性),则需要将相同的应用程序服务器和工件安装到群集中的所有应用程序服务器。然后,您可以选择要在群集的每个节点上启用哪些工件。某些应用程序服务器可以根据服务器负载启用或禁用组件。在这种情况下,您的应用程序服务器是您需要分发的“单元”。

现在,在某些情况下,您或您的组织可能更愿意为Web层和业务层完全分离网络层(即安全问题)。在这种情况下,您将使用单独的主机。如果您的Web层非常繁重,并且您发现需要将其与业务层分开扩展(即您发现需要6个Web服务器,但可以使用1个或2个EJB容器),我将这两个层分开太

注意:在同一Glassfish实例中运行Web层和EJB层有一些好处:因为它们共享JVM,所以Web层和业务层之间的调用可以使用call-by-reference语义。根据您的工作量以及响应的大小和序列化成本,这可能会导致性能显着提高。

在大多数情况下,对于许多企业应用程序,我只使用一个或两个服务器(取决于您是否需要高可用性)包含两个层,因为即使负载增加,您仍然可以垂直增长(增加服务器功率或VM资源) )或水平(添加另一个服务器和负载平衡请求)。

全球可用和高吞吐量的应用程序需要考虑许多其他方面才能使它们可扩展(简单地将节点添加到Java EE集群节点不会削减它),所以我不认为这有任何解决方案更好或更差,以便部署到“云”,但总的来说,如果您计划部署到弹性虚拟化服务并且您的要求证明了这一点,我建议将Web和业务层分开。

安全

在我看来,讨论的主题对安全性没有直接影响。

最后,我确信关于这个话题可以说得更多,而且我的经验有限,所以请多多意见;)。