如今常常說來水平擴展,這個時候通常都會說到數據庫的水平擴展,這個時候通常就會用到數據庫的分庫分表方案。關於這一塊,可能你們也都一些開源或商業的方案進行過一些研究。 數據庫
今天我就簡單的拿一些性能測試數據進行簡單的展現,看看TinyDbRouter和Mycat與純純的JDBC之間的性能差別狀況。 windows
爲了進行這項測試,我就得準備一下測試環境,由於作的是對比測試,所以用多少NB的服務器不是重點。另外,因爲虛擬機之間會有CPU、磁盤IO的資源競爭,所以我選擇了用獨立的計算機進行這項測試,這樣才能夠真正的模擬水平擴展時的硬件拓展方式。 服務器
爲此我找了4檯筆記本電腦,配置以下: 網絡
客戶端和服務器 硬件配置: |
硬件平臺:windows7旗艦版 (32位)物理機 |
CPU: 4CPUs |
處理器:Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz |
內存:4GB |
硬盤:500G |
此次主要測試多種方式下數據庫的插入和查詢方面方面的性能差別。 性能
環境說明:爲了更好的進行觀察和分析,採用MyCat方式式,MyCat採用了獨立部署爲一臺服務器的方式 學習
從上面的數據能夠看到:在沒有壓力的狀況下,在插入時增長了TinyDbRouter與不增長TinyDbRouter層時的性能對比爲降低了6.6%,而在有壓力的狀況下性能降低大體爲15%左右。 測試
而在查詢的時候,因爲查詢的時間較插入時間長許多,所以能夠看到TinyDbRouter對於查詢的影響能夠忽略不計。 優化
從上面的數據能夠看到,在沒有壓力的狀況下,插入的速度較單庫相比有些許降低,可是隨着壓力的增長,分片了的性能逐步上升,雖然壓力沒有加大到最大,可是處理性能已是未分片的1.5倍左右,說明經過分片確實能夠有效提高插入的TPS數量。 spa
咱們再來看看查詢方面的性能差別,因爲一樣的記錄數,分片方案中把數據均衡的分配到了兩個不一樣的庫中,所以不帶分庫鍵查詢時,查詢性能大體是未分庫方式的2倍左右浮動(這裏的查詢條件是動態生成,所以刨除了緩衝方面的因素);帶有分庫鍵進行查詢時,查詢性能大體是未分庫方式的4倍左右浮動。 中間件
總結,經過分片的方式進行水平擴展,確實能夠有效的提高插入和查詢的效率。提高效率的多少與水平擴展的數量大體成正比。(實際上,隨着分片個數的增長,每臺機器的能力擴展係數是在慢慢減少的)。
經過上面的測試,能夠看到,使用 MyCat把數據分到兩個物理數據庫,也有效的提高了插入效率,這方面和TinyDbRouter的基本相同。
接下來就是對MyCat的查詢方面的性能進行對比測試,性能數據較不分庫有必定提高,可是相對於TinyDbRouter就有必定的差距。
不管是哪一種分庫分表方案,均可以有效提高插入和查詢的TPS。
有分庫鍵查詢和沒有分庫鍵查詢,性能相差明顯。
TinyDbRouter和MyCat的數據庫水平擴展中間件在插入方面的性能損耗相差不大,在查詢方面TinyDbRouter的性能較MyCat有必定的優點,隨着集羣大小的變化,會致使性能的差距進一步擴大。
緣由分析以下:
代表緣由分析:MyCat服務器自已的CPU佔有率比較高,說明其計算量也很是大,致使在MyCat服務器中產生了必定性能損耗。因爲MyCat在這種測試方式下是單點,所以隨着水平擴展的數據庫數量的增長,其單點壓力也會愈來愈大。
深層次緣由分析:MyCat是由獨立的服務器來進行查詢及結果的合併及相關處理,所以必須把數據從數據庫服務器取到MyCat服務器上進行必定的運算後再向客戶端進行返回數據;而TinyDBRouter因爲部署到數據庫客戶端,所以這部分計算由數據庫客戶端進行計算,充分的利用了數據庫客戶端的計算能力,所以不存在單點問題。
一樣的一個處理,MyCat的方式是:客戶端->MyCat->Mycat計算後->水平擴展的數據服務器(這裏是2)->MyCat合併結果後->客戶端
而TinyDBRouter的方式是:客戶端->(DBRouter計算後)->水平擴展的數據服務器(這裏是2)->(DBRouter計算後)->客戶端,網絡傳輸次數較MyCat少了一半。另外因爲TinyDBRouter的合併計算在客戶端進行,所以能夠進行更深刻的優化以提高數據獲取速度。
咱們一開始把MyCat服務器和其中一臺數據庫服務器部署在一臺物理機,結果數據很是不合常理,所以才把它獨立部署爲一臺服務器。
咱們一開始是用Delete語句清空數據的,後來發現這種方式對測試數據有比較大的影響,一樣的數據量與測試方法,數據相去甚遠。採用了DROP表現重建的方式後保證了數據的可驗證性,一樣的數據量與測試方式,數據很是接近。
咱們在測試過程當中,秉持了客觀公正的心態來進行這項測試,也是爲了找準本身的位置,和同類產品學習的態度進行的。
咱們保證沒有對測試數據進行任何的人爲調整,而徹底忠實於實驗中採集的數據。
即便一樣時刻的測試數據,也會有輕微的不一樣,可是差距很是小。