很久沒上OSC,上面安排測下Mycat,因而申請服務器,花了兩個周作出這個東西,供以借鑑。mysql
MyCAT 是一個完全開源的,面向企業應用開發的「大數據庫集羣」 支持事務、ACID、能夠替代Mysql的增強版數據庫 。一個能夠視爲「Mysql」集羣的企業級數據庫,用來替代昂貴的Oracle集羣 。 一個融合內存緩存技術、Nosql技術、HDFS大數據的新型SQL Server ? 結合傳統數據庫和新型分佈式數據倉庫的新一代企業級數據庫產品 。 一個新穎的數據庫中間件產品。web
目標sql
低成本的將現有的單機數據庫和應用平滑遷移到「雲」端,解決數據存儲和業務規模迅速增加狀況下的數據瓶頸問題。數據庫
關鍵特性緩存
支持 SQL 92標準 支持Mysql集羣,能夠做爲Proxy使用 支持JDBC鏈接ORACLE、DB二、SQL Server,將其模擬爲MySQL Server使用 支持galera for mysql集羣,percona-cluster或者mariadb cluster,提供高可用性數據分片集羣,自動故障切換,高可用性 ,支持讀寫分離,支持Mysql雙主多從,以及一主多從的模式 ,支持全局表,數據自動分片到多個節點,用於高效表關聯查詢 ,支持獨有的基於E-R 關係的分片策略,實現了高效的表關聯查詢多平臺支持,部署和實施簡單。服務器
優點架構
基於阿里開源的Cobar產品而研發,Cobar的穩定性、可靠性、優秀的架構和性能,以及衆多成熟的使用案例使得MyCAT一開始就擁有一個很好的起點,站在巨人的肩膀上,咱們能看到更遠。普遍吸收業界優秀的開源項目和創新思路,將其融入到MyCAT的基因中,使得MyCAT在不少方面都領先於目前其餘一些同類的開源項目,甚至超越某些商業產品。MyCAT背後有一隻強大的技術團隊,其參與者都是5年以上資深軟件工程師、架構師、DBA等,優秀的技術團隊保證了MyCAT的產品質量。 MyCAT並不依託於任何一個商業公司,所以不像某些開源項目,將一些重要的特性封閉在其商業產品中,使得開源項目成了一個擺設。併發
測試目標負載均衡
爲驗證Mycat實際生產中是否可以如官方介紹所述可以處理億級數據,解決公司現有項目數據存儲操做性能問題,特進行Mycat基準測試,因爲mycat單庫與mysql單庫在各項指標基本一致,本測試主要測試mycat分片狀況下與mysql單庫的性能差別。本次測試主要目標以下:分佈式
一、測試分片後性能是否有提高
二、測試在1億數據量下的常規操做,是否快速有效。
三、測試Mycat性能是否隨Mysql實例數呈線性增加
預測結果
一、相對於單臺,分佈式mycat數據庫集羣響應時間應該大於單臺單庫的響應能力,但隨着數據增加,數據庫集羣響應時間基本不變,然後者則會發生極大的變化,應該成凸型增加。
二、單臺單庫狀況下,查詢性能應該隨數據量呈負增加。
三、Mycat管理下的mysql實例越多,性能提高越大。
指同時訪問服務器站點的連接數。
一次請求到請求完成消耗的時間,本文指的通常是平均響應時間。
一個系統吞吐量一般由QPS(TPS)、併發數兩個因素決定,每套系統這兩個值都有一個相對極限值,在應用場景訪問壓力下,只要某一項達到系統最高值,系統的吞吐量就上不去了,若是壓力繼續增大,系統的吞吐量反而會降低,緣由是系統超負荷工做,上下文切換、內存等等其它消耗致使系統性能降低。
Testtool是Mycat官方提供的一套測試工具。
4臺物理機每臺物理機運行兩個虛擬機,爲方便描述,mysql機器取名爲test_mysql_xx,mycat機器取名爲test_mycat_xx,xx爲ip最後一段,如下是詳細配置:
test_mysql_204
用途:mysql實例
CPU:服務器專用 Intel Xeon E5-2660(4核)
內存:8G
硬盤:100G
系統版本:CentOs6.6
IP:172.16.40.204
test_mysql_205
用途:mysql實例
CPU:服務器專用 Intel Xeon E5-2660(4核)
內存:8G
硬盤:100G
系統版本:CentOs6.6
IP:172.16.40.205
test_mysql_206
用途:mysql實例
CPU:服務器專用 Intel Xeon E5-2660(4核)
內存:8G
硬盤:100G
系統版本:CentOs6.6
IP:172.16.40.206
test_mysql_207
用途:mysql實例
CPU:服務器專用 Intel Xeon E5-2660(4核)
內存:8G
硬盤:100G
系統版本:CentOs6.6
IP:172.16.40.207
test_mysql_208
用途:mysql實例
CPU:服務器專用 Intel Xeon E5-2660(4核)
內存:8G
硬盤:100G
系統版本:CentOs6.6
IP:172.16.40.208
test_mysql_209
用途:mysql實例
CPU:服務器專用 Intel Xeon E5-2660(4核)
內存:8G
硬盤:100G
系統版本:CentOs6.6
IP:172.16.40.209
test_mycat_210
用途:mycat實例
CPU:服務器專用 Intel Xeon E5-2660(4核)
內存:8G
硬盤:100G
系統版本:CentOs6.6
IP:172.16.40.210
test_mycatweb_211
用途:mycat-web實例、性能測試
CPU:服務器專用 Intel Xeon E5-2660(4核)
內存:8G
硬盤:100G
系統版本:CentOs6.6
IP:172.16.40.211
JDK:1.7
Mycat:1.5.1
Mysql:5.7.11
爲了擴大報告適用範圍,設定表爲多字段大表,且不作任何優化,即不加索引、不創建主鍵等手段優化表結構,用以測試最低限數據。
CREATE TABLE `T_TEST_SINGLE_TABLE` ( `FACTID` int(10) NOT NULL COMMENT '終端廠商ID,主鍵,自動更新', `CNNAME` varchar(128) DEFAULT NULL COMMENT 'OEM廠商中文名稱', `ENNAME` varchar(128) DEFAULT NULL COMMENT 'OEM廠商英文名稱', `ABBRNAME` varchar(64) DEFAULT NULL COMMENT 'OEM名稱縮寫', `ACCOUNT` varchar(128) DEFAULT NULL COMMENT 'OEM管理帳號', `FACTDESC` varchar(255) DEFAULT NULL COMMENT 'OEM廠商介紹', `CONTACT` varchar(60) DEFAULT NULL COMMENT '聯繫人', `ADDRESS` varchar(160) DEFAULT NULL, `TELEPHONE` varchar(80) DEFAULT NULL, `EMAIL` varchar(160) DEFAULT NULL COMMENT '聯繫郵件', `SALENUM` int(10) unsigned DEFAULT NULL COMMENT '激活的數量', `TOTALVISIT` int(10) unsigned DEFAULT NULL COMMENT '累計訪問數量', `MALIVERATIO` int(10) unsigned DEFAULT NULL COMMENT '平均???活躍率', `DALIVERATIO` int(11) unsigned DEFAULT NULL COMMENT '平均日活躍率', `ALIVENUM` int(11) unsigned DEFAULT NULL COMMENT '最近1個月活躍量' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
每一個數據庫實例,創建5個片(庫)。由於經屢次實驗,單庫單表狀況下插入數據性能隨併發數呈凸型,最佳範圍在300到400之間,故而方案一及其餘方案對比並發設爲100、300。另外,1億數據並不會一次性插入,而是分5次,每次2000萬,以便記錄不一樣數據量下的數據插入性能。
本方案爲標準對比方案,是其餘全部方案測試指標的對比參照方案,但須要注意的是其餘方案並非徹底基於本方案的測試,本方案測試的全部結果只看成參照數據。
單獨數據庫實例上的單獨庫,而且單表。全部讀寫壓力直接施加到表上,但爲了追求極限數據準確性,讀寫互斥,同一時刻只能是讀或者是寫。
本方案單表數據高達1億,沒法進行如創建索引等手段,進而沒法得到優化後的參考數據。
併發數:100、300
數據量:100000000
數據庫:TESTDB
數據表:t_test_single_table
引用機器:test_mysql_204
拓撲圖:
測試命令:
插入: ./test_stand_insert_perf.sh jdbc:mysql://172.16.40.210:8066/TESTDB test test 100 file=mydata-create.sql ./test_stand_insert_perf.sh jdbc:mysql://172.16.40.210:8066/TESTDB test test 300 file=mydata-create.sql 查詢: ./test_stand_select_perf.sh jdbc:mysql://172.16.40.210:8066/TESTDB test test 10 100 file=mysql-select.sql |
本方案中,爲了節約資源,將方案一用到的機器做廢,從新規劃定位。test_mysql_204爲主庫,test_mysql_205爲從庫,作數據同步。同時主從庫都會包含7個database,用做mycat的分片。
本方案單表數據高達2000萬,沒法進行如創建索引等手段,進而沒法得到優化後的參考數據。
併發數:100、300
數據量:100000000
數據庫:TESTDB
數據表:t_test_single_table
引用機器:test_mysql_20四、test_mysql_20五、test_mycat_210
拓撲圖:
測試命令:
插入: ./test_stand_insert_perf.sh jdbc:mysql://172.16.40.210:8066/TESTDB test test 100 file=mydata-create.sql ./test_stand_insert_perf.sh jdbc:mysql://172.16.40.210:8066/TESTDB test test 300 file=mydata-create.sql 查詢: ./test_stand_select_perf.sh jdbc:mysql://172.16.40.210:8066/TESTDB test test 10 100000 file=mysql-select.sql |
本方案中,test_mysql_20四、test_mysql_20六、test_mysql_208爲主庫,test_mysql_20五、test_mysql_20七、test_mysql_209爲從庫,作數據同步。同時主從庫都會包含7個database,用做mycat的分片,共計21個分片。
併發數:100、300
數據量:100000000
數據庫:TESTDB
數據表:t_test_single_table
引用機器:test_mysql_20四、test_mysql_20五、test_mysql_20六、test_mysql_20七、test_mysql_20八、test_mysql_20九、test_mycat_210
拓撲圖:
測試命令:
插入: ./test_stand_insert_perf.sh jdbc:mysql://172.16.40.210:8066/TESTDB test test 100 file=mydata-create.sql ./test_stand_insert_perf.sh jdbc:mysql://172.16.40.210:8066/TESTDB test test 300 file=mydata-create.sql 查詢: ./test_stand_select_perf.sh jdbc:mysql://172.16.40.210:8066/TESTDB test test 10 100000 file=mysql-select.sql |
插入數據:
併發數 |
記錄數 |
QPS(TPS) |
100
|
20000000 |
20343.8103956871 |
40000000 |
20531.7729185915 |
|
60000000 |
19415.5907193476 |
|
80000000 |
19529.3428376135 |
|
100000000 |
17951.709900368 |
|
平均QPS(TPS) |
19554.44535 |
|
300 |
20000000 |
20343.8103956871 |
40000000 |
20831.163420477 |
|
60000000 |
19819.6412644931 |
|
80000000 |
19529.3428376135 |
|
100000000 |
19510.2916788606 |
|
平均QPS(TPS) |
20006.84992 |
查詢數據:
記錄數 |
查詢次數 |
平均查詢時間(ms) |
QPS(TPS) |
100000000 |
1000 |
>1h |
≈0 |
圖表對比:
一、插入數據:本方案不一樣併發數對比圖
小結:
數據從0到2000萬區間,QPS(TPS)均呈線性增加,2000萬後,均開始降低,但300鏈接相對100鏈接降低趨勢較緩,而且在8000萬數據時,QPS(TPS)重疊,但繼續增長數據100鏈接開始急劇降低,而300鏈接則基本保持不變。因而可知不一樣鏈接數QPS(TPS)並非徹底相同的,相對來講最佳鏈接數區間可以得到相對穩定的QPS(TPS)值。
插入數據:
併發數 |
記錄數 |
QPS(TPS) |
100
|
20000000 |
7862.800303 |
40000000 |
7701.560761 |
|
60000000 |
7448.411937 |
|
80000000 |
7388.409909 |
|
100000000 |
7097.183579 |
|
平均QPS(TPS) |
7499.673298 |
|
300 |
20000000 |
8565.892935 |
40000000 |
8230.113987 |
|
60000000 |
7936.193008 |
|
80000000 |
7504.40884 |
|
100000000 |
7288.364127 |
|
平均QPS(TPS) |
7904.994579 |
查詢數據:
記錄數 |
查詢次數 |
平均查詢時間(ms) |
QPS(TPS) |
100000000 |
1000 |
>1h |
≈0 |
圖表對比:
一、插入數據:本方案不一樣併發數對比圖
二、插入數據:對比方案一100併發數對比圖
三、插入數據:對比方案一300併發數對比圖
四、插入數據:對比方案一不一樣併發數對比圖
五、查詢數據:對比方案一對比圖
小結:
因爲將單庫單表獨佔整個數據庫的資源平分5份,再加上mycat路由,在數據插入性能上對比方案一,本方案中不管100併發仍是300併發所得到的性能都相對較低。但從總體趨勢上(數據量從0到1億)對比,不管方案一仍是方案二都相對平緩,不過從mycat原理上能夠推測方案二的趨勢穩定性要強於方案一,同時在本方案中不一樣併發數相比也沒有太大差異。最後在查詢性能上,因爲表並無設置索引,得到的查詢性能同方案一併沒有差異,QPS(TPS)都約爲0。
因而可知,Mycat只配置1臺寫庫一臺讀庫的狀況下,由於資源被平分,並不能發揮出Mycat的能力,這種架構只能用於開發和測試。
插入數據:
併發數 |
記錄數 |
QPS(TPS) |
100
|
20000000 |
12375.47181 |
40000000 |
12483.61525 |
|
60000000 |
12398.48738 |
|
80000000 |
12514.8614 |
|
100000000 |
12421.58872 |
|
平均QPS(TPS) |
12438.80491 |
|
300 |
20000000 |
13260.73179 |
40000000 |
13357.20955 |
|
60000000 |
13188.81686 |
|
80000000 |
13234.60962 |
|
100000000 |
13210.78072 |
|
平均QPS(TPS) |
13250.42971 |
查詢數據:
記錄數 |
查詢次數 |
平均查詢時間(ms) |
QPS(TPS) |
是否添加索引 |
100000000 |
1000 |
6840.26 |
1.46 |
否 |
100000000 |
1000 |
3.27 |
3027.02 |
是 |
圖表對比:
一、本方案不一樣併發數對比圖
二、對比方案一100併發數對比圖
三、對比方案一300併發數對比圖
四、對比方案二100併發數對比圖
五、對比方案二300併發數對比圖
六、對比方案1、二不一樣併發數對比圖
七、查詢數據:對比方案二對比圖
八、查詢數據:對比方案1、二對比圖
小結:
對比方案一,插入性能依然由於資源平分問題不如方案一,但差距不是很大。而在查詢性能則表現突出,未優化前的數據大表查詢平均響應在6秒,而加了索引以後,平均響應爲3.27毫秒,QPS(TPS)高達3027.02,查詢性能遠遠超過方案一。
對比方案二,插入性能大大提高,也證實了測試目標3,即Mycat性能隨Mysql實例數呈線性增加。而在查詢上,同方案一同樣,本方案查詢性能遠遠超過方案二。
在報告中。
方案一用來測試出參照數據,爲其餘方案提供一個數據參考。
方案二用來測試最小化mycat集羣下的性能,即對比方案一,又對比其餘方案,起到一個承上啓下的做用,同時也能在方案二中能夠看到mycat性能的一角。
方案三是最核心的測試,測試生產環境下最小mycat集羣的性能,經過對比方案一方案二,來驗證方案三所屬架構是否可以承受足夠量的壓力和持續運行的穩定力。
經過本報告能夠總結出以下觀點:
一、分片後性能有提高;
二、方案三架構下,1億數據量下的常規操做,快速有效。
三、Mycat性能隨Mysql實例數呈線性增加
四、單mysql實例上的插入性能會被平分(分片狀況下),分片越多,每一個片得到的資源越少,減小片數增長mysql實例數能夠快速提高性能。
五、mycat性能隨併發數呈凸型增加,合理控制併發數、mycat負載均衡等可以使mycat發揮出最大性能。
六、分片狀況下,單表數據越少插入和查詢性能越大,推薦單表數據量不加索引500萬左右,加索引1000萬左右,單mysql實例5個片(庫),而後根據預算總數據量計算須要mysql實例數。
七、合理使用mycat配置,縮短查詢範圍(如E-R表),可以提高mycat性能(本報告暫未驗證,但從原理上推測是正確的)。