以一种简化的方式,我的 Java 应用程序可以描述如下:
它是一个运行在具有 SOAP 接口的 Tomcat 服务器上的 Web 应用程序。该应用程序使用 JPA/Hibernate 将数据存储在 MySQL 数据库中。存储的数据包括用户列表、主机列表和指向文件系统中大文件 (10GB) 的 URI 列表。整个系统由运行我的应用程序的中央服务器和一堆工作主机组成。用户可以连接到 SOAP 接口并要求系统将属于他的文件复制到特定的工作主机,然后他可以在其中以某种方式分析数据(我们不能使用 NFS,我们需要将数据复制到工作主机的本地磁盘存储)。然后数据库为每个用户存储他的文件存储在哪个工作主机上。
目前,系统运行在一台中央服务器上,其中包含 Tomcat 应用程序和 MySQL 数据库以及 10 个工作主机和大约 30 个用户,这些用户存储了 100 个文件(平均 10GB)大小,分布在工作主机上。
但是将来我必须将系统扩展 100-1000 倍。所以我可能要处理 10000 个用户、100000 个文件和 10000 个主机。并且系统也应该具有容错能力,这样我就没有一个中央服务器(这是现在系统中的单点故障),但可能有几个。此外,如果其中一个工作主机出现故障,系统应该会收到通知,因此它不会尝试复制该服务器上的文件。
我现在的问题是:我可以使用哪些 Java 技术来使我的应用程序具有可扩展性和容错性?你会推荐什么样的架构?我是否应该仍然有一个庞大的数据库将系统中所有文件、主机和用户的所有信息存储在一个地方,或者我应该更好地将我的数据库分布在多个主机上并以某种方式同步它们?