数据读写群集的负载均衡策略

时间:2013-12-13 13:56:29

标签: java jdbc load-balancing data-migration

我正在开发一个能够将数据从一个数据源迁移到另一个数据源的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字节。

所以我能够通过节点上的当前负载来分配新任务。

我认为这个解决方案是非常假设的:)所以我的问题是:

  • 根据平均记录大小来估算负载是否有效?
  • 我计算平均记录大小会遇到什么样的困难?
  • 您能想到还有其他解决方案吗?平衡负载与这种I / O绑定任务分布的最佳方法是什么?

希望这听起来不太复杂。

0 个答案:

没有答案