繁体   English   中英

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

[英]How to deal with multiple database results from different servers for a request

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

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

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

所以问题是:

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

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

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

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

笔记:

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

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

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

在此输入图像描述

您想扩展您的应用程序,但您设计了一个固有的瓶颈。 即:经理。

我要做的是,我会将经理分成至少两部分。 前端和后端。 前端可以简单地是聚合器和/或控制器,它收集来自所有不同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:教程(教程系列) 它有点过时但写得很好。

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

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

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

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

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

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

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

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

替代架构

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

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

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

1)如何根据经理的客户要求对多个监控数据进行排序。 每个监视器可以根据客户端请求给出结果; 但仍然如何通过java合并多个机器数据? 意味着如何在内存中执行sql聚合/标量(例如,Groupby,orderby,avg)函数对从MGR处的多个聚类中检索到的所有结果。 如何在java端实现DB sql聚合/标量功能,任何已知的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的选择计数(*),其中内存> 1000MB)必须转发到多台机器。 现在如何将并行请求发送到单个监视器并仅在响应所有节点时使用? 意味着如何等待用户线程直到消耗来自perf监视器的所有响应? 如何在MGR上触发单个UI请求的并行REST请求。

理想情况下,NodeJS类型的应用程序在这种情况下是最好的套件,只要有HTTP响应,应用程序就会获得回调。 但是你可以像这里解释的那样实现Observer Pattern 如何在类之间执行JAVA回调?

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

它应该基于您的要求

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

这种方法有几个缺点

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

笔记:

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM