如何处理来自不同服务器的多个数据库结果以获取请求

时间:2016-06-30 06:42:56

标签: java database architecture scalability bigdata

我有云统计信息(Structured data :: CSV)信息;我必须向管理员和用户公开。

但是对于可扩展性;数据收集将由多台机器(perf监视器)收集,这些机器与各个DB连接。

现在经理(经理)负责向所有性能监测器多播请求;收集整体统计数据以满足单个UI请求。

所以问题是:

  

1)如何根据以下方式对多个监视器数据进行排序   经理的客户要求。每个监视器可以根据客户端给出结果   请求;但仍然如何通过java合并多个机器数据?   意味着如何在内存中执行sql聚合/标量(例如Groupby,orderby,avg)函数对从MGR的多个集群检索到的所有结果。如何在java端实现DB sql聚合/标量功能,任何已知的API?   我认为我需要的是在hadoop中减少mapreduce技术的一部分。

     

2)来自UI的请求(假设来自DB的选择计数(*),其中Memory>   1000MB)必须转发到多台机器。现在如何发送并行   请求个人监视并仅在所有节点时使用   有回应吗?意味着如何等待用户线程直到消耗所有   性能监测器的响应?如何在MGR上触发针对单个UI请求的并行REST请求。

     

3)我是否必须在Mgr和Perf监视器上验证UI用户?

     

4)你认为这种方法有任何缺点吗?

注意:

1)我没有使用NoSql,因为数据是结构化的,不需要连接。

2)我没有去找node.js因为我是新手,可能需要更多时间来开发它。此外,我没有开发任何单线程最适合的并发关键。这里只完成数据的推送/检索。没有修改。

3)我希望每个监视器都有单独的数据库,或者至少有两个具有多个集群的DB实例,以支持更快地访问实时BIG统计数据。

enter image description here

5 个答案:

答案 0 :(得分:6)

您希望扩展自己的应用,但是您设计了一个固有的瓶颈。即:经理。

我要做的是将经理分成至少两部分。前端和后端。前端可以简单地是聚合器和/或控制器,它收集来自所有不同UI服务器的所有请求,为这些请求添加时间戳并将它们放入队列(RabbitMQ,Kafka,Redis等),使用UI会话ID发送消息或类似的东西,唯一地标识请求的来源。然后你只需要等到队列得到响应(当然有不同的主题)。

然后在您的后端(队列的另一端),您可以设置与负载需要一样多的节点,并使它们执行相同的任务。即:从队列中提取请求并根据需要调用这些性能监视API。您可以根据需要扩展这些后端节点,因为它们没有任何状态,所有需要存储的状态已经是队列中消息的一部分,Redis / Kafka将为您自动保留这些消息/ RabbitMQ或您选择的任何其他内容。

您也可以在后端使用Apache Storm或类似功能为您执行此操作,因为它专为此类应用程序而设计。

Apache Storm还具有通过Trident API公开的内置合并功能。

关于身份验证的注意事项:您应该在前端验证HTTP请求,然后您就可以了。只需为连接到mgr的用户分配唯一ID(最有可能是会话ID),并在将请求转发到下游服务器时使用此内部ID。

  

现在如何将并行请求发送到单个监视器并使用   只有当所有节点都被响应时?意味着如何等待用户线程   直到消耗perf监视器的所有响应?如何触发   MGR上单个UI请求的并行REST请求。

如果您有很多关于处理用户连接和为响应客户提供服务的问题,那么我建议您选择一本关于Java servlets API的书。您可能希望阅读此示例:Servlet & JSP: A Tutorial (A Tutorial series)。它有点过时,但写得很好。

但是,如果您对这些非常基本的话题有很多疑问,那么最好将架构设计留给更有经验的人。

答案 1 :(得分:2)

不要重新发明轮子,使用一些优秀的现有BAM和数据库监控工具,它们有很多内置的仪表板和统计信息,易于与Java和工作流程连接。

答案 2 :(得分:2)

  

但是对于可扩展性;数据收集将由多个收集   机器(性能监视器)与各个DB连接。

您预期的大概是什么类型的缩放...是GB的多个Terra字节的数量......原因是这些天SQL Server和Oracle可以处理大量的数据。一旦数据被收集在一个中央数据库中,就搜索和处理而言,它的游戏就被关注起来。

  

现在经理(经理)负责将请求组播到所有人   性能监测;收集整体统计数据以满足单个UI   请求。

这将是一个重要的任务来写这个,它将是非常复杂的恕我直言。那说我不是这方面的专家。

答案 3 :(得分:2)

我要做的是在你的性能监视器中放置一层Hazelcast或Infinispan或类似的东西而不是Hazelcast。性能监视器本身就像逻辑一样可以是DataGrid的一部分。然后MySQL将作为此数据网格的持久存储。从这个意义上讲,你可以拥有多个Mysql,每个mysql只保存一部分数据它只是作为扩展能力超越你的最大RAM。超时您扩展性能监视器,您还将扩展您的持久性功能。

Young然后Map Reduce或其他分布式功能进行聚合可能会导致大量的并行性和服务器显着增加请求的能力。这种架构也是水平的。最后看起来应该是这样的:

Alternative architecture

另外在另一个注释中说,一般来说,每个淡化广播都不需要1个MySQL。这取决于目标是什么。我也从图中忘记了管理器,但事情很简单,它既可以作为数据网格的网关,也可以与网格合并。

答案 4 :(得分:1)

不确定我的回答是否对您有用,因为此问题有时会被发布。

我想根据您的问题,当前方法中的问题和提出的解决方案来回答......

  

1)如何根据数据对多个监视器数据进行排序   客户要求经理。每个监视器可以按照结果给出结果   客户要求;但仍然如何通过合并多个机器数据   java吗?意味着如何在内存中执行sql aggregate / scalar(例如   Groupby,orderby,avg)函数检索从中检索到的所有结果   MGR的多个集群。我如何实现DB sql aggregate / scalar   java方面的功能,任何已知的API?我想我需要的是   减少hadoop中mapreduce技术的一部分。

Java提供内置Java DB作为Java发行版的一部分,也可作为Apache Derby数据库使用。此数据库可用作内存中的SQL数据库。 JavaDB& Apache Derby将数据存储到磁盘中。因此,重启后您不会丢失数据。 点击此处http://www.oracle.com/technetwork/java/javadb/overview/index.html https://db.apache.org/derby/

对于Map-Reduce,简单的基于Java的集合可以使用。在这种情况下,我认为你不需要任何特殊的Map-Reduce框架。但是,当您从多个来源读取数据时,您应该考虑内存不足,网络带宽等

  

2)来自UI的请求(假设来自DB的选择计数(*),其中Memory>   1000MB)必须转发到多台机器。现在怎么发送   并行请求到个人监视器并且仅在全部时使用   节点被响应?意味着如何等待用户线程直到消耗全部   性能监测器的响应?如何触发并行REST请求   对于MGR上的单个UI请求。

理想情况下,NodeJS类应用程序在这种情况下是最好的套件,只要有HTTP响应,应用程序就会获得回调。但是,您可以实现观察员模式,如此处所述How do I perform a JAVA callback between classes?

  

3)我是否必须在Mgr和Perf监视器上验证UI用户?

应根据您的要求

  

4)你认为这种方法有任何缺点吗?

此方法存在一些缺点

  • 不应从UI按需提取数据。只要有生成数据的请求,至少应该在集中式数据库中提供数据。从各个端点提取数据非常昂贵。
  • 必须定期收集统计数据以维护历史记录,并且必须根据移动时间窗口生成报告。
  • 如果需要处理大数据,JVM可能会OutOfMemory。需要妥善处理。
  • 每次有新请求时,大型数据都可能通过网络传输。它可能会再次出现相同的数据。

注意:

  

1)我没有使用NoSql,因为数据是结构化的,没有连接   必需的。

没有SQL并不意味着没有遵循结构。即使NoSQL数据库最适合此类数据,您也不需要更新记录,交易等。

  

2)我没有去node.js,因为我是新手,可能需要更多   开发它的时间。我也没有开发任何并发   单线程最适合的地方。这里只   完成数据的推送/检索。没有修改。

NodeJS不是一个好选择,因为它是单线程的。当您要执行CPU密集型作业时,不应使用NodeJS。和你的一样。

  

3)我希望每个监视器都有单独的数据库,或者至少需要两个实例   DB具有多个集群,以便实例支持更快   访问实时BIG统计数据。

**我宁愿建议您将数据存储到任何可以水平扩展的数据库中,在数据到达时处理数据或批处理数据,以便您的用户体验良好。 **