多個遠端資料庫查詢

andrawu發表於2004-12-14
前景:
針對於每個省異地分佈的每個市中心的資料庫,對每個市中心的資料庫中的資料進行綜合查詢,而且每個市中心的資料庫中的資料都有上百萬級的資料記錄需要查詢獲取和合並。對此需要考慮的問題是: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個併發執行緒執行,這樣併發人數達到一定的數量後,應用伺服器將會出現當機情況,這裡有一個併發使用者訪問瓶頸問題。

請大家提供一個更好的解決方案

相關文章