10余年的彭州網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整彭州建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“彭州網(wǎng)站設(shè)計(jì)”,“彭州網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
本文主要給大家介紹mycat功能測(cè)試簡(jiǎn)析,希望可以給大家補(bǔ)充和更新些知識(shí),如有其它問(wèn)題需要了解的可以持續(xù)在創(chuàng)新互聯(lián)行業(yè)資訊里面關(guān)注我的更新文章的。
前言
Mycat是業(yè)內(nèi)知名MySQL數(shù)據(jù)庫(kù)中間件,其功能在各種mysql中間件中是比較豐富的.而mycat相關(guān)組件由java語(yǔ)言編寫,部署方便.他的功能有:不透明代理,讀寫分離,負(fù)載均衡,數(shù)據(jù)分片等.而且因?yàn)槠涞讓舆B接方式是用java的jdbc組件來(lái)連接數(shù)據(jù)庫(kù)的,所以理論上是支持sql server,oracle,pgsql的,但是功能上主要集中在mysql上.
優(yōu)點(diǎn):部署簡(jiǎn)單,功能強(qiáng)大,靈活性高,彌補(bǔ)mysql的一些功能缺失
缺點(diǎn):功能開(kāi)發(fā)不算十分完善,需要注意踩坑
如果按原理來(lái)說(shuō),mycat如果不做分片,純粹只是代理的話,他所做的事情,其實(shí)更多的是數(shù)據(jù)轉(zhuǎn)發(fā),而這個(gè)轉(zhuǎn)發(fā)能力,當(dāng)然就是看他能有多強(qiáng).
既然理論上轉(zhuǎn)發(fā)能力很強(qiáng),那么是不是就可以忽略不計(jì)呢,當(dāng)然不是,所以需要用直連mysql的測(cè)試數(shù)據(jù)來(lái)做對(duì)比.
測(cè)試前準(zhǔn)備
云服務(wù)器配置為32核cpu(虛擬化后的數(shù)值,算上超線程),120G內(nèi)存,16000iops的存儲(chǔ)設(shè)備,具體分配情況:
10.21.128.156:mycat1.6.5,sysbench0.4
10.21.128.157:mysql5.7.20主庫(kù)
10.21.128.158:mysql5.7.20從庫(kù)1
10.21.128.159:mysql5.7.20從庫(kù)2
簡(jiǎn)單說(shuō)明拓?fù)潢P(guān)系:

第一步當(dāng)然是安裝好mysql,這里就不詳細(xì)介紹怎么安裝了,但是,my.cnf的參數(shù)是有些變化的,主要原因是要適應(yīng)高并發(fā)壓測(cè)環(huán)境,不然就被參數(shù)限制,然后程序退出.當(dāng)然了,如果你想盡量模擬線上環(huán)境,那這些限制你得思考在內(nèi),更改就需要謹(jǐn)慎一些,我這里只是給出一例來(lái)參考.
#首先,就是要把系統(tǒng)的連接數(shù)和打開(kāi)文件數(shù)搞起來(lái) ulimit -SHn 65535 #想永久生效就要這樣 echo " * soft nofile 65535 * hard nofile 65535 root soft nofile 65535 root hard nofile 65535 " >> /etc/security/limits.conf
然后,更改mysql配置文件參數(shù),其他buffer_pool什么的就不列出來(lái)了,請(qǐng)各自看情況設(shè)置,這里只說(shuō)明涉及壓測(cè)相關(guān)的參數(shù).
#打開(kāi)配置文件 vim /usr/local/mysql/my.cnf #其他參數(shù)我們暫時(shí)忽略,只看這些關(guān)乎壓測(cè)的參數(shù) [mysqld] #每臺(tái)機(jī)都需要不一樣的ID,主從環(huán)境下 server-id = 128157 #全局最大打開(kāi)文件數(shù),不可以超過(guò)系統(tǒng)設(shè)定的最大文件數(shù),不然無(wú)效 open_files_limit = 65530 #innodb引擎限制一次打開(kāi)表空間文件.ibd的文件描述符數(shù)量 innodb_open_files = 65530 #允許存到緩存里的表的句柄數(shù)量,壓測(cè)自然要打開(kāi)很多表,設(shè)大一點(diǎn)就對(duì)了,受系統(tǒng)limit和上面兩個(gè)參數(shù)一起限制 table_open_cache = 65000 #實(shí)例可用最大連接數(shù),必須設(shè)置足夠大,不然連接數(shù)超出限制,測(cè)著報(bào)錯(cuò)不通就麻煩了,最少也比你實(shí)際要用到的多三分一 max_connections=30000 #最大每用戶連接數(shù),限制每個(gè)用戶最大連接數(shù),一定要比上面少一點(diǎn) max_user_connections=20000 #最大數(shù)據(jù)包大小,做壓測(cè)改大一點(diǎn)還是有必要 max_allowed_packet = 128M #限制了同一時(shí)間在mysqld上所有session中prepared 語(yǔ)句的上限,平時(shí)不用理這個(gè)參數(shù),但是壓測(cè)就需要調(diào)大一點(diǎn) max_prepared_stmt_count=100000
其他參數(shù)我就不一一列舉,自己看情況來(lái)設(shè)置就行,然后,重啟生效待命.
軟件安裝
先說(shuō)說(shuō)壓測(cè)工具的選擇問(wèn)題,在MySQL協(xié)議上Mycat不兼容tpcc,所以放棄tpcc。然后sysbench2.0對(duì)mycat兼容也比較欠佳,不明原因壓測(cè)失敗次數(shù)多,所以也只能放棄.
最后選定sysbench0.4和0.5來(lái)使用,可以順利測(cè)出結(jié)果,而且從壓測(cè)的原理來(lái)說(shuō)也比較客觀.
所以,我們需要安裝的軟件有:mysql(默認(rèn)已裝),mycat,sysbench0.4或0.5
mysql怎么安裝和授權(quán)什么的,這里就不細(xì)說(shuō)了,還請(qǐng)各位自己搭建好,配置文件就上面提到的要加上一下.
安裝mycat:
1)搭建jdk環(huán)境
由于mycat是java程序,所以需要安裝JDK,版本至少要jdk1.6以上,
下載java語(yǔ)言程序包,
Java的下載地址一直在變,所以最好自己上去看著來(lái)下載
http://download.oracle.com/otn-pub/java/jdk/8u151-b12/e758a0de34e24606bca991d704f6dcbf/jdk-8u151-linux-x64.tar.gz?AuthParam=1513326216_bcf60226458d67751e1d8d1bbe6689b4
#下載好安裝包后,解壓創(chuàng)建軟連接 tar xf jdk-8u144-linux-x64.tar.gz mv jdk1.8.0_144/ /usr/local/ ln -sf jdk1.8.0_144/ jdk #創(chuàng)建環(huán)境變量 vim /etc/profile.d/java.sh export JAVA_HOME=/usr/local/jdk export JRE_HOME=/usr/local/jdk/jre export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib export PATH=$PATH:$JAVA_HOME/bin #重載環(huán)境變量 source /etc/profile #驗(yàn)證安裝 java -version java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01) Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
安裝完成,可以使用.
2)安裝配置mycat
了解java程序的同學(xué)應(yīng)該知道,java程序只要配置好,直接啟動(dòng)就能用,所以沒(méi)有安裝的概念,直接將mycat配置做好就可以用.
我們下載mycat1.6.5的版本,這是最新正式版
http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
#解壓安裝包 tar xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz #移到目的位置 mv mycat1.6.5 /usr/local/ #創(chuàng)建軟連接 ln -sf mycat1.6.5/ mycat #把命令也做軟連接 ln -sf /usr/local/mycat/bin/* /usr/bin/
然后就可以開(kāi)始改配置文件了
這里sysbench的測(cè)試沒(méi)有涉及分庫(kù)分表,所以mycat只需要設(shè)置server.xml和schema.xml即可,具體mycat存放路徑?jīng)]規(guī)定,我將他放在/usr/local了.
==============================分割線開(kāi)始==============================
有的人可能會(huì)疑惑,mycat支持分庫(kù)分表,那么壓測(cè)可不可以針對(duì)分庫(kù)分表進(jìn)行呢?其實(shí)理論上是可行的,有意向做分庫(kù)分表壓測(cè)的就要把數(shù)據(jù)做一些處理,按照sysbench原理來(lái)說(shuō)是可行的,他測(cè)試的表的數(shù)量是可控的,你把帶數(shù)字編號(hào)的表通過(guò)邏輯庫(kù)處理可以集合成一個(gè)新的邏輯表.
==================分割線結(jié)束==========================================
先看基本環(huán)境設(shè)置server.xml,大部分設(shè)置都可以不動(dòng),注意添加修改的是<system>標(biāo)簽下面配置就可以了,每創(chuàng)建一個(gè)用戶<user>是要另外起標(biāo)簽:
vim /usr/local/mycat/conf/server.xml
<system> <property name="idleTimeout">2880000</property> <!--設(shè)置超時(shí)時(shí)間為28800秒 --> <property name="maxPacketSize">134217728</property> <!--設(shè)置最大網(wǎng)絡(luò)包為128M --> <property name="charset">utf8</property> <!--設(shè)置默認(rèn)字符集為utf8 --> <property name="txIsolation">2</property> <!--設(shè)置隔離級(jí)別為RC --> <property name="sqlExecuteTimeout">600</property> <!--設(shè)置sql執(zhí)行的超時(shí)時(shí)間為600秒 --> </system> <!--下面是設(shè)置mycat的用戶名/密碼和權(quán)限控制,和mysql的用戶名密碼無(wú)關(guān) --> <user name="root" defaultAccount="true"> <property name="password">mycat123</property> <property name="schemas">sbtest,testppp</property> </user> <user name="sysbench"> <property name="password">sb123</property> <property name="schemas">sbtest</property> </user> <user name="test"> <property name="password">test</property> <property name="schemas">sbtest</property> <property name="readOnly">true</property> <privileges check="false"> <schema name="sbtest" dml="0001" > <table name="sbtest11" dml="1111"></table> </schema> </privileges> </user>
設(shè)置了一些相關(guān)壓測(cè)的項(xiàng)目參數(shù),和創(chuàng)建了三個(gè)用戶root,sysbench,test.這三個(gè)用戶和數(shù)據(jù)庫(kù)的用戶沒(méi)有關(guān)聯(lián),是獨(dú)立的,即使這個(gè)用戶密碼被破解,數(shù)據(jù)庫(kù)的密碼依然安全.其中root有完全控制權(quán)限,sysbench只能控制sbtest庫(kù),test也只能控制sbtest庫(kù),而且限制了讀寫權(quán)限.
然后設(shè)置邏輯庫(kù)配置文件schema.xml,這里改動(dòng)比較多,所以直接貼上整個(gè)文件:
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="sbtest" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema> <schema name="testppp" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"> </schema> <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" /> --> <dataNode name="dn1" dataHost="10.21.128.157" database="sbtest" /> <dataNode name="dn2" dataHost="10.21.128.157" database="testppp" /> <!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" /> <dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" /> <dataNode name="jdbc_dn2" dataHost="jdbchost" database="db2" /> <dataNode name="jdbc_dn3" dataHost="jdbchost" database="db3" /> --> <dataHost name="10.21.128.157" maxCon="3000" minCon="20" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="10.21.128.157:3306" user="root" password="128157"> <!-- can have multi read hosts --> <readHost host="hostS2" url="10.21.128.158:3306" user="root" password="128157" /> <readHost host="hostS3" url="10.21.128.159:3306" user="root" password="128157" /> </writeHost> <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> --> </dataHost> </mycat:schema>
設(shè)置了兩個(gè)邏輯庫(kù)sbtest和testppp(和真實(shí)庫(kù)同名,其實(shí)可以不同),指向的真實(shí)數(shù)據(jù)庫(kù)的主從環(huán)境dn1和dn2,里面有一主兩從三臺(tái)真實(shí)服務(wù)器地址,并開(kāi)啟讀寫分離.但是要注意的是,事務(wù)只走主庫(kù),所以讀寫分離最優(yōu)方案還是由程序做好一點(diǎn),用中間件做難免就有點(diǎn)雞肋了,畢竟現(xiàn)在很多開(kāi)發(fā)框架都走事務(wù)的.
3) 啟動(dòng)mycat,
#啟動(dòng)mycat
Mycat start
#重啟mycat
Mycat restart
#關(guān)閉mycat
Mycat stop
#而Mycat默認(rèn)的連接端口是8066,管理端口是9066,可以在server.xml修改.
ss -ntplu |grep java
tcp LISTEN 0 100 :::9066 :::* users:(("java",pid=115779,fd=168))
tcp LISTEN 0 100 :::8066 :::* users:(("java",pid=115779,fd=172))
#看到端口起來(lái)了,就可以使用了,因?yàn)閙ycat支持mysql原生協(xié)議,所以連上8066端口是不會(huì)和一般mysql有什么區(qū)別,直接就能使用了.
#如果更改了任何配置文件,可以登錄進(jìn)管理端口執(zhí)行下列命令實(shí)時(shí)熱刷新配置,相當(dāng)方便.
mysql -uroot -pmycat123 -h20.21.128.156 -P9066
#更改server的配置可以
Mysql>reload @@config
#如果改了schema的配置,需要這個(gè)命令
Mysql>reload @@config_all加載完成就可以使用新配置了,哪怕是改了登錄用戶名也能熱加載.
搭建sysbench
下載下來(lái)后,只要有c運(yùn)行庫(kù)就能編譯安裝,但是要?jiǎng)?chuàng)建mysql庫(kù)文件的軟連接,不然會(huì)報(bào)錯(cuò)找不到庫(kù)文件,
#先安裝依賴包 yum install -y automake libtool #先創(chuàng)建mysql庫(kù)文件的軟連接,不然編譯會(huì)報(bào)錯(cuò)的 ln -sf /usr/local/mysql/lib/libmysql* /usr/lib64 ln -sf /usr/local/mysql/lib/libmysqlclient.so /usr/lib64/libmysqlclient_r.so #然后執(zhí)行: tar xf sysbench-0.4.12-1.1.tgz cd sysbench-0.4.12-1.1 ./autogen.sh ./configure --with-mysql-includes=/usr/local/mysql/include --with-mysql-libs=/usr/local/mysql/lib Make #如果 make 沒(méi)有報(bào)錯(cuò),就會(huì)在 sysbench 目錄下生成二進(jìn)制命令行工具 sysbench cd /tmp/sysbench-0.4.12-1.1/sysbench ls -l sysbench -rwxr-xr-x 1 root root 3293186 Sep 21 16:24 sysbench
在此,環(huán)境就搭建完畢了.
開(kāi)始測(cè)試
環(huán)境準(zhǔn)備好了,就開(kāi)始測(cè)試了,測(cè)試前要先準(zhǔn)備測(cè)試數(shù)據(jù),需要使用命令來(lái)制造出來(lái),要比較長(zhǎng)的時(shí)間(可能大半天),重點(diǎn)是要關(guān)注硬盤空間是否足夠:
#避免不必要的錯(cuò)誤,直連數(shù)據(jù)庫(kù)操作 mysql -uroot -p128157 -h20.21.128.157 -P3306 #創(chuàng)建測(cè)試數(shù)據(jù)庫(kù),sysbench默認(rèn)測(cè)試庫(kù)名是sbtest,也可以指定庫(kù)名 mysql> create database sbtest; #進(jìn)入sysbench程序目錄 cd /tmp/sysbench-0.4.12-1.1/sysbench #開(kāi)始造數(shù)據(jù), ./sysbench --mysql-host=10.21.128.157 --mysql-port=3306 --mysql-user=root --mysql-password=128157 --test=tests/db/oltp.lua --oltp_tables_count=15 --oltp-table-size=40000000 --mysql-table-engine=innodb --rand-init=on prepare #再次強(qiáng)調(diào),時(shí)間可能很長(zhǎng),需要耐心等待
參數(shù)解析:
--test=tests/db/oltp.lua 表示調(diào)用 tests/db/oltp.lua 腳本進(jìn)行 oltp 模式測(cè)試,oltp是啥就不解析了
--oltp_tables_count=15 表示會(huì)生成 15 個(gè)測(cè)試表,數(shù)量越多,自然花費(fèi)時(shí)間越長(zhǎng)
--oltp-table-size=40000000 表示每個(gè)測(cè)試表填充數(shù)據(jù)量為 40000000行 ,數(shù)量越多也是越時(shí)間長(zhǎng)
--rand-init=on 表示每個(gè)測(cè)試表都是用隨機(jī)數(shù)據(jù)來(lái)填充的,這樣才客觀
--mysql-table-engine=innodb 表示表的引擎是innodb
prepare 用于準(zhǔn)備測(cè)試需要的數(shù)據(jù),準(zhǔn)備完后執(zhí)行run來(lái)測(cè)試,測(cè)試完成后如果需要清理數(shù)據(jù)就用cleanup來(lái)清除測(cè)試數(shù)據(jù)
=====================分割線開(kāi)始===================================
所以這里創(chuàng)造了15個(gè)表,里面每個(gè)表有4000萬(wàn)行的數(shù)據(jù),數(shù)據(jù)為隨機(jī)輸入,這個(gè)數(shù)據(jù)量大概需要150G硬盤空間,估計(jì)可以涵蓋大部分情況了吧,當(dāng)然,你也可以創(chuàng)建更多數(shù)據(jù).
數(shù)據(jù)結(jié)構(gòu)大致是這樣的,僅供參考:
mysql> show tables; +------------------+ | Tables_in_sbtest | +------------------+ | sbtest1 | | sbtest2 | | sbtest3 | . . . | sbtest15 | +------------------+ 5 rows in set (0.00 sec) mysql> select * from sbtest1 limit 1; +----+---------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+ | id | k | c | pad | +----+---------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+ | 1 | 2507308 | 68487932199-96439406143-93774651418-41631865787-96406072701-20604855487-25459966574-28203206787-41238978918-19503783441 | 22195207048-70116052123-74140395089-76317954521-98694025897 | +----+---------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+ 1 row in set (0.01 sec)
=============分割線結(jié)束========================================
然后就可以進(jìn)行正式測(cè)試了,我們先進(jìn)行測(cè)試普通主從架構(gòu):
#進(jìn)入sysbench程序目錄 cd /tmp/sysbench-0.4.12-1.1/sysbench #執(zhí)行測(cè)試命令 ./sysbench --mysql-host=10.21.128.157 --mysql-port=3306 --mysql-user=root --mysql-password=128157 --test=tests/db/oltp.lua --oltp_tables_count=15 --oltp-table-size=40000000 --mysql-table-engine=innodb --num-threads=1024 --oltp-read-only=off --report-interval=10 --rand-type=uniform --max-time=3600 --max-requests=0 --percentile=99 run >> /tmp/sysbench_oltpX_32_20171113-1.log #我們?cè)O(shè)定的是3600秒,在此之前終止,也就是測(cè)試失敗,需要分析報(bào)錯(cuò)
參數(shù)解析:
--num-threads=1024 表示發(fā)起1024個(gè)并發(fā)連接
--oltp-read-only=off 表示不要進(jìn)行只讀測(cè)試,也就是會(huì)采用讀寫混合模式測(cè)試
--report-interval=10 表示每10秒輸出一次測(cè)試進(jìn)度報(bào)告
--rand-type=uniform 表示隨機(jī)類型為固定模式,其他幾個(gè)可選隨機(jī)模式:uniform(固定),gaussian(高斯),special(特定的),pareto(帕累托)
--max-time=3600 表示最大執(zhí)行時(shí)長(zhǎng)為3600秒,測(cè)試將在這個(gè)時(shí)間后結(jié)束
--max-requests=0 表示總請(qǐng)求數(shù)為 0,因?yàn)樯厦嬉呀?jīng)定義了總執(zhí)行時(shí)長(zhǎng),所以總請(qǐng)求數(shù)可以設(shè)定為 0;也可以只設(shè)定總請(qǐng)求數(shù),不設(shè)定最大執(zhí)行時(shí)長(zhǎng)
--percentile=99 表示設(shè)定采樣比例,默認(rèn)是 95%,即丟棄1%的長(zhǎng)請(qǐng)求,在剩余的99%里取最大值
根據(jù)上面的解析,最后輸出到一個(gè)文件,畢竟需要記錄下來(lái).
然后到mycat代理環(huán)境:
./sysbench --mysql-host=10.21.128.156 --mysql-port=8066 --mysql-user=sysbench --mysql-password=sb123 --test=tests/db/oltp.lua --oltp_tables_count=15 --oltp-table-size=40000000 --mysql-table-engine=innodb --num-threads=1024 --oltp-read-only=off --report-interval=10 --rand-type=uniform --max-time=3600 --max-requests=40000000 --percentile=99 run >> /home/logs/sysbench_oltpX_32_20171113-2.log
和上面一樣,設(shè)定了并發(fā)為1024個(gè)線程,測(cè)試時(shí)間為3600秒即1小時(shí),同時(shí)也是用到剛才制造出來(lái)的15個(gè)4000萬(wàn)行的表,設(shè)定取值采樣平均值為99%的數(shù)據(jù),輸出到另一個(gè)log文件.
閱讀測(cè)試報(bào)告
測(cè)試完了,就來(lái)看結(jié)果了,我們拿其中一個(gè)結(jié)果來(lái)解析說(shuō)一下:
#忽略掉一些每10秒統(tǒng)計(jì)值,只看最后的統(tǒng)計(jì)值 vim /tmp/sysbench_oltpX_32_20171113-1.log sysbench 0.5: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 1024 Report intermediate results every 10 second(s) Random number generator seed is 0 and will be ignored Threads started! -- 每10秒鐘報(bào)告一次測(cè)試結(jié)果,tps、每秒讀、每秒寫、99%以上的響應(yīng)時(shí)長(zhǎng)統(tǒng)計(jì) [ 10s] threads: 1024, tps: 364.69, reads/s: 6324.66, writes/s: 1765.66, response time: 4292.46ms (99%) [ 20s] threads: 1024, tps: 475.80, reads/s: 6037.91, writes/s: 1640.10, response time: 4088.05ms (99%) [ 30s] threads: 1024, tps: 439.40, reads/s: 6349.45, writes/s: 1808.89, response time: 3248.44ms (99%) [ 40s] threads: 1024, tps: 487.70, reads/s: 6438.46, writes/s: 1879.72, response time: 4385.98ms (99%) [ 50s] threads: 1024, tps: 395.70, reads/s: 6498.99, writes/s: 1849.00, response time: 3845.88ms (99%) . . . [3560s] threads: 1024, tps: 385.80, reads/s: 4949.60, writes/s: 1503.80, response time: 19827.73ms (99%) [3570s] threads: 1024, tps: 249.70, reads/s: 3679.90, writes/s: 1009.40, response time: 12016.58ms (99%) [3580s] threads: 1024, tps: 328.90, reads/s: 4511.40, writes/s: 1301.40, response time: 7419.06ms (99%) [3590s] threads: 1024, tps: 196.40, reads/s: 3058.90, writes/s: 815.30, response time: 12092.35ms (99%) [3600s] threads: 1024, tps: 386.60, reads/s: 5282.74, writes/s: 1537.78, response time: 13614.18ms (99%) OLTP test statistics: queries performed: read: 16913554 -- 讀總數(shù) write: 4832444 -- 寫總數(shù) other: 2416222 -- 其他操作總數(shù)(SELECT、INSERT、UPDATE、DELETE之外的操作,例如COMMIT等) total: 24162220 -- 全部總數(shù) transactions: 1208111 (335.29 per sec.) -- 總事務(wù)數(shù)(每秒事務(wù)數(shù)) deadlocks: 0 (0.00 per sec.) -- 發(fā)生死鎖總數(shù) read/write requests: 21745998 (6035.29 per sec.) -- 讀寫總數(shù)(每秒讀寫次數(shù)) other operations: 2416222 (670.59 per sec.) -- 其他操作總數(shù)(每秒其他操作次數(shù)) General statistics: total time: 3603.1388s -- 總耗時(shí) total number of events: 1208111 -- 共發(fā)生多少事務(wù)數(shù) total time taken by event execution: 3688348.3797s -- 所有事務(wù)耗時(shí)相加(不考慮并行因素) response time: min: 28.41ms -- 最小耗時(shí) avg: 3052.99ms -- 平均耗時(shí) max: 48667.93ms -- 最長(zhǎng)耗時(shí) approx. 99 percentile: 12708.40ms -- 超過(guò)99%平均耗時(shí) Threads fairness: events (avg/stddev): 1179.7959/29.07 execution time (avg/stddev): 3601.9027/1.01
所以,每秒事務(wù)數(shù)Tps達(dá)335.29,每秒查詢數(shù)Qps達(dá)6035.29,平均延時(shí)3052.99ms.
看完解析,來(lái)看結(jié)果,下面是直接測(cè)主從環(huán)境的結(jié)果:
OLTP test statistics: queries performed: read: 19215238 write: 5490068 other: 2745034 total: 27450340 transactions: 1372517 (381.03 per sec.) deadlocks: 0 (0.00 per sec.) read/write requests: 24705306 (6858.48 per sec.) other operations: 2745034 (762.05 per sec.) General statistics: total time: 3602.1538s total number of events: 1372517 total time taken by event execution: 3688254.2686s response time: min: 18.33ms avg: 2687.22ms max: 55386.15ms approx. 99 percentile: 12444.89ms Threads fairness: events (avg/stddev): 1340.3486/33.85 execution time (avg/stddev): 3601.8108/0.44
每秒事務(wù)數(shù)Tps達(dá)381.03,每秒查詢數(shù)Qps達(dá)6858.48,平均耗時(shí)2687.22ms,畢竟總數(shù)據(jù)量是6億,還是應(yīng)該要接受.
下面是通過(guò)mycat代理的結(jié)果
OLTP test statistics: queries performed: read: 18078326 write: 5165236 other: 2582618 total: 25826180 transactions: 1291309 (358.40 per sec.) deadlocks: 0 (0.00 per sec.) read/write requests: 23243562 (6451.19 per sec.) other operations: 2582618 (716.80 per sec.) General statistics: total time: 3602.9883s total number of events: 1291309 total time taken by event execution: 3687715.5739s response time: min: 22.45ms avg: 2855.80ms max: 50326.08ms approx. 99 percentile: 13264.21ms Threads fairness: events (avg/stddev): 1261.0439/33.56 execution time (avg/stddev): 3601.2847/0.96
每秒事務(wù)數(shù)Tps達(dá)358.40,每秒查詢數(shù)Qps達(dá)6451.19,平均耗時(shí)2855.80ms,同樣是總數(shù)據(jù)量6億.
從結(jié)果對(duì)比計(jì)算,使用mycat后,tps,qps,和耗時(shí)都損耗了6%-7%,在我個(gè)人看來(lái)還是可以接受,因?yàn)槭褂昧薽ycat做代理層,可以很方便的管理后端數(shù)據(jù)庫(kù),任何切換都可以手動(dòng)來(lái)秒切,使用上觸發(fā)腳本后就是一個(gè)HA框架了.
題外說(shuō)明
測(cè)試結(jié)果示例說(shuō)明的例子,其實(shí)是加上了高可用keepalived的測(cè)試結(jié)果,每秒事務(wù)數(shù)Tps達(dá)335.29,每秒查詢數(shù)Qps達(dá)6035.29,平均延時(shí)3052.99ms,總的來(lái)說(shuō)算好,也還只是比純mysql主從損耗10%范圍內(nèi),可以接受,畢竟可用性高了很多,而且后續(xù)壓力增大也可以隨時(shí)增加mycat數(shù)量來(lái)填補(bǔ).
功能多了,機(jī)器也要多了一些,需要特別說(shuō)明的是,因?yàn)樯婕熬W(wǎng)絡(luò)數(shù)據(jù)包轉(zhuǎn)發(fā)關(guān)系,keepalived和后端mycat不能在同一臺(tái)服務(wù)器,所以就必須獨(dú)立開(kāi)來(lái).
10.21.128.208:keepalived主
10.21.128.209:keepalived備
10.21.128.200:mycat1
10.21.128.201:mycat2
10.21.128.199:vip
簡(jiǎn)單說(shuō)明拓?fù)潢P(guān)系:

需要多搭建一個(gè)mycat,不過(guò)這里就不細(xì)說(shuō)了,直接復(fù)制一份配置到其他機(jī)器再啟動(dòng)就ok了.
然后搭建一套keepalived集群:
大多數(shù)情況下,大伙使用keepalived只做HA功能,而LVS功能則交給其他軟件實(shí)現(xiàn).但是實(shí)際上keepalived+ipvsadm既能實(shí)現(xiàn)HA功能,也能實(shí)現(xiàn)LVS功能,非常方便.
我們?cè)?0.21.128.208和10.21.128.209上安裝keepalived和修改配置.
個(gè)人不想糾結(jié)功能和版本問(wèn)題,而這些也是比較常態(tài)功能性的軟件,絕大部分yum源都配備,所以直接用yum安裝就很方便,有額外興趣的可以慢慢編譯
#安裝需要的軟件 yum install -y keepalived ipvsadm nc rsync telnet tcpdump wget
安裝很快,我們直接看配置,yum安裝默認(rèn)的配置文件在/etc/keepalived/
#修改配置文件,注意注釋位置
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#全局配置
global_defs {
notification_email {
root@localhost #定義收件人郵件地址
}
notification_email_from root@localhost #定義發(fā)件人
smtp_server 127.0.0.1 #如果要使用第三方smtp服務(wù)器,在現(xiàn)實(shí)中幾乎沒(méi)有意義(需要驗(yàn)證的原因),設(shè)為本地就可以了
smtp_connect_timeout 30 #smtp超時(shí)時(shí)間
router_id LVS_HA_MYCAT1 #此服務(wù)器keepalived的ID,隨便改,注意不同服務(wù)器不一樣就行
}
#vrrp配置(HA配置)
vrrp_instance VI_1 { #定義虛擬路由,VI_1 為虛擬路由的標(biāo)示符,自己定義名稱
state MASTER #指定當(dāng)前節(jié)點(diǎn)為主節(jié)點(diǎn) 備用節(jié)點(diǎn)上設(shè)置為BACKUP即可
interface eth0 #綁定虛擬IP的網(wǎng)絡(luò)接口,注意內(nèi)外網(wǎng)
virtual_router_id 19 #VRRP組名,兩個(gè)節(jié)點(diǎn)的設(shè)置必須一樣,以指明各個(gè)節(jié)點(diǎn)屬于同一VRRP組,0-255隨便你用,這個(gè)ID也是虛擬MAC最后一段的來(lái)源
priority 100 #初始優(yōu)先級(jí),取值1-254之間,主節(jié)點(diǎn)一定要最大,其他從節(jié)點(diǎn)則看情況減少
advert_int 1 #組播信息發(fā)送間隔,兩個(gè)節(jié)點(diǎn)設(shè)置必須一樣
authentication { #設(shè)置驗(yàn)證信息,兩個(gè)節(jié)點(diǎn)必須一致
auth_type PASS
auth_pass 199200
}
virtual_ipaddress {
10.21.128.199 #指定VIP,兩個(gè)節(jié)點(diǎn)設(shè)置必須一樣,虛擬ip最好和真實(shí)ip在同一網(wǎng)段。
}
}
#負(fù)載均衡配置(LVS配置)
virtual_server 10.21.128.199 8066 { #指定VIP和端口,vip就是上面設(shè)置那個(gè)
delay_loop 6 #延遲多少個(gè)周期再啟動(dòng)服務(wù),做服務(wù)檢測(cè)
lb_algo rr #負(fù)載均衡調(diào)度算法
lb_kind DR #負(fù)載均衡類型選擇,可選DR|NAT|TUN,DR性能比較高
nat_mask 255.255.255.0 #vip的掩碼
persistence_timeout 0 #會(huì)話保持時(shí)間,一定時(shí)間之內(nèi)用戶無(wú)響應(yīng)則下一次用戶請(qǐng)求時(shí)需重新路由,一般設(shè)為0,不需要.
protocol TCP #使用的協(xié)議,一般就TCP
real_server 10.21.128.200 8066 { #定義后端realserver的真實(shí)服務(wù)器屬性,ip和端口
weight 1 #負(fù)載均衡權(quán)重,數(shù)值越大,就負(fù)擔(dān)更多連接
MISC_CHECK { #定義心跳檢測(cè)的方法,因?yàn)椴皇莣eb,而且用tcp_check健康檢測(cè)后面的mycat會(huì)報(bào)錯(cuò),所以需要misc_check的方式做心跳檢測(cè)
misc_path"/etc/keepalived/shell/check_mycat_status.sh 10.21.128.200 8066" #自定義心跳檢測(cè)shell腳本的路徑、檢測(cè)的服務(wù)器ip、檢測(cè)的端口。(引號(hào)必須要)
misc_timeout 3 #腳本執(zhí)行超時(shí)時(shí)間
}
}
real_server 10.21.128.201 8066 { #同上
weight 2
MISC_CHECK {
misc_path"/etc/keepalived/shell/check_mycat_status.sh 10.21.128.201 8066"
misc_timeout 3
}
}
real_server 10.21.128.156 8066 { #同上
weight 2
MISC_CHECK {
misc_path"/etc/keepalived/shell/check_mycat_status.sh 10.21.128.156 8066"
misc_timeout 3
}
}
}特別說(shuō)明一下負(fù)載均衡調(diào)度算法參數(shù)lb_algo,因?yàn)椴煌乃惴ㄓ胁煌男Ч?想要架構(gòu)穩(wěn)定,就要找到最適合自己的算法.
rr:輪循調(diào)度(Round Robin)算法,不管服務(wù)器上實(shí)際的連接數(shù)和系統(tǒng)負(fù)載,把連接輪流的發(fā)放到每一個(gè)real_server上.優(yōu)點(diǎn)是必然每個(gè)real_server都有操作,缺點(diǎn)是長(zhǎng)短連接容易分配不均衡.
wrr:加權(quán)輪循調(diào)度(Weighted Round Robin)算法,大體和rr一樣,但是規(guī)則上多了一個(gè)權(quán)重判斷,通過(guò)參數(shù)weight判斷那個(gè)real_server分發(fā)多一些任務(wù),優(yōu)缺點(diǎn)和rr也一致.
lc:最小連接調(diào)度算法,把新的連接請(qǐng)求分配到當(dāng)前連接數(shù)最小的real_server上.優(yōu)點(diǎn)是能相對(duì)平均分配連接請(qǐng)求,缺點(diǎn)是可能出現(xiàn)局部大量短連接打到一個(gè)節(jié)點(diǎn)上的情況.
wlc:加權(quán)最小連接調(diào)度算法,大體和lc一致,優(yōu)缺點(diǎn)也一致,規(guī)則上多了一個(gè)權(quán)重判斷,通過(guò)參數(shù)weight判斷那個(gè)real_server分發(fā)多一些任務(wù).
lblc:基于局部性的最少鏈接調(diào)度算法,在負(fù)載基本相對(duì)平衡情況下,將相同目標(biāo)IP地址的請(qǐng)求調(diào)度到同一臺(tái)服務(wù)器.優(yōu)點(diǎn)是能提高緩存命中率,缺點(diǎn)是意義不大,因?yàn)椴黄胶饩褪鞘?
lblcr:帶復(fù)制的基于局部性最少鏈接,它與LBLC算法基本相同,但是算法更復(fù)雜,以達(dá)到緩存可用性更高,缺點(diǎn)是對(duì)于熱數(shù)據(jù)意義不大,一般很少用這種算法.
dh:目標(biāo)地址散列調(diào)度,通過(guò)靜態(tài)映射算法,散列(Hash)函數(shù)將一個(gè)目標(biāo)IP地址映射到real_server上,優(yōu)點(diǎn)是一個(gè)IP地址會(huì)長(zhǎng)期固定連接一臺(tái)服務(wù)器,缺點(diǎn)是容易使請(qǐng)求不平衡.
注意1:LVS+DR模式中,只支持IP的轉(zhuǎn)發(fā),不支持端口轉(zhuǎn)發(fā),也就是說(shuō)在keepalived.conf的virtual_server和real_server的配置節(jié)點(diǎn)中端口必須一樣。
注意2:配置負(fù)載均衡模式強(qiáng)烈建議VIP和后端真實(shí)服務(wù)器IP同網(wǎng)段,不然會(huì)出現(xiàn)一些奇葩情況,得不償失.
里面涉及一個(gè)檢測(cè)心跳的腳本,如下所示:
cat /etc/keepalived/shell/check_mycat_status.sh #!/bin/bash result=`nc -v -z $1 $2` flag="succeeded" if [[ $result =~ $flag ]] then exit 0 else; exit 1 fi #記得要給該腳本賦予執(zhí)行權(quán)限: chmod 755 check_mycat_status.sh
意思很簡(jiǎn)單,就是通過(guò)nc命令檢測(cè)真實(shí)服務(wù)器的mycat的端口通不通,如果不通的話,keepalived就把這個(gè)mycat剔除出集群.
然后,在后端真實(shí)服務(wù)器上需要做一個(gè)操作,綁定vip創(chuàng)建ipvs規(guī)則:
在10.21.128.200,10.21.128.201,10.21.128.156上創(chuàng)建并執(zhí)行下面的腳本,
#創(chuàng)建規(guī)則腳本
vim /shell/realserver
#!/bin/bash
SNS_VIP=10.21.128.199
#/etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $SNS_VIP broadcast $SNS_VIP netmask 255.255.255.255 up
sleep 5
/sbin/route add ${SNS_VIP}/32 dev lo:0
echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
/sbin/route del -net $SNS_VIP netmask 255.255.255.255 dev lo:0
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0">/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0">/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
restart)
/sbin/route del -net $SNS_VIP netmask 255.255.255.255 dev lo:0
/sbin/route add ${SNS_VIP}/32 dev lo:0
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
#賦予執(zhí)行權(quán)限
chmod 755 /shell/realserver
#執(zhí)行一下
/shell/realserver start
#然后查看下網(wǎng)卡狀態(tài)
ifconfig lo:0
lo:0 Link encap:Local Loopback
inet addr:10.21.128.199 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1需要注意,每次服務(wù)器重啟都必須啟動(dòng)這個(gè)綁定,不然lvs就不生效了,例如把他放到/etc/rc.d/rc.local
echo "/shell/realserver start" >>/etc/rc.d/rc.local
萬(wàn)事俱備,只欠東風(fēng),那就啟動(dòng)keepalived吧.
在10.21.128.208和10.21.128.209上執(zhí)行
#因?yàn)槭莥um安裝,所以有l(wèi)inux服務(wù) /etc/init.d/keepalived start Starting keepalived: [ OK ] --------------------------------------------------------------------- #如果是centos7或者是ubuntu14以上的系統(tǒng),就需要以下的命令 systemctl start keepalived systemctl status keepalived systemctl stop keepalived systemctl reload keepalived --------------------------------------------------------------------- #看看vip,因?yàn)橹魇?08,所以vip只會(huì)在208出現(xiàn),除非208掛了 ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 22:87:35:77:ef:38 brd ff:ff:ff:ff:ff:ff inet 10.21.128.208/24 brd 10.21.128.255 scope global eth0 inet 10.21.128.199/32 scope global eth0 #-------VIP在這 inet6 fe80::2087:35ff:fe77:ef38/64 scope link valid_lft forever preferred_lft forever #然后看看當(dāng)前LVS狀態(tài) ipvsadm -L IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.21.128.199:8066 rr -> 10.21.128.156:8066 Route 2 0 0 -> 10.21.128.200:8066 Route 1 0 0 -> 10.21.128.201:8066 Route 2 0 0
注意:如果是檢測(cè)不正常的IP和端口,在ipvsadm -L命令下是看不到IP地址的,因?yàn)楸籯eepalived主動(dòng)下線了,這個(gè)時(shí)候你要檢查相關(guān)IP和端口為什么檢測(cè)不通過(guò)的原因.
如果要看連接進(jìn)來(lái)的IP地址和狀態(tài),可以用下面的命令.
ipvsadm -Lnc IPVS connection entries pro expire state source virtual destination TCP 14:54 ESTABLISHED 10.237.140.90:31472 10.21.128.199:8066 10.21.128.200:8066 TCP 01:27 FIN_WAIT 10.237.140.90:31468 10.21.128.199:8066 10.21.128.201:8066
看state的值可以知道這個(gè)連接的狀態(tài).
一切都正常,那么,我們可以壓測(cè)了.
#和之前命令差不多,只是ip不一樣 ./sysbench --mysql-host=10.21.128.199 --mysql-port=8066 --mysql-user=sysbench --mysql-password=sb123 --test=tests/db/oltp.lua --oltp_tables_count=15 --oltp-table-size=40000000 --mysql-table-engine=innodb --num-threads=1024 --oltp-read-only=off --report-interval=10 --rand-type=uniform --max-time=3600 --max-requests=40000000 --percentile=99 run >> /home/logs/sysbench_oltpX_32_20171128-3.log
我們來(lái)看看lvs狀態(tài)
#查看鏈接狀態(tài) ipvsadm -L IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.21.128.199:8066 rr -> 10.21.128.156:8066 Route 2 341 340 -> 10.21.128.200:8066 Route 1 341 340 -> 10.21.128.201:8066 Route 2 342 340 #加多一個(gè)--stats參數(shù),就可以看到流量數(shù)據(jù) ipvsadm -L --stats IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 10.21.128.199:8066 2045 3658545 0 326481K 0 -> 10.21.128.156:8066 682 1131691 0 114278K 0 -> 10.21.128.200:8066 681 1266405 0 106344K 0 -> 10.21.128.201:8066 682 1260449 0 105858K 0
為什么會(huì)沒(méi)有out?是不是很奇怪?因?yàn)槲覀冐?fù)載均衡類型選擇的是DR模式,這個(gè)模式的特點(diǎn)就是當(dāng)客戶端和真實(shí)服務(wù)器建立鏈接后,真實(shí)服務(wù)器會(huì)直接把數(shù)據(jù)發(fā)送給客戶端,不再需要keepalived來(lái)中轉(zhuǎn),所以就沒(méi)有out的流量了,也就是
網(wǎng)站標(biāo)題:mycat功能測(cè)試簡(jiǎn)析
網(wǎng)站網(wǎng)址:http://www.chinadenli.net/article32/gspppc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、網(wǎng)站維護(hù)、微信小程序、Google、建站公司、微信公眾號(hào)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)