以简化的方式,我的Java应用程序可以描述如下:
它是在具有SOAP接口的Tomcat服务器上运行的Web应用程序。该应用程序使用JPA / Hibernate将数据存储在MySQL数据库中。存储的数据包括用户列表,主机列表以及指向文件系统中的大文件(10GB)的URI列表。 整个系统由运行我的应用程序的中央服务器和一堆工作主机组成。用户可以连接到SOAP接口并要求系统将属于他的文件复制到特定的工作主机,然后他可以以某种方式分析数据(我们不能使用NFS,我们需要将数据复制到工作主机的本地磁盘存储)。然后,数据库为每个用户存储其文件存储在哪个工作主机上。
目前,系统正在运行一个带有Tomcat应用程序和MySQL数据库的中央服务器以及10个工作主机和大约30个用户,这些用户有100个文件(平均10GB)大小分布在工作主机上。
但是将来我必须将系统扩展到100-1000倍。所以我可能要处理10000个用户,100000个文件和10000个主机。并且系统也应该具有容错能力,因此我没有一个中央服务器(现在是系统中的单点故障),但也许有几个。此外,如果其中一个工作主机出现故障,则应通知系统,因此不会尝试复制该服务器上的文件。
我现在的问题是:我可以使用哪些Java技术来使我的应用程序具有可扩展性和容错性?你会推荐什么样的建筑?我是否还应该拥有一个庞大的数据库,在一个地方存储系统中所有文件,主机和用户的所有信息,或者我应该更好地在几台主机上分发我的数据库并以某种方式同步它们?
答案 0 :(得分:14)
您需要的技术称为架构。
无论您使用哪种技术,都需要具有良好架构的系统以实现可扩展性和冗余。制作当前工作的系统的整个架构图。标记每个组件的用户,作业,带宽,硬盘空间,内存或任何限制应用程序的部分的限制。这将为您提供基线设计。
现在绘制与满足可扩展性和冗余要求所需的相同的图表。你可能不得不拆分它们以使它工作,或者开发全新的碎片。该图表将非常清楚您需要什么。
我想要解决的一个具体问题是数据库。如果您可以跨物流线拆分数据库,以便不加入任何查询,那么您应该有单独的数据库。除此之外,数据库的最佳配置是将每个数据库放在一台快速计算机上,具有大量存储空间和非常快的访问时间。如果这样做,唯一会减慢数据库速度的是错误查询或索引不佳的表。根据我的经验,除非您有一个具有写访问权限的主数据库并且它复制到其他只读数据库,否则应避免同步数据库。无论如何,在您分析了所有查询并且确实需要其他硬件之后,这可能是最后一步。