我正在开发一个能够将数据从一个数据源迁移到另一个数据源的Java应用程序集群(即数据库到文件,文件到数据库,Oracle到MSSQL,反之亦然等)
使用JGroups进行任务分发和集群管理。一个示例配置是具有此相同应用程序实例的4台服务器(可能是所有具有相同硬件配置的服务器)。
在提出我的问题之前,我应该提一下我想分发的任务的性质:
例如,可能会要求其中一个节点将Oracle表复制到另一个数据库。在这种情况下,我解析此表的rowid范围以与不同的连接并行查询数据。 (DIY并行)。因此,每个节点获得1/4的源数据并将其并行写入目标数据库。
Buffer On Node
---> Node 1 --->
---> Node 2 --->
Source Table Target Table
---> Node 3 --->
---> Node 4 --->
如果这是唯一的情况,我会将单个表副本的每个分支(rowid范围)分发给其中一个节点。
但是另一个例子(让我感到困惑),可能会有复杂的查询或查询的视图被复制到目标表。由于不涉及数据块或rowid,因此无法分发此数据。所以可能会有我无法分发的请求。对于这个,我在单个节点上使用单个连接读取查询并将其并行写入目标表(假设并行度为4,我知道并行写入可能仅在读取比写入更快时才有用,或者我也这样觉得。 )。或者可能将excel文件复制到数据库平台的表中。
--->
--->
Source( Queried data, file, etc. ) ---> Node 1 Target
--->
--->
所以,我不太确定如何分配任务说当有两个请求被复制的查询和3个要复制的表时。
我认为一种解决方案是估算每个数据请求的平均记录大小,并立即计算服务器上的最大数据负载。
如果要并行复制表,平均记录大小为100字节,缓冲区大小为1000条记录,则每个节点最多只能执行100 * 1000 = 100000字节,直到数据复制完成。
另一方面,如果有另一个文件请求,比如说将在单个节点上复制200字节的平均记录,并且负载将是200 * 1000 = 200000字节。
所以我能够通过节点上的当前负载来分配新任务。
我认为这个解决方案是非常假设的:)所以我的问题是:
希望这听起来不太复杂。