8

以一种简化的方式,我的 Java 应用程序可以描述如下:

它是一个运行在具有 SOAP 接口的 Tomcat 服务器上的 Web 应用程序。该应用程序使用 JPA/Hibernate 将数据存储在 MySQL 数据库中。存储的数据包括用户列表、主机列表和指向文件系统中大文件 (10GB) 的 URI 列表。整个系统由运行我的应用程序的中央服务器和一堆工作主机组成。用户可以连接到 SOAP 接口并要求系统将属于他的文件复制到特定的工作主机,然后他可以在其中以某种方式分析数据(我们不能使用 NFS,我们需要将数据复制到工作主机的本地磁盘存储)。然后数据库为每个用户存储他的文件存储在哪个工作主机上。

目前,系统运行在一台中央服务器上,其中包含 Tomcat 应用程序和 MySQL 数据库以及 10 个工作主机和大约 30 个用户,这些用户存储了 100 个文件(平均 10GB)大小,分布在工作主机上。

但是将来我必须将系统扩展 100-1000 倍。所以我可能要处理 10000 个用户、100000 个文件和 10000 个主机。并且系统也应该具有容错能力,这样我就没有一个中央服务器(这是现在系统中的单点故障),但可能有几个。此外,如果其中一个工作主机出现故障,系统应该会收到通知,因此它不会尝试复制该服务器上的文件。

我现在的问题是:我可以使用哪些 Java 技术来使我的应用程序具有可扩展性和容错性?你会推荐什么样的架构?我是否应该仍然有一个庞大的数据库将系统中所有文件、主机和用户的所有信息存储在一个地方,或者我应该更好地将我的数据库分布在多个主机上并以某种方式同步它们?

4

1 回答 1

13

您需要的技术称为架构。

无论您使用哪种技术,您都需要一个架构良好的系统来实现可扩展性和冗余。绘制系统当前工作的整个体系结构图。用其对用户、作业、带宽、硬盘空间、内存或任何限制您的应用程序的部分的限制标记每个组件。这将为您提供基线设计。

现在绘制相同的图表,以满足您的可扩展性和冗余要求。您可能必须分解部分才能使其工作,或者开发全新的部分。该图将非常清楚您需要什么。

我要解决的一个具体问题是数据库。如果您可以跨物流线拆分数据库,这样您就不会将任何查询从一个连接到另一个,那么您应该有单独的数据库。除此之外,数据库的最佳配置是将每个数据库都放在一台具有大量存储空间和非常快的访问时间的快速机器上。如果你这样做,唯一会减慢你的数据库的就是糟糕的查询或索引不佳的表。根据我的经验,应避免同步数据库,除非您拥有一个具有写访问权限的主数据库,并且它复制到其他只读数据库。无论如何,这可能是您分析所有查询之后的最后一步,并且您确实需要额外的硬件。

于 2011-02-02T20:23:08.410 回答