日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Mycat对于导入和扩容迁移性能压测

發(fā)布時間:2024/4/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mycat对于导入和扩容迁移性能压测 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

#?Java?AdditionalParameters #wrapper.java.additional.1= wrapper.java.additional.1=-DMYCAT_HOME=. wrapper.java.additional.2=-server wrapper.java.additional.3=-XX:MaxPermSize=64M wrapper.java.additional.4=-XX:+AggressiveOpts wrapper.java.additional.5=-XX:MaxDirectMemorySize=5G wrapper.java.additional.6=-Dcom.sun.management.jmxremote wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1984 wrapper.java.additional.8=-Dcom.sun.management.jmxremote.authenticate=false wrapper.java.additional.9=-Dcom.sun.management.jmxremote.ssl=false #?Initial?JavaHeap?Size?(in?MB) #wrapper.java.initmemory=3 wrapper.java.initmemory=3072 #?Maximum?JavaHeap?Size?(in?MB) #wrapper.java.maxmemory=64 wrapper.java.maxmemory=3072
  • schema.xml

<schemaname="testdb"?checkSQLschema="false"sqlMaxLimit="100"><table?name="user"dataNode="dn1,dn2"?rule="mod-long"/></schema><dataNode?name="dn1"dataHost="mycat"?database="db1"/><dataNode?name="dn2"dataHost="mycat2"?database="db1"/><dataHost?name="mycat"maxCon="1000"?minCon="10"?balance="0"writeType="0"?dbType="mysql"?dbDriver="native"switchType="1"><heartbeat>selectuser()</heartbeat><writeHosthost="host1"?url="dev-2:3306"?user="test"password="test"/></dataHost><dataHost?name="mycat2"maxCon="1000"?minCon="10"?balance="0"writeType="0"?dbType="mysql"?dbDriver="native"switchType="1"><heartbeat>selectuser()</heartbeat><writeHosthost="host2"?url="dev-3:3306"?user="test"password="test"/></dataHost>
  • 數(shù)據(jù)庫腳本

create?databasedb1; create?tabledb1.user(id?int,?user_name?varchar(20),?email?varchar(20),?phone?varchar(20));

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é)論:tps8w

  • mysqldump操作

  • mysqldump操作原理與insert相同,數(shù)據(jù)量100w,沒有預(yù)熱。結(jié)論tps3w

  • 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ù)用到500M內(nèi)存


    2.3.? 擴容遷移方案

    schema db1遷移擴容到db2。由于mycql不支持自動擴容,所以需要手動進(jìn)行rehash。

    目前方案有:

  • 將數(shù)據(jù)導(dǎo)出本分,清空數(shù)據(jù),通過上述導(dǎo)入方案的三種方式進(jìn)行擴容遷移

  • 性能結(jié)果如上測試

  • 手動遷移(注意:此方案只適合單節(jié)點遷移):

  • 1)????????使用mycatRehashLauncher重新進(jìn)行hash算法,得出rehashid列表

  • 2)????????mysql上使用mysqldump根據(jù)rehashid列表,導(dǎo)出數(shù)據(jù)

  • 3)????????mycatmysqldump,導(dǎo)入數(shù)據(jù)

  • 4)????????mysql上刪除遷移的數(shù)據(jù)

  • 對于1)步驟,有2bug

    • 取得id值時錯誤

    bug已經(jīng)提交到mycate1.4mycat 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/tmp

    hosts.txt配置:

    172.16.54.136:3306/db1 172.16.54.138:3306/db1 172.16.54.136:3306/db2 172.16.54.138:3306/db2

    tables.txt配置:

    user
    • 2),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

    <schemaname="testdb"?checkSQLschema="false"sqlMaxLimit="100"><tablename="user_test"?dataNode="dn1,dn2"rule="mod-long"/></schema><dataNode?name="dn1"dataHost="mycat"?database="db1"/><dataNode?name="dn2"dataHost="mycat2"?database="db1"/><dataHost?name="mycat"maxCon="1000"?minCon="10"?balance="0"writeType="0"?dbType="postgresql"?dbDriver="jdbc"switchType="1"><heartbeat>select1</heartbeat><writeHosthost="host1"?url="jdbc:postgresql://dev-2:5432/db1"user="postgres"?password="123456"/></dataHost><dataHost?name="mycat2"maxCon="1000"?minCon="10"?balance="0"writeType="0"?dbType="postgresql"?dbDriver="jdbc"switchType="1"><heartbeat>select1</heartbeat><writeHosthost="host2"?url="jdbc:postgresql://dev-3:5432/db1"user="postgres"?password="123456"/></dataHost>
    • postgresql.conf

    shared_buffers?=?128MB max_connections?=?1000 fsync?=?off wal_buffers?=?-1 commit_delay?=?10000 commit_siblings?=?500
    • 數(shù)據(jù)庫腳本

    create?databasedb1; create?table?user_test(idint,?user_name?varchar(20),?email?varchar(20),?phone?varchar(20));

    3.2.? 導(dǎo)入方案

    Mycat對于postgresql的導(dǎo)入方案只有一種,采用jdbcinsert方式。

    本輪測試數(shù)據(jù)量100w,測試工具為testtool.tar.gz。結(jié)論:tps6w

    ?

    3.3.? 擴容遷移方案

    對于postgresql遷移,也只能采用編程程序的方式進(jìn)行,方案可以參考mysql遷移方案,此輪不再測試。


    轉(zhuǎn)載于:https://blog.51cto.com/eric100/1723079

    總結(jié)

    以上是生活随笔為你收集整理的Mycat对于导入和扩容迁移性能压测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。