1. 程式人生 > >資料庫中介軟體-分庫分表壓測報告

資料庫中介軟體-分庫分表壓測報告

測試環境

軟硬體環境

  • 4個彼此相互獨立阿里rds例項:硬體配置相同,每個配置為:4核心、8GB記憶體、20GB磁碟、2000 IOPS,每個例項建立一個數據庫名稱為dbproxy
  • 一箇中間件節點,硬體配置相同,配置為:8核心、8GB記憶體、20GB磁碟 中介軟體預設工作執行緒數:32
  • 一個客戶端節點,硬體配置相同,配置為:4核心、8GB記憶體、20GB磁碟
    壓力測試工具:基於sysbench-0.5開源定製擴充套件版
  • 一個表:表名為為sbtest1用hash演算法切分到4個rds資料庫中
  • 測試方法:每次壓力測試時,分別在2個節點近乎同時各啟動一個sysbench客戶端。
  • 中介軟體日誌級別設定:Mycat和Altas日誌級別設定為error
  • Mycat jvm堆記憶體配置:4GB heap 1GB堆外記憶體
  • 測試資料:每次執行insert操作向空表中寫入400w條記錄,select、update以此資料為基礎進行操作

資料庫Sharding

測試報告

Atlas與Mycat比較

一個sysbench客戶端,利用sysbench測試併發執行緒個數不同的情況下,分別執行insert、select,update三種操作,執行400w次。 測試連線Atlas和Mycat這兩種情況下的QPS(QPS越大,系統性能越好)、每條記錄請求響應耗時, 每組資料重複測試三次後取平均值,具體資料對比如下表所示:

所有下面測試Mycat執行操作過程中,為了獲得最佳效果效能和吞吐量,使用不同gc垃圾回收演算法進行基準壓力測試且都是jit熱程式碼(多次呼叫後再測試),取出表格中最佳一組資料用於趨勢圖對比,經過實驗資料得出不同gc演算法對Mycat吞吐量影響很小,高階gc演算法有些吞吐量還降低了,影響較大因素為新生代堆大小配置。

統計QPS

(記錄數/sec、T95資料)
這裡寫圖片描述

統計QPS趨勢圖

上表資料對應的Atlas和Mycat執行insert操作QPS對比趨勢圖
上表資料對應的Atlas和Mycat執行insert操作QPS對比趨勢圖
結合以上圖表和資料可以看出,當sysbench達到64執行緒數出現拐點,Mycat吞吐量上升比較平緩,Altas則近似直線上升,與Mycat相比Altas吞吐量高近40%

上表資料對應的Atlas和Mycat執行select操作QPS對比趨勢圖
上表資料對應的Atlas和Mycat執行select操作QPS對比趨勢圖
結合以上圖表和資料可以看出,當sysbench達到64執行緒出現拐點,經過業務和場景分析得出中介軟體轉發資料為短生命週期,且多次測試驗證,當調大新生代堆大小會有一些改善。以128執行緒壓測為例,預設新生代堆大小為350MB時QPS是34351/sec,當新生代堆大小改為1500MB時QPS是35076/sec,改為2500MB則QPS是37376,吞吐量提升8%左右。總體上atlas吞吐量高於Mycat一倍以上

上表資料對應的Atlas和Mycat執行update操作QPS對比趨勢圖
上表資料對應的Atlas和Mycat執行update操作QPS對比趨勢圖
結合以上圖表和資料可以看出,當sysbench達到64執行緒出現拐點,Mycat吞吐量遇到瓶頸上升不明顯,以128執行緒壓測為例,預設新生代堆大小為350MB時QPS是30377/sec,當新生代堆大小改為1500MB時QPS是31922/sec,改為2500MB則QPS是37970/sec,吞吐量提升25%左右

統計記錄請求響應耗時

(每條記錄請求響應耗時、單位毫秒、T95資料):
這裡寫圖片描述

統計記錄請求響應耗時趨勢圖

上表資料對應的Atlas和Mycat執行insert操作耗時對比趨勢圖
上表資料對應的Atlas和Mycat執行insert操作耗時對比趨勢圖
結合以上圖表和資料可以看出,Atlas和Mycat耗時相近,原因是瓶頸在於rds的IOPS限制,insert效能依賴於rds的IOPS能力,不能充分發揮Atlas能量

上表資料對應的Atlas和Mycat執行select操作耗時對比趨勢圖
上表資料對應的Atlas和Mycat執行select操作耗時對比趨勢圖
結合以上圖表和資料可以看出,當sysbench達到64執行緒出現拐點,Mycat耗時陡然增加且增速比Atlas快

上表資料對應的Atlas和Mycat執行update操作耗時對比趨勢圖
上表資料對應的Atlas和Mycat執行update操作耗時對比趨勢圖
結合以上圖表和資料可以看出,Atlas和Mycat耗時較為相近,原因是瓶頸在於rds的IOPS限制,update效能依賴於rds的IOPS能力,不能充分發揮Atlas能量

統計硬體資源消耗

一個sysbench客戶端,利用sysbench測試併發執行緒個數不同的情況下,分別執行400w次insert、select、update操作,中介軟體部署機器資源消耗(cpu消耗、load負載),每組資料重複測試三次後取平均值,具體資料對比如下表所示:
這裡寫圖片描述

統計硬體資源消耗趨勢圖

cpu消耗趨勢圖:

上表資料對應的Atlas和Mycat執行insert操作cpu消耗對比趨勢圖
上表資料對應的Atlas和Mycat執行insert操作cpu消耗對比趨勢圖
結合以上圖表和資料可以看出,當sysbench達到64執行緒出現拐點,Mycat的cpu消耗更大,通過jstack + top分析java程序消耗cpu最多執行緒(開源工具),原因為jvm內建執行緒消耗較大(gc等執行緒)

上表資料對應的Atlas和Mycat執行select操作cpu消耗對比趨勢圖
上表資料對應的Atlas和Mycat執行select操作cpu消耗對比趨勢圖
結合以上圖表和資料可以看出,雖然客戶端64執行緒壓測Atlas的吞吐量遠大於Mycat,但cpu消耗卻相近,Atlas相比Mycat消耗cpu少很多。

上表資料對應的Atlas和Mycat執行update操作cpu消耗對比趨勢圖
上表資料對應的Atlas和Mycat執行update操作cpu消耗對比趨勢圖
結合以上圖表和資料可以看出,當sysbench達到32執行緒出現拐點,Mycat的cpu消耗更大,通過jstack + top分析java程序消耗cpu最多執行緒(開源工具),原因為jvm內建執行緒消耗較大(gc等執行緒)

load負載趨勢圖

上表資料對應的Atlas和Mycat執行insert操作load負載對比趨勢圖
上表資料對應的Atlas和Mycat執行insert操作load負載對比趨勢圖
結合以上圖表和資料以及QPS、cpu綜合分析可以看出,當sysbench達到32執行緒出現拐點,rds遇到IOPS瓶頸,Atlas很多執行緒處於wait狀態,效能無法充分發揮,隨著客戶端執行緒增加,所以導致Atlas待排程執行的任務較多

上表資料對應的Atlas和Mycat執行select操作load負載對比趨勢圖
上表資料對應的Atlas和Mycat執行select操作load負載對比趨勢圖
同理select分析

上表資料對應的Atlas和Mycat執行update操作load負載對比趨勢圖
上表資料對應的Atlas和Mycat執行update操作load負載對比趨勢圖
同理select分析

mycat jvm監控

當Mycat用預設gc演算法時,用java提供視覺化工具jvisualvm,監控了jvm heap、cpu等情況,綜合分析轉發資料生命週期短,堆記憶體佔用較少,很少fullgc,在400w資料測試中也就出現1~2次fullgc,mingc相對較多,cpu波峰值地方是sysbench初始化時候發生的。

insert

select

update

綜合分析

本次測試時中介軟體執行緒數為機器4倍,基本能充分發揮中介軟體效能。從執行SQL型別、記錄請求響應耗時、cpu消耗、cpu load負載等多個維度綜合評估Atlas和Mycat的效能及吞吐量,最大限度保證資料和效能儘量接近真實值。在同等軟硬體環境下,Atlas能充分利用硬體資源,極限吞吐量為Mycat一倍以上(個人覺得25~40%比較正常,但是測試select確實大一倍),通過商業中介軟體OneProxy與Mycat對比,也可以作出印證,OneProxy測試報告地址。

OneProxy與Atlas一樣,用c語言開發

某Java類的Proxy,就是指的Mycat,因為平民軟體遷移了好幾個Mycat的客戶端

用sysbench測試的缺點就是模擬的表結構太簡單,而且每條記錄最大為200位元組,因此無法驗證gc對Mycat影響,400w資料操作過程中只有1~2次fullgc,如果真實環境中是不是資料量大些fullgc會頻繁些呢?

方案選型

關於中介軟體方案選型,要從多個維度考慮,例如效能和吞吐量、關鍵功能完善度,公司投入力量,單純從吞吐量考慮Atlas無疑勝出,如果自動化(運維化)、服務化、產品化角度考慮Mycat是必然選擇。不過Mycat優勢也明顯;

關於吞吐量和效能問題,Mycat雖然吞吐量較差,但線上一般都是通過中介軟體前面加一層lvs代理部署來做ha的,就是可以多部署Mycat例項彌補不足。

個人觀點:我沒有特定傾向,任意語言都可以,主要是結合公司業務場景、需求、功能要求、資源投入程度、緊急程度等綜合因素來做決定。如果這方面清晰了(方向和目標定了),就容易選擇了。

中介軟體上線準備工作

Atlas和Mycat測試的版本都支援分庫但不分表,一個數據庫只能建立一張表,但不支援單庫多表,如果業務需要支援分庫分表,就要在一個數據庫內可以切分多張表情況。上線需要適配改造,1.通過DBA運維手段解決 2.修改中介軟體程式碼實現單庫分表功能,二者選其一。

註明:Atlas開源有2個版本,一個版本支援只支援單庫分表,另外一個版本支援跨庫分表不支援單庫多表