【发布时间】:2010-09-13 15:02:20
【问题描述】:
我有一个数据转换产品,它允许选择数据库中的表并将源数据库中的行数据转换到目标数据库。
这是在当前产品(基于 java 的工作台和引擎)中通过一次处理 1000 行并并行执行 10 个线程来处理的。这种方法适用于较小的数据集。但是,当我必须一次转换大量数据集(比如大约 X 百万条记录)时 - 这种方法仍然有效,但是
- 运行我的产品的主机 CPU 负载过重。
- 源数据库和目标数据库的事务过多,导致它们开始变慢。 (现在,这可能是因为数据库服务器可能运行在较慢的硬件上。)
我开始寻找解决方案,并通过在源/目标数据库服务器机器上请求硬件“加强”来快速解决这个问题。例如,这涉及购买新的多核 CPU 和一些额外的 RAM。事实证明,升级硬件不仅仅是唯一的问题:需要为数据库购买多个软件许可证 - 这要归功于多核处理器(每个核心许可证)。
所以,球现在在我的球场上,我必须想出办法来解决这个问题,通过对我的产品进行更改。而且,这里是我需要你帮助的地方。此时,我可以想到一种可能的方法来处理巨大的负载:
方法1
- 从源数据库读取数据,将其保存到临时介质(文件)中。
- 通过在分布式环境(更便宜的单核机器)中运行数据来转换持久文件中的数据,并在那里处理切换到文件持久性的“权衡移动”。 (使用 Apache Hadoop 之类的东西来处理分布式计算部分)
- 正在将数据写入目标数据库。
从架构的角度来看,这就是我目前所能想到的。 你以前处理过这种情况吗?如果是,您是如何处理的? 感谢您的建议和帮助。
【问题讨论】:
-
什么是性能瓶颈?您提到了两个候选者:应用程序 CPU 负载和数据库负载。你能进一步缩小范围吗?
-
@oksayt 现在,我主要关心的是数据库负载。我没有这方面的基准,但我们的想法是通过考虑可能的瓶颈来构建更好的产品。
标签: java design-patterns architecture hardware