Mycat对于导入和扩容迁移性能压测
Mycat對于導(dǎo)入和擴容遷移性能壓測
1.??????測試環(huán)境
?
1.1.??? 硬件環(huán)境
機器ip | OS | CPU | CPU Processors | 內(nèi)存 |
172.16.54.135 | CentOS Linux release 7.1.1503 | Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz | 24 | 64G |
172.16.54.136 | CentOS Linux release 7.1.1503 | Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz | 24 | 64G |
172.16.54.138 | CentOS Linux release 7.1.1503 | Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz | 24 | 64G |
1.2.??? 軟件環(huán)境
軟件名稱 | 版本 |
Jdk | 1.8.0_45 |
Mycat | 1.4.1 |
Mysql | 5.6 |
PostgreSQL | 9.2.14 |
?
2.??????對于Mysql壓測
2.1.??? 基本配置
wrapper.conf
schema.xml
數(shù)據(jù)庫腳本
2.2.??? 導(dǎo)入方案
由于Mycat支持Mysql協(xié)議,所以Mycat對于Mysql數(shù)據(jù)導(dǎo)入方案有三種:
用jdbc直接進(jìn)行insert操作
根據(jù)官網(wǎng)測試結(jié)果:在16核上insert性能可以達(dá)到12w/s
本輪測試數(shù)據(jù)量200w,測試工具為testtool.tar.gz。結(jié)論:tps約8w
用mysqldump操作
mysqldump操作原理與insert相同,數(shù)據(jù)量100w,沒有預(yù)熱。結(jié)論tps:3w
用load data infile操作
官網(wǎng)說法:是insert性能的幾十倍,如下
Load data功能在1.4版本+支持,經(jīng)過測試發(fā)現(xiàn),如果導(dǎo)入數(shù)據(jù)量比較大(大于10w),則會出現(xiàn)文件找不到情況,官網(wǎng)群中有人出現(xiàn)同樣問題,原因待查。
根據(jù)其他人測試結(jié)果:loaddata local infile命令64M23萬條數(shù)據(jù)用到500多M內(nèi)存
2.3.? 擴容遷移方案
從schema db1遷移擴容到db2。由于mycql不支持自動擴容,所以需要手動進(jìn)行rehash。
目前方案有:
將數(shù)據(jù)導(dǎo)出本分,清空數(shù)據(jù),通過上述導(dǎo)入方案的三種方式進(jìn)行擴容遷移
性能結(jié)果如上測試
手動遷移(注意:此方案只適合單節(jié)點遷移):
1)????????使用mycat的RehashLauncher重新進(jìn)行hash算法,得出rehash的id列表
2)????????在mysql上使用mysqldump根據(jù)rehash的id列表,導(dǎo)出數(shù)據(jù)
3)????????在mycat上mysqldump,導(dǎo)入數(shù)據(jù)
4)????????在mysql上刪除遷移的數(shù)據(jù)
對于1)步驟,有2個bug:
取得id值時錯誤
此bug已經(jīng)提交到mycate1.4和mycat master分支,并已合并
hash后的host比較錯誤
此bug已經(jīng)提交到1.4分支,并已合并
???????? 對于2),3),4)步驟可以采用shell腳本自動運行,官網(wǎng)腳本如下:
#?arg1=start,?arg2=end,?format:?%s.%N?? function?getTiming()?{start=$1end=$2start_s=$(echo$start?|?cut?-d?'.'?-f?1)start_ns=$(echo$start?|?cut?-d?'.'?-f?2)end_s=$(echo?$end?|cut?-d?'.'?-f?1)end_ns=$(echo?$end?|cut?-d?'.'?-f?2)time=$((?(?10#$end_s-?10#$start_s?)?*?1000?+?(?10#$end_ns?/?1000000?-?10#$start_ns?/?1000000?)?))echo?"$timems"?? }#rehash節(jié)點 rehashNode=$1 #mycat節(jié)點 expanNode=$2 #遷移數(shù)據(jù) order_fn="$3"#遷移數(shù)據(jù)庫 rehash_db=db1 #遷移表 rehash_table=user#mysql配置 mysql_port=3306 mysql_user=test mysql_pwd=test#mycat配置 mycat_port=8066 mycat_user=mysql mycat_pwd=123456 mycat_db=testdbstart=$(date?+%s.%N)if?[?"$#"?=?"0"?];?then echo?"Please?input?parameter,?for?example:" echo?"ReRouter.sh?192.168.84.13?192.168.84.14/home/mycat/T_CMS_ORDER" echo?"?" exit fi; echo?"需要進(jìn)行遷移的主機總量為:$#,?主機?IP?列表如下:" for?i?in?"$@" do echo?"$i" done echo?"?" #取出?rehash?需要的?SerNum(已經(jīng)用?in?拼接好) for?n?in?`cat?$order_fn` do condOrder=$n doneecho?"*************?導(dǎo)出?*************" date #?1)?首先調(diào)用?mysqldump?進(jìn)行數(shù)據(jù)導(dǎo)出 echo?"開始導(dǎo)出主機:$?表:T_CMS_ORDER." mysqldump?-h$rehashNode?-P$mysql_port?-u$mysql_user-p$mysql_pwd?$rehash_db?$rehash_table?--default-characterset=utf8?--extende d-insert=false?--no-create-info?--add-locks=false--completeinsert?--where="?id?in?$condOrder?"?>./T_CMS_ORDER_temp.sql echo?"導(dǎo)出結(jié)束." echo?"?"echo?"*************?導(dǎo)入?*************" date #?2)?調(diào)用?mycat?接口進(jìn)行數(shù)據(jù)導(dǎo)入 echo?"開始導(dǎo)入?T_CMS_ORDER?表數(shù)據(jù)" mysql?-h$expanNode?-P$mycat_port?-u$mycat_user?-p$mycat_pwd$mycat_db?--default-character-set=utf8?<?./T_CMS_ORDER_temp.sql echo?"導(dǎo)入結(jié)束." echo?"?"echo?"*************?刪除數(shù)據(jù)?*************" date #?3)?當(dāng)前兩步都無誤的情況下,刪除最初的導(dǎo)出數(shù)據(jù). echo?"開始刪除已導(dǎo)出的數(shù)據(jù)表:." mysql?-h$rehashNode?-Pmycat_port?-u$mysql_user-p$mysql_pwd??-e?"use?$rehash_db;DELETE?FROM?$rehash_table WHERE?id?in?$condOrder?;?commit;?" echo?"刪除結(jié)束." echo?"?" echo?"*************?清空臨時文件?*************" date #?4)?清空臨時文件 rm?./T_CMS_ORDER_temp.sql echo?"清空臨時文件" echo?"#####################主機:$rehashNode?處理完成#####################" date echo?"?"echo?"ReHash?運行完畢."end=$(date?+%s.%N) getTiming?$start?$end此腳本運行1)執(zhí)行的文件,會報如下錯誤:
這是由于1)會一次性根據(jù)id列表,采用in語句查詢出所有數(shù)據(jù),當(dāng)數(shù)據(jù)量過大時,報錯。本輪測試采用優(yōu)化方案:
1)步驟每1w為一行
RehashLauncher代碼如下:
public?class?RehashLauncher?{private?final?class?RehashRunner?implements?Runnable?{private?final?File???output;private?final?String?table;private?RehashRunner(File?output,?String?table)?{this.output?=?output;this.table?=?table;}public?void?run(){int?pageSize=500;int?page=0;List<Map<String,?Object>>?list=null;int?total=0;int?rehashed=0;String?hostWithDatabase=args.getHostWithDatabase();PrintStream?ps=null;try?{ps=new?PrintStream(output);StringBuilder?rehashData?=?new?StringBuilder();list?=?JdbcUtils.executeQuery(dataSource,?"select?"+?args.getShardingField()?+?"?from?"?+?table?+?"?limit??,?",?page++?*?pageSize,pageSize);while?(!CollectionUtil.isEmpty(list))?{for(int?i=0,l=list.size();i<l;i++){Map<String,?Object>?sf=list.get(i);Integer?hash=alg.calculate(sf.get(args.getShardingField()).toString());String?host=rehashHosts[hash];total++;if(!host.equals(hostWithDatabase)){rehashed++;rehashData.append(sf.get(args.getShardingField())).append(",");if(rehashed?%?10000?==?0){ps.println("("?+?rehashData.substring(0,?rehashData.length()?-?1)?+?")");rehashData.delete(0,?rehashData.length());}} //????????????????????????ps.println(sf+"=>"+host);}list?=?JdbcUtils.executeQuery(dataSource,?"select?"+?args.getShardingField()?+?"?from?"?+?table?+?"?limit??,?",?page++?*?pageSize,pageSize);}if(rehashData.length()?>=?1){ps.println("("?+?rehashData.deleteCharAt(rehashData.length()?-?1)?+?")");} //????????????????ps.println("rehashed?ratio:"+(((double)rehashed)/total));}?catch?(Exception?e)?{throw?new?RehashException(e);}finally{if(ps!=null){ps.close();}latch.countDown();}}}program argument:
-jdbcDriver=com.mysql.jdbc.Driver?-jdbcUrl=jdbc:mysql://172.16.54.136:3306/db1?-host=172.16.54.136:3306?-user=test?-database=db1?-password=test?-tablesFile=F:/certusnetSVN/books/mycat/rehash\tables.txt?-shardingField=id?-rehashHostsFile=F:/certusnetSVN/books/mycat/rehash/hosts.txt?-hashType=mod?-rehashNodeDir=F:/certusnetSVN/books/mycat/rehash/tmphosts.txt配置:
172.16.54.136:3306/db1 172.16.54.138:3306/db1 172.16.54.136:3306/db2 172.16.54.138:3306/db2tables.txt配置:
user2),3),4)腳本改為shell多線程,每次處理一行的方案
腳本如下:
#?arg1=start,?arg2=end,?format:?%s.%N?? function?getTiming()?{start=$1end=$2start_s=$(echo?$start?|?cut?-d?'.'?-f?1)start_ns=$(echo?$start?|?cut?-d?'.'?-f?2)end_s=$(echo?$end?|?cut?-d?'.'?-f?1)end_ns=$(echo?$end?|?cut?-d?'.'?-f?2)time=$((?(?10#$end_s?-?10#$start_s?)?*?1000?+?(?10#$end_ns?/?1000000?-?10#$start_ns?/?1000000?)?))echo?"$time?ms"?? }#rehash節(jié)點 rehashNode=$1 #mycat節(jié)點 expanNode=$2 #遷移數(shù)據(jù) order_fn="$3"#遷移數(shù)據(jù)庫 rehash_db=db1 #遷移表 rehash_table=user#mysql配置 mysql_port=3306 mysql_user=test mysql_pwd=test#mycat配置 mycat_port=8066 mycat_user=mysql mycat_pwd=123456 mycat_db=testdbtotal_start=$(date?+%s.%N)if?[?"$#"?=?"0"?];?then echo?"Please?input?parameter,?for?example:" echo?"ReRouter.sh?192.168.84.13?192.168.84.14?/home/mycat/T_CMS_ORDER" echo?"?" exit fi; echo?"需要進(jìn)行遷移的主機總量為:$#,?主機?IP?列表如下:" for?i?in?"$@" do echo?"$i" done echo?"?" #取出?rehash?需要的?SerNum(已經(jīng)用?in?拼接好) while?read?condOrder do { file_id=${condOrder:3:10} echo?"*************?導(dǎo)出?*************" date #?1)?首先調(diào)用?mysqldump?進(jìn)行數(shù)據(jù)導(dǎo)出 echo?"開始導(dǎo)出主機:$?表:T_CMS_ORDER." mysqldump?-h$rehashNode?-P$mysql_port?-u$mysql_user?-p$mysql_pwd?$rehash_db?$rehash_table?--no-create-info?--skip-add-locks?-c --where="?id?in?$condOrder?"?>?./T_CMS_ORDER_$file_id.sql echo?"導(dǎo)出結(jié)束." echo?"?"echo?"*************?導(dǎo)入?*************" date #?2)?調(diào)用?mycat?接口進(jìn)行數(shù)據(jù)導(dǎo)入 echo?"開始導(dǎo)入?T_CMS_ORDER?表數(shù)據(jù)" mysql?-h$expanNode?-P$mycat_port?-u$mycat_user?-p$mycat_pwd?-D$mycat_db?<?./T_CMS_ORDER_$file_id.sql echo?"導(dǎo)入結(jié)束." echo?"?"echo?"*************?刪除數(shù)據(jù)?*************" date #?3)?當(dāng)前兩步都無誤的情況下,刪除最初的導(dǎo)出數(shù)據(jù). echo?"開始刪除已導(dǎo)出的數(shù)據(jù)表:." mysql?-h$rehashNode?-Pmycat_port?-u$mysql_user?-p$mysql_pwd??-e?"use?$rehash_db;?DELETE?FROM?$rehash_table WHERE?id?in?$condOrder?;?commit;?" echo?"刪除結(jié)束." echo?"?" echo?"*************?清空臨時文件?*************" date #?4)?清空臨時文件 rm?./T_CMS_ORDER_$file_id.sql echo?"清空臨時文件" echo?"#####################主機:$rehashNode?處理完成#####################" date echo?"?"echo?"ReHash?運行完畢." }& done?<?$order_fn waitecho?"操作總消耗時長:" total_end=$(date?+%s.%N) getTiming?$total_start?$total_end執(zhí)行結(jié)果100w遷移,耗時約:20s
?
3.??????對于postgresql壓測
3.1.? 基本配置
schema.xml
postgresql.conf
數(shù)據(jù)庫腳本
3.2.? 導(dǎo)入方案
Mycat對于postgresql的導(dǎo)入方案只有一種,采用jdbc的insert方式。
本輪測試數(shù)據(jù)量100w,測試工具為testtool.tar.gz。結(jié)論:tps約6w
?
3.3.? 擴容遷移方案
對于postgresql遷移,也只能采用編程程序的方式進(jìn)行,方案可以參考mysql遷移方案,此輪不再測試。
轉(zhuǎn)載于:https://blog.51cto.com/eric100/1723079
總結(jié)
以上是生活随笔為你收集整理的Mycat对于导入和扩容迁移性能压测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转载]基于MVC4+EasyUI的We
- 下一篇: iOS一些推荐的学习路径发展