文章首發於【博客園-陳樹義】,點擊跳轉到原文《MyCat 入門:漫談 MyCat 配置系統》
上篇文章《MyCat 啟蒙:分布式系統的數據庫架構演變》中,我們通過一個項目從零到百萬級訪問的變化,展示了這個過程中的數據層架構變化。其中說到了數據層架構變化所帶來的三個問題:
- 讀寫數據源判斷
- 繁雜數據源地址
- 分表判斷
而 MyCat 最初就是為了解決這個問題而存在的,它能集中管理項目涉及到的所有數據庫連接,減少項目中非業務性代碼的編寫。了解了 MyCat 的誕生背景,我們這次就上手用一用這個框架。
話不多說,我們先通過一個簡單的例子讓 MyCat 跑起來。
運行MyCat服務器
提示:運行 MyCat 服務器需要安裝 JDK 和 MySQL,請確保你的服務器上已經正確安裝。
完成環境確認后,到 MyCat 官網下載 MyCat 的服務器包。MyCat 針對不同系統提供了不同的安裝包,我這邊下載的是 1.6.RELEASE 版本的 Mac 安裝包。
下載完成后解壓進入 bin 目錄,運行下面的命令運行 MyCat 服務器:
YuRongChandeMacBook-Pro:bin yurongchan$ ./mycat start
Starting Mycat-server...
查看 MyCat 安裝包目錄下的 logs/wrapper.log
日志,如果沒有報錯,那就是啟動成功了。
MyCat 安裝包默認為我們提供了有讀寫權限的賬號,賬號名為 root,密碼是 123456。下面我們直接用這個默認賬號在命令行上連接 MyCat。
mysql -uroot -p123456 -h127.0.0.1 -P8066
可以看到我們已經成功連上了 MyCat 服務器。MyCat 服務器默認定義了一個名為 TESTDB 的邏輯數據庫,並且也在該邏輯數據庫中定義了一些邏輯表。
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 row in set (0.01 sec)
mysql> use TESTDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| company |
| customer |
| customer_addr |
| employee |
| goods |
| hotnews |
| orders |
| order_items |
| travelrecord |
+------------------+
9 rows in set (0.00 sec)
但當你嘗試做一些 select 操作的時候,控制台會提示報錯,這是因為 MyCat 配置錯誤導致的。
如果我們要使用 MyCat 正確執行 select 語句的話,我們需要在 MySQL 中先創建三個數據庫,分別是:db1、db2、db3。
創建完成之后再創建 travelrecord 表。
create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int);
最后在 schema.xml 中保留一個 DataHost 節點:
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root"
password="root">
</writeHost>
</dataHost>
最后重啟 MyCat 服務器:
./mycat restart
之后連接 MyCat
mysql -uroot -p123456 -h127.0.0.1 -P8066
連接成功后嘗試運行相應的 SQL 語句:
mysql> use TESTDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from travelrecord;
+----+---------+------------+------+------+
| id | user_id | traveldate | fee | days |
+----+---------+------------+------+------+
| 1 | Victor | 2016-01-01 | 100 | 10 |
+----+---------+------------+------+------+
1 row in set (0.01 sec)
到這里,我們已經學會最基本的 MyCat 服務器啟動以及配置了。
MyCat的目錄結構
打開 MyCat 的目錄,我們可以看到 MyCat 主要包括了以下幾個文件夾:
其中 bin 目錄是 MyCat 的啟動目錄,conf 目錄是 MyCat 的配置文件目錄,lib 目錄是 MyCat 自身的 Jar 包以及所依賴 Jar 包的目錄,logs 目錄是日志目錄。
MyCat的配置文件
在這 MyCat 的目錄中,最重要的是 conf 目錄,這里面存放了 MyCat 所有的配置信息。在 conf 目錄中有三個重要的配置文件:schema.xml、server.xml、rule.xml。
schema.xml
schema.xml 文件定義了 MyCat 到底連接那個數據庫實例,連接這個數據庫實例的哪個數據庫。MyCat 一共有幾個邏輯數據庫,MyCat 一共有幾個邏輯表。
schema.xml 文件一共有四個配置節點:DataHost、DataNode、Schema、Table。
DataHost 節點定義了 MyCat 要連接哪個 MySQL 實例,連接的賬號密碼是多少。默認的 MyCat 為我們定義了一個名為 localhost1 的數據服務器(DataHost),它指向了本地(localhost)3306 端口的 MySQL 服務器,對應 MySQL 服務器的賬號是 root,密碼是 123456。
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
</writeHost>
<writeHost host="hostS1" url="localhost:3316" user="root" password="123456" />
</dataHost>
DataNode 節點指定了需要連接的具體數據庫名稱,其使用一個 dataHost 屬性指定該數據庫位於哪個數據庫實例上。默認的 MyCat 為我們創建了三個數據節點(DataNode),dn1 數據節點對應 localhost1 數據服務器上的 db1 數據庫,dn2 數據節點對應 localhost1 數據服務器上的 db2 數據庫,dn1 數據節點對應 localhost1 數據服務器上的 db3 數據庫。
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
Schema 節點定義了 MyCat 的所有邏輯數據庫,Table 節點定義了 MyCat 的所有邏輯表。默認的 MyCat 為我們定義了一個名為 TESTDB 的邏輯數據庫,在這個邏輯數據庫下又定義了名為 travaelrecord、company 等 6 個邏輯表。
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
……
</schema>
所以上面當我們登陸 MyCat 輸入show databases
會看到只有一個名為 TESTDB 的數據庫,這個就是 MyCat 的邏輯數據庫。
我們輸入show tables
可以看到 TESTDB 下對應的邏輯表。
server.xml
server.xml 定義了項目中連接 MyCat 服務器所需要的賬號密碼,以及該賬號能訪問那些邏輯數據庫。 server.xml 配置文件中有 System 和 User 兩個配置節點。
System 節點定義了連接 MyCat 服務器的系統配置信息。例如是否開啟實時統計功能,是否開啟全加班一致性檢測等。
<system>
<property name="useSqlStat">0</property> <!-- 1為開啟實時統計、0為關閉 -->
<property name="useGlobleTableCheck">0</property> <!-- 1為開啟全加班一致性檢測、0為關閉 -->
<property name="sequnceHandlerType">2</property>
<property name="processorBufferPoolType">0</property>
……
</system>
User 配置節點定義了連接 MyCat 服務器的賬號密碼,以及該賬號密碼所能進行的數據庫操作。默認的 MyCat 為我們創建了一個賬戶名為 root,密碼為 123456 的賬號,只能訪問 TESTDB 邏輯數據庫,並且定義了對相關表的操作權限。
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
</user>
rule.xml
rule.xml 定義了邏輯表使用哪個字段進行拆分,使用什么拆分算法進行拆分。rule.xml 中有兩個配置節點,分別是:TableRule 和 Function 配置節點。
TableRule 配置節點定義了邏輯表的拆分信息,例如使用哪個字段進行拆分,使用什么拆分算法。默認的 MyCat 為我們配置了一個名為 rule2 的表拆分規則,表示根據 user_id 字段進行拆分,拆分算法是 func1。
<tableRule name="rule2">
<rule>
<columns>user_id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
Function 配置節點則定義了具體的拆分算法。例如使用對 1000 取余的拆分算法,對 100 取余的拆分算分等等。默認的 MyCat 為我們定義了一個名為 func1 的拆分算法,這個拆分算法定義在 o.mycat.route.function.PartitionByLong 類中,並且還傳入了兩個參數值。
<function name="func1" class="io.mycat.route.function.PartitionByLong">
<property name="partitionCount">8</property>
<property name="partitionLength">128</property>
</function>
總結
到這里,我們就將 MyCat 的三個重要的配置文件講完了,相信大家應該對 MyCat 的基本使用和配置文件有了基礎的認識。
其實 MyCat 並不難,只要把 MyCat 的幾個配置文件弄熟悉了就可以了,也不需要去死記硬背,只需要用到的時候查詢一下就可以。
閱讀完如果有收獲,請點贊評論,將收獲分享給更多的人。