群集多服务应用程序

时间:2011-02-03 10:13:16

标签: java-ee load-balancing cluster-computing

正如我的问题标题所述,我目前面临的问题是如何对提供多种服务的应用程序进行负载均衡。

该应用程序是一种存储服务,用于存储在存储桶中组织的用户的文件。文件本身实际上并不存储在应用程序服务器上,而是存储在网络存储上。应用程序服务器用于加密/解密数据并提供多种服务,使用户能够访问其数据。 这些服务目前包括FTP,SFTP,HTTP以及供内部使用的JNDI / RMI,并可能在未来的其他专有或自有协议中得到增强。

一次可能无法使用两个服务器访问两个文件桶,因此我想将ANY服务的任何调用路由到相同的群集节点(如果它仍在运行)。如果没有,另一台服务器将打开与存储桶的连接并将其提供给用户。

你如何集群这样的应用程序?我查看了Tomcat和JBoss AS集群指南,并阅读了一些关于Java EE集群的文章,但没有什么可以让我知道如何实现我的目标。我认为我的一个主要问题是负载平衡,我可能无法在这里使用任何标准解决方案。

1 个答案:

答案 0 :(得分:1)

我很想从文件名创建一个哈希值,并使用它来确保负载相对平衡,以便开始。

对于简化示例(在C中):

hash = 0
for(i = 0; i < strlen(file_name); i++) {
    hash ^= (hash << 5) ^ file_name[i];
}
server_number_for_this_file = hash % total_servers;

要查找特定组中的所有文件,请询问所有服务器并合并回复。对于例如第一个服务器可能返回“hello”和“foo”,第二个服务器可能返回“goodbye”和“bar”,因此您将组合这些部分列表以获取4个文件的列表。

注意:我假设应用程序服务器缓存目录内容以避免一直骚扰网络存储,因此这也提高了缓存效率(与10个应用程序服务器一样,每个应用程序服务器只需要缓存目录的10%)内容数据而不是100%)。

当然我也想在客户端上进行加密/解密,以便在客户端和应用服务器之间(通过不受信任的互联网?)传输的文件数据被加密,而不是“纯文本”不受信任的网络,只加密在应用服务器和网络存储(在可信网络上)之间传输的数据。