[toc]
## 了解配置項
Mycat的配置文件都在conf目錄里面,這里介紹幾個常用的文件:
| 文件 | 說明 |
| --- | --- |
| server.xml | Mycat的配置文件,設置賬號、參數等 |
| schema.xml | Mycat對應的物理數據庫和數據庫表的配置 |
| rule.xml | Mycat分片(分庫分表)規則 |
### **server.xml**
參考鏈接: [MyCat配置文件詳解--server.xml](https://www.cnblogs.com/linjiqin/p/7928573.html)
server.xml包含mycat的系統配置信息,它有兩個標簽,分別是user和system,掌握system標簽的各項配置屬性是mycat調優的關鍵。
重點關注下面這段,其他默認即可。
~~~
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<!-- 表級 DML 權限設置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
~~~
| 參數 | 說明 |
| --- | --- |
| user | 用戶配置節點 |
| \--name | 登錄的用戶名,也就是連接Mycat的用戶名 |
| \--password | 登錄的密碼,也就是連接Mycat的密碼 |
| \--schemas | 數據庫名,這里會和schema.xml中的配置關聯,多個用逗號分開,例如需要這個用戶需要管理兩個數據庫db1,db2,則配置db1,dbs |
| \--privileges | 配置用戶針對表的增刪改查的權限,具體見文檔吧 |
server.xml中的標簽本就不多,這個標簽主要用于定義登錄mycat的用戶和權限。例如上面的例子中,我定義了一個用戶,用戶名為test、密碼也為test,可訪問的schema也只有TESTDB一個
### **schema.xml**
參考鏈接: [MyCat-schema.xml詳解](https://www.cnblogs.com/icebutterfly/p/9505624.html)
Schema.xml作為MyCat中重要的配置文件之一,管理著MyCat的邏輯庫、表、分片規則、DataNode以及DataSource。弄懂這些配置,是正確使用MyCat的前提
~~~
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 數據庫配置,與server.xml中的數據庫對應 -->
<schema name="lunch" checkSQLschema="false" sqlMaxLimit="100">
<table name="lunchmenu" dataNode="dn1" />
<table name="restaurant" dataNode="dn1" />
<table name="userlunch" dataNode="dn1" />
<table name="users" dataNode="dn1" />
<table name="dictionary" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2" rule="mod-long" />
</schema>
<!-- 分片配置 -->
<dataNode name="dn1" dataHost="test1" database="lunch" />
<dataNode name="dn2" dataHost="test2" database="lunch" />
<!-- 物理數據庫配置 -->
<dataHost name="test1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user();</heartbeat>
<writeHost host="hostM1" url="192.168.0.2:3306" user="root" password="123456">
</writeHost>
</dataHost>
<dataHost name="test2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user();</heartbeat>
<writeHost host="hostS1" url="192.168.0.3:3306" user="root" password="123456">
</writeHost>
</dataHost>
</mycat:schema>
~~~
| 參數 | 說明 |
| --- | --- |
| schema | 數據庫設置,此數據庫為邏輯數據庫,name與server.xml中schema對應 |
| dataNode | 分片信息,也就是分庫相關配置 |
| dataHost | 物理數據庫,真正存儲數據的數據庫 |
每個節點的屬性逐一說明:
**schema**
| 屬性 | 說明 |
| --- | --- |
| name | 邏輯數據庫名,與server.xml中的schema對應 |
| checkSQLschema | 數據庫前綴相關設置,建議看文檔,這里暫時設為false |
| sqlMaxLimit | select 時默認的limit,避免查詢全表 |
**table**
| 屬性 | 說明 |
| --- | --- |
| name | 表名,物理數據庫中表名 |
| dataNode | 表存儲到哪些節點,多個節點用逗號分隔。節點為下文dataNode設置的name |
| primaryKey | 主鍵字段名,自動生成主鍵時需要設置 |
| autoIncrement | 是否自增 |
| rule | 分片規則名,具體規則下文rule詳細介紹 |
**dataNode**
| 屬性 | 說明 |
| --- | --- |
| name | 節點名,與table中dataNode對應 |
| datahost | 物理數據庫名,與datahost中name對應 |
| database | 物理數據庫中數據庫名 |
**dataHost**
| 屬性 | 說明 |
| --- | --- |
| name | 物理數據庫名,與dataNode中dataHost對應 |
| balance | 負載均衡的方式 |
| writeType | 寫入方式 |
| dbType | 數據庫類型 |
| heartbeat | 心跳檢測語句,注意語句結尾的分號要加。 |
>[info] 由上可見,配置順序應該是 dataHost→DataNode→schema→user(server.xml)
## 一個簡單的一主一從的配置讀寫分離
### **1. 參考前面的文章跑起基于GTID多線程主從復制**
```
主:172.25.0.3
從:172.25.0.4
```
> 一定要保證主從復制是正常運行的
### **2. 配置mycat**
#### 配置schema
~~~
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 定義MyCat的邏輯庫 -->
<schema name="m1" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"></schema>
<schema name="m2" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn2"></schema>
<schema name="m3" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn3"></schema>
<!-- 定義MyCat的數據節點 -->
<dataNode name="dn1" dataHost="datahost1" database="m1" />
<dataNode name="dn2" dataHost="datahost1" database="m2" />
<dataNode name="dn3" dataHost="datahost1" database="m3" />
<!-- 定義數據主機與讀寫分離及主從切換規則 -->
<dataHost name="datahost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<!-- switchType="2" 通過show slave status檢測主從狀態,當主宕機以后,發生切換,從變為主,原來的主變為從,這時候show slave
status就會發生錯誤,因為原來的主沒有開啟slave,不建議直接使用switch操作,而是在DB中做主從對調。 -->
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM1" url="mysql_master:3306" user="root"
password="123456">
<readHost host="hostS1" url="mysql_slave:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
~~~
#### 配置server
system標簽暫時保持不變
~~~
<!-- 用戶1,對應的MyCat邏輯庫連接到的數據節點對應的主機為主從復制集群,并通過MyCat實現了讀寫分離 -->
<user name="user1">
<property name="password">123456</property>
<property name="schemas">m1,m2,m3</property>
</user>
<!-- 用戶2,只讀權限-->
<user name="user2">
<property name="password">123456</property>
<property name="schemas">m1,m2,m3</property>
<property name="readOnly">true</property>
</user>
~~~
**3. 測試**
```
# 在mycat上執行
SELECT *,SLEEP(5) FROM `m1`.`table`
UPDATE `table` SET `title` = SLEEP(5) WHERE `id` = 1;
# 在主和從查看
SHOW PROCESSLIST;
```
## 參考鏈接
- [Mycat配置入門](https://github.com/MyCATApache/Mycat-Server/wiki/3.0-Mycat%E9%85%8D%E7%BD%AE%E5%85%A5%E9%97%A8)
- 【mysql的編程專題①】流程控制與其他語法
- 【mysql的編程專題②】觸發器
- 【mysql的編程專題③】內置函數
- 【mysql的編程專題④】存儲過程
- 【mysql的編程專題⑤】自定義函數
- 【mysql的編程專題⑥】視圖
- 【mysql的設計與優化專題(1)】ER圖,數據建模與數據字典
- 【mysql的設計與優化專題(2)】數據中設計中的范式與反范式
- 【mysql的設計與優化專題(3)】字段類型與合理的選擇字段類型
- 【mysql的設計與優化專題(4)】表的垂直拆分和水平拆分
- 【mysql的設計與優化專題(5)】慢查詢詳解
- 【mysql的設計與優化專題(6)】mysql索引攻略
- 【Mysql問題集錦(1)】mysql不能使用innodb存儲引擎
- 【Mysql進階技巧(2)】利用mysql生成唯一序號
- 【Mysql進階技巧(1)】MySQL的多表關聯與自連接
- 【Mysql高可用架構(1)】基于日志點的主從復制
- 【Mysql高可用架構(2)】主從管理的系統視圖
- 【Mysql高可用架構(3)】基于GTID的主從復制
- 【Mysql高可用架構(4)】在線變更復制類型
- 【Mysql高可用架構(5)】多源復制(多主一從)
- 【Mysql高可用架構(6)】多線程復制
- 【Mysql高可用架構(7)】在線設置復制過濾
- 【Mysql高可用架構(8)】解決主從不一致
- 【Mysql高可用架構(9)】初識mycat以及制作mycat鏡像
- 【Mysql高可用架構(10)】mycat配置mysql讀寫分離
- MyCat 集群部署(HAProxy + MyCat)
- 常用復雜sql語句整理