目前,我們的writehost只設置了一個主庫,當主庫宕機后,通過mycat的 讀寫請求會全部報錯,如下所示:
讀請求:
mysql> select * from t1; ERROR
1184
(HY000): 拒絕連接 |
寫請求:
mysql> insert into t1 values (
2
); ERROR
1184
(HY000): 拒絕連接 |
上面看到,如果只設置一個writehost,主庫宕機后,并不會自動切換,所有的 讀寫請求全部受影響。
為了解決這個我們,我們可以設置多個writehost,當主庫宕機后,自動把寫請求切換到從節點。
我們的生產環境是一主一從,我們可以把兩個節點都設置為writehost,這樣如果writehost1(主庫)宕機后,mycat會自動把 寫請求全部轉移到writehost2(從庫)上。
原來配置:
[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";
說明: switchType:
<writeHost host=
"allinmd-mysql-3"
url=
"
192.168.174.30:3307"
user=
"root"
password=
"123456"
/>
這樣配置后,當主庫宕機后,寫請求就會自動轉移到從庫上,從而保證業務正??捎?。
當原主庫恢復后,它將不能納入mycat的管理(blance=3)。也就是說,原主庫恢復后,mycat不會把寫請求發送到原主庫。這是由conf/dnindex.properties來決定的。
下面是mycat官方文檔的說明,摘錄在這。
正常情況下,Mycat 會將第一個 writeHost 作為寫節點,所有的 DML SQL 會發送給此節點,若 Mycat 開啟了讀寫分離,則查詢節點會根據讀寫分離的策略發readHost(+writeHost)上執行,當一個 dataHost 里面配置了兩個或多個 writeHost 的情況下,如果第一個 writeHost 宕機,則 Mycat 會在默認的3 次心跳檢查失敗后,自動切換到下一個可用的 writeHost 執行 DML SQL 語句,并在 conf/dnindex.properties文件里記錄當前所用的 writeHost 的 index(第一個為 0,第二個為 1,依次類推),注意,此文件不能刪除和擅自改變,除非你深刻理解了它的作用以及你的目的。
那么問題來了,當原來配置的 MySQL 寫節點宕機恢復以后,怎么重新加入 Mycat,要不要恢復為原來的寫節點?關于這個問題,我們也曾與 DBA 討論很久,最終的建議方案是,保持現有狀態不變,改旗易幟,恢復后的MySQL 節點作為從節點,跟隨新的主節點,重新配置主從同步,原先跟隨該節點做同步的其他節點也同樣換帥,重新配置同步源,這些節點的數據手完成同步以后,再加入 Mycat 里。目前 1.3 版本的 Mycat 還沒有實現監控MySQL 主從同步狀態的功能,因此這個過程里,DBA 可以先修改 MySQL 的密碼,讓 Mycat 無法鏈接故障服務器,等同步完成以后,恢復密碼,這樣 Mycat 就自動重新將修復好的 Mycat 納管進來了。
也就是說,當主庫恢復后,需要手工重新配置主從同步。
讀寫分離必須滿足如下條件,讀操作才能發往從節點執行。
a)必須在schema.xml中配置readHost, 而且balance配置不為0。
b)SQL語句為select 或者show。
c)
在非事務中。當然,也可以通過注釋/#mycat:db_type=slave, ... / 強制發從。
下面我們測試一下在事務中和在非事務中,select的表現。
先說明一下我的環境,3306是主庫,3307是從庫。
1、在 非事務中,可以看到通過mycat查詢的是3307 從庫的數據:
mysql> select * from t1;
//查到的是從庫數據 +------+ | id | +------+ |
3307
| +------+ 1
row in set (
0.00
sec) |
2、在 事務中,可以看到通過mycat查詢的是3306 主庫的數據:
mysql> begin; Query OK,
0
rows affected (
0.00
sec) mysql> select * from t1;
//查到的是主庫數據 +------+ | id | +------+ |
3306
| +------+ 1
row in set (
0.00
sec) |
3、使用 注解,讓 事務中的查詢, 強制讀從庫:
mysql> begin; Query OK,
0
rows affected (
0.00
sec) mysql> select * from t1;
//看到select 在事務中讀了主庫 +------+ | id | +------+ |
3306
| +------+ 1
row in set (
0.00
sec) mysql>
/*!mycat:db_type=slave*/
select * from t1;
//看到加了注解后,select 在事務中讀了從庫 +------+ | id | +------+ |
3307
| +------+ 1
row in set (
0.01
sec) mysql> select * from t1;
//看到select 在事務中讀了主庫 +------+ | id | +------+ |
3306
| +------+ 1
row in set (
0.00
sec) |
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。