多个远程数据库查询

04-12-14 andrawu
前景:

针对于每个省异地分布的每个市中心的数据库,对每个市中心的数据库中的数据进行综合查询,而且每个市中心的数据库中的数据都有上百万级的数据记录需要查询获取和合并。对此需要考虑的问题是:1、从单个数据库中查询百万级数据需要的速度(包括数据库和应用程序的处理能力);2、远程数据在网络中的传输能力(网络带宽);3、同时对多台异地远程数据库提取数据且合并的能力;4、远程访问多台数据的安全问题。

现有系统的框架:基于B/S的Web访问方式。

数据库采用:MySQL数据库;WEB开发采用PHP。

将要采取的解决方案:

1、在现有的数据库基础上,用应用程序实现远程数据库的分布式处理,利用Java的多线程和远程调用机制,实现比较复杂,在性能上、稳定性、安全性上处理都比较差。

2、利用Oracle数据库,Oracle直接支持远程数据库的分布式处理,不需要额外的写其实处理应用程序,实现比较简单,在性能、稳定性、安全性上处理都比较好,特别适合海量数据库的处理。

以下是应用程序实现远程数据库的分布式处理的问题的分析和解决方法:

1、从单个数据库中查询百万级数据需要的速度(包括数据库和应用程序的处理能力)

对于百万级数据的访问,也就是海量级数据的访问方式,为了提高访问的速度,一般要对数据库建索引,考虑利用该数据库的某种特性等等,首先要解决单个数据库的处理能力,才能在这个基础上提高多个数据库同时处理的能力。

2、远程数据在网络中的传输能力(网络带宽)

为了避免百万级数据同时在网络上传输,在现有的网络带宽和应用服务器的内存处理都是不允许的,所以要考虑对百万级数据时行分页处理,将分页数据在内存中处理和网络中传输才是可行的。

3、同时对多台异地远程数据库提取数据且合并的能力

对于从多台异地远程数据库提取数据且合并,如果采用串行的方式进行访问是不行的。如对20台异地远程数据库进行提取数据,一台花费时间是20秒左右,那对20台进行串行处理则要花费20*20=400秒。所以应采取多线程并发处理数据,如果对20台进行并发处理,显而易见只要20秒左右。

4、远程访问多台数据的安全问题

由于采用应用程序直接对多个远程数据库的连接的形式,所以要考虑配置文件的中的IP信息、用户信息要进行加密,以及网络中的数据传输也可以考虑加密。

可行性测试:

1、 对于单个数据库中200百万条数据进行单机获取测试;

测试应用程序:Java开发的B/S应用程序

硬件条件 数据库条件 数据量 表级联数 耗时

CPU:AMD2GRAM:1G 通用获取查询(适合任何数据库) 200万条 2级,不含排序 15秒左右

MySQL特性 3秒左右

CPU:C1.7GRAM:256M 通用获取查询(适合任何数据库) 200万条 2级,不含排序 160秒左右

MySQL特性 35秒左右

以上测试数据显示采用对数据库建索引和利用数据的某种特性是可行的。

2、 对远程数据在网络中的传输能力(网络带宽),用成都数据库中200百万条数据进行单机获取测试

测试应用程序:Java开发的B/S应用程序

硬件条件 数据库条件 数据量 表级联数 耗时

成都远程数据库CPU:两个RAM:4G 通用获取查询(适合任何数据库) 200万条 2级,不含排序 10秒左右

MySQL特性 2秒左右

CPU:AMD2GRAM:1G 通用获取查询(适合任何数据库) 200万条 2级,不含排序 15秒左右

MySQL特性 3秒左右

CPU:C1.7GRAM:256M 通用获取查询(适合任何数据库) 200万条 2级,不含排序 160秒左右

MySQL特性 35秒左右

以上测试数据显示采用从数据库中的数据进行页处理,页大小的数据的网络中传输的影响时间是可以忽略的。

3、 同时对多台异地远程数据库提取数据且合并的能力测试

采用Java的多线程处理,针对每个数据库的访问都开一个线程进行获取数据。

硬件条件 数据库条件 数据量 表级联数 耗时

成都远程数据库CPU:两个RAM:4G 通用获取查询(适合任何数据库) 200万条 2级,不含排序 10秒左右

MySQL特性 2秒左右

CPU:AMD2GRAM:1G 通用获取查询(适合任何数据库) 200万条 2级,不含排序 15秒左右

MySQL特性 3秒左右

CPU:C1.7GRAM:256M 通用获取查询(适合任何数据库) 200万条 2级,不含排序 160秒左右

MySQL特性 35秒左右

CPU:C1.7GRAM:256M 通用获取查询(适合任何数据库) 200万条 2级,不含排序 140秒左右

MySQL特性 30秒左右

CPU:C1.7GRAM:256M 通用获取查询(适合任何数据库) 200万条 2级,不含排序 150秒左右

MySQL特性 33秒左右

CPU:C1.7GRAM:256M 通用获取查询(适合任何数据库) 200万条 2级,不含排序 120秒左右

MySQL特性 24秒左右

CPU:C1.7GRAM:256M 通用获取查询(适合任何数据库) 200万条 2级,不含排序 160秒左右

MySQL特性 35秒左右

对以上7台数据库进行测试结果是:

不用多线程处理(单线程串行访问),总耗时=2+3+35+30+33+24+35=162秒左右

用多线程处理(多线程并行访问),总耗时=2+3+35+30+33+24+35=35秒左右

结果:对于远程多台数据库进行多线程并发处理是可行的。

4、 远程访问多台数据的安全问题测试:

此项测试没有进行。

现在存在问题:

1、 远程多个数据库中的数据合并排序问题,在这个实现上有一定的难度,现在还没有找到一个好的算法,有待选择和测试。

2、 远程多个数据库的出错处理能力。

3、 多线程的控制能力。

缺陷:对于20台数据库服务器,将要开20个并发线程去处理,如果是5个人同时并发去操作,将会有100个并发线程运行,这样并发人数达到一定的数量后,应用服务器将会出现死机情况,这里有一个并发用户访问瓶颈问题。

请大家提供一个更好的解决方案

andrawu
2004-12-14 11:45
看了一下yipsilon所写的MySQL数据库集群自动安装脚本,好象对这个有一点用,不过还没有试试。还要请问yipsilon对这个需求是不是适合?

http://www.jdon.com/jive/thread.jsp?forum=121&thread=17644

banq
2004-12-18 13:17
在多个数据中心的数据拷贝或传递,不建议采取同步实时系统,如Servlet/JavaBeans等。

这种通信我们第一个反应是使用Email,那么在企业级别中的通信我们使用JMS,使用JMS可以确保数据传输到位,安全保证在于你对数据包的加密,可采取每个数据包公钥、密钥的加密方式。

猜你喜欢