如何在任何数据库上处理大量交易?

Jay*_*Jay 5 java architecture hardware design-patterns

我有一个数据转换产品,它允许在数据库中选择一个表并将源数据库中的行数据转换为目标数据库.

这是在当前产品(基于java的工作台和引擎)中处理的,一次处理1000行并且并行执行10个线程.这种方法适用于较小的数据集.但是,当我必须同时转换大量数据集(比如大约X万条记录)时 - 这种方法仍然有效,但是

  • 我的产品运行的主机CPU负载很重.
  • 源数据库和目标数据库打了太多的事务,他们开始放慢速度.(现在,这可能是因为数据库服务器可能在较慢的硬件上运行.)

我开始寻找解决方案,并通过在源/目标数据库服务器计算机上请求硬件"加强"来快速解决这个问题.这涉及到购买新的多核CPU和一些额外的RAM.事实证明,升级硬件不仅仅是唯一的问题:需要购买数据库的多个软件许可证 - 多亏了多核处理器(每个核心许可证).

所以,球现在在我的球场上,我将不得不通过改变我的产品来找到解决这个问题的方法.而且,这是我需要你帮助的地方.此时,我可以想到一种处理大负载的可能方法:

Approach1

  1. 从源数据库读取数据,将其持久保存到临时介质(文件).
  2. 通过在分布式环境(更便宜的单核机器)中运行数据来转换持久文件中的数据,通过处理切换到文件持久性的"权衡移动".(使用Apache Hadoop之类的东西来处理分布式计算部分)
  3. 将数据写入目标数据库.

从架构的角度来看,这就是我现在能想到的.你以前处理过这种情况吗?如果是的话,你是怎么处理的?感谢您的建议和帮助.

Shi*_*iji 3

您可以在不增加数据库许可成本的情况下执行以下操作:

  • 您的工具使 CPU 承受重负载,假设您的工具运行在未运行数据库的计算机上,请增加该计算机上的 CPU 功率,或者如果您的工具允许它在多台计算机上运行。
  • 活动交易数量增加的原因之一是每笔交易都需要时间才能完成。您可以通过优化磁盘或放入更快的磁盘来加快速度。

此外,如果您使用插入而不是批量插入,则还有巨大的改进潜力。正常插入的问题在于它将信息写入日志,以便可以回滚事务。

这种情况下,我能够帮助某人将加载时间从10 小时减少到6 分钟:)