網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了準(zhǔn)格爾免費(fèi)建站歡迎大家使用!
目前,我們的writehost只設(shè)置了一個(gè)主庫(kù),當(dāng)主庫(kù)宕機(jī)后,通過(guò)mycat的 讀寫(xiě)請(qǐng)求會(huì)全部報(bào)錯(cuò),如下所示:
讀請(qǐng)求:
MySQL> select * from t1; ERROR
1184
(HY000): 拒絕連接 |
寫(xiě)請(qǐng)求:
mysql> insert into t1 values (
2
); ERROR
1184
(HY000): 拒絕連接 |
上面看到,如果只設(shè)置一個(gè)writehost,主庫(kù)宕機(jī)后,并不會(huì)自動(dòng)切換,所有的 讀寫(xiě)請(qǐng)求全部受影響。
為了解決這個(gè)我們,我們可以設(shè)置多個(gè)writehost,當(dāng)主庫(kù)宕機(jī)后,自動(dòng)把寫(xiě)請(qǐng)求切換到從節(jié)點(diǎn)。
我們的生產(chǎn)環(huán)境是一主一從,我們可以把兩個(gè)節(jié)點(diǎn)都設(shè)置為writehost,這樣如果writehost1(主庫(kù))宕機(jī)后,mycat會(huì)自動(dòng)把 寫(xiě)請(qǐng)求全部轉(zhuǎn)移到writehost2(從庫(kù))上。
原來(lái)配置:
[root
@demo
-init conf]# cat
schema.xml <?xml version=
"1.0"
?> <!DOCTYPE mycat:schema SYSTEM
"
schema.dtd"
> <mycat:schema xmlns:mycat=
"
http://io.mycat/"
>
<schema name=
"db1"
checkSQLschema=
"false"
sqlMaxLimit=
"500"
dataNode=
"dn1"
></schema>
<dataNode name=
"dn1"
dataHost=
"localhost1"
database=
"db1"
/>
<dataHost name=
"localhost1"
maxCon=
"1000"
minCon=
"10"
balance=
"3"
writeType=
"0"
dbType=
"mysql"
dbDriver=
"native"
switchType=
"-1"
slaveThreshold=
"100"
>
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host=
"hostM1"
url=
"
192.168.174.30:3306"
user=
"root"
password=
"123456"
>
<readHost host=
"hostS1"
url=
"
192.168.174.30:3307"
user=
"root"
password=
"123456"
/>
</writeHost>
</dataHost> </mycat:schema> |
修改后配置:
[root
@demo
-init conf]# cat
schema.xml <?xml version=
"1.0"
?> <!DOCTYPE mycat:schema SYSTEM
"
schema.dtd"
> <mycat:schema xmlns:mycat=
"
http://io.mycat/"
>
<schema name=
"db1"
checkSQLschema=
"false"
sqlMaxLimit=
"500"
dataNode=
"dn1"
></schema>
<dataNode name=
"dn1"
dataHost=
"localhost1"
database=
"db1"
/>
<dataHost name=
"localhost1"
maxCon=
"1000"
minCon=
"10"
balance=
"3"
writeType=
"0"
dbType=
"mysql"
dbDriver=
"native"
switchType=
"1"
slaveThreshold=
"100"
>
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host=
"hostM1"
url=
"
192.168.174.30:3306"
user=
"root"
password=
"123456"
>
<readHost host=
"hostS1"
url=
"
192.168.174.30:3307"
user=
"root"
password=
"123456"
/>
</writeHost>
<writeHost host=
"hostM2"
url=
"
192.168.174.30:3307"
user=
"root"
password=
"123456"
/>
</dataHost> </mycat:schema> |
就改了兩處:
a)把 switchType="-1"改成 switchType="1";
說(shuō)明: switchType:
<writeHost host=
"allinmd-mysql-3"
url=
"
192.168.174.30:3307"
user=
"root"
password=
"123456"
/>
這樣配置后,當(dāng)主庫(kù)宕機(jī)后,寫(xiě)請(qǐng)求就會(huì)自動(dòng)轉(zhuǎn)移到從庫(kù)上,從而保證業(yè)務(wù)正??捎?。
當(dāng)原主庫(kù)恢復(fù)后,它將不能納入mycat的管理(blance=3)。也就是說(shuō),原主庫(kù)恢復(fù)后,mycat不會(huì)把寫(xiě)請(qǐng)求發(fā)送到原主庫(kù)。這是由conf/dnindex.properties來(lái)決定的。
下面是mycat官方文檔的說(shuō)明,摘錄在這。
正常情況下,Mycat 會(huì)將第一個(gè) writeHost 作為寫(xiě)節(jié)點(diǎn),所有的 DML SQL 會(huì)發(fā)送給此節(jié)點(diǎn),若 Mycat 開(kāi)啟了讀寫(xiě)分離,則查詢節(jié)點(diǎn)會(huì)根據(jù)讀寫(xiě)分離的策略發(fā)readHost(+writeHost)上執(zhí)行,當(dāng)一個(gè) dataHost 里面配置了兩個(gè)或多個(gè) writeHost 的情況下,如果第一個(gè) writeHost 宕機(jī),則 Mycat 會(huì)在默認(rèn)的3 次心跳檢查失敗后,自動(dòng)切換到下一個(gè)可用的 writeHost 執(zhí)行 DML SQL 語(yǔ)句,并在 conf/dnindex.properties文件里記錄當(dāng)前所用的 writeHost 的 index(第一個(gè)為 0,第二個(gè)為 1,依次類推),注意,此文件不能刪除和擅自改變,除非你深刻理解了它的作用以及你的目的。
那么問(wèn)題來(lái)了,當(dāng)原來(lái)配置的 MySQL 寫(xiě)節(jié)點(diǎn)宕機(jī)恢復(fù)以后,怎么重新加入 Mycat,要不要恢復(fù)為原來(lái)的寫(xiě)節(jié)點(diǎn)?關(guān)于這個(gè)問(wèn)題,我們也曾與 DBA 討論很久,最終的建議方案是,保持現(xiàn)有狀態(tài)不變,改旗易幟,恢復(fù)后的MySQL 節(jié)點(diǎn)作為從節(jié)點(diǎn),跟隨新的主節(jié)點(diǎn),重新配置主從同步,原先跟隨該節(jié)點(diǎn)做同步的其他節(jié)點(diǎn)也同樣換帥,重新配置同步源,這些節(jié)點(diǎn)的數(shù)據(jù)手完成同步以后,再加入 Mycat 里。目前 1.3 版本的 Mycat 還沒(méi)有實(shí)現(xiàn)監(jiān)控MySQL 主從同步狀態(tài)的功能,因此這個(gè)過(guò)程里,DBA 可以先修改 MySQL 的密碼,讓 Mycat 無(wú)法鏈接故障服務(wù)器,等同步完成以后,恢復(fù)密碼,這樣 Mycat 就自動(dòng)重新將修復(fù)好的 Mycat 納管進(jìn)來(lái)了。
也就是說(shuō),當(dāng)主庫(kù)恢復(fù)后,需要手工重新配置主從同步。
讀寫(xiě)分離必須滿足如下條件,讀操作才能發(fā)往從節(jié)點(diǎn)執(zhí)行。
a)必須在schema.xml中配置readHost, 而且balance配置不為0。
b)SQL語(yǔ)句為select 或者show。
c)
在非事務(wù)中。當(dāng)然,也可以通過(guò)注釋/#mycat:db_type=slave, ... / 強(qiáng)制發(fā)從。
下面我們測(cè)試一下在事務(wù)中和在非事務(wù)中,select的表現(xiàn)。
先說(shuō)明一下我的環(huán)境,3306是主庫(kù),3307是從庫(kù)。
1、在 非事務(wù)中,可以看到通過(guò)mycat查詢的是3307 從庫(kù)的數(shù)據(jù):
mysql> select * from t1;
//查到的是從庫(kù)數(shù)據(jù) +------+ | id | +------+ |
3307
| +------+ 1
row in set (
0.00
sec) |
2、在 事務(wù)中,可以看到通過(guò)mycat查詢的是3306 主庫(kù)的數(shù)據(jù):
mysql> begin; Query OK,
0
rows affected (
0.00
sec) mysql> select * from t1;
//查到的是主庫(kù)數(shù)據(jù) +------+ | id | +------+ |
3306
| +------+ 1
row in set (
0.00
sec) |
3、使用 注解,讓 事務(wù)中的查詢, 強(qiáng)制讀從庫(kù):
mysql> begin; Query OK,
0
rows affected (
0.00
sec) mysql> select * from t1;
//看到select 在事務(wù)中讀了主庫(kù) +------+ | id | +------+ |
3306
| +------+ 1
row in set (
0.00
sec) mysql>
/*!mycat:db_type=slave*/
select * from t1;
//看到加了注解后,select 在事務(wù)中讀了從庫(kù) +------+ | id | +------+ |
3307
| +------+ 1
row in set (
0.01
sec) mysql> select * from t1;
//看到select 在事務(wù)中讀了主庫(kù) +------+ | id | +------+ |
3306
| +------+ 1
row in set (
0.00
sec) |
當(dāng)前題目:對(duì)mycat讀寫(xiě)分離主從切換策略的調(diào)研
URL標(biāo)題:http://muchs.cn/article34/pdgspe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、企業(yè)網(wǎng)站制作、靜態(tài)網(wǎng)站、網(wǎng)站收錄、網(wǎng)站內(nèi)鏈、微信小程序
聲明:本網(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)
猜你還喜歡下面的內(nèi)容