MyCat 分庫表
此教程使用的是單表分兩庫
目錄
三:修改 schema.xml 邏輯庫的配置 主要配置的是邏輯庫,邏輯表,數據節點,和實際數據源之間的關係
ー:下載
目前只有 1.6.5版本 以上支持單庫分表。
下載,解壓使用即可。
解壓後,修改配置文件,在 mycat/conf 下
二:修改 server.xml MyCat 服務級別的配置
MyCat 的配置文件,設置賬號、參數等.
<!-- mycat的8066 端口連接的用戶名,密碼,邏輯數據庫名 -->
<user name="lsq" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">mydb</property>
</user>
設置 user name,password 及 schemas; 主要做的功能就是 邏輯庫與用戶 做映射。
name 和 password 在連接代理數據庫 MyCat 時使用;
schemas 是邏輯庫,要和 schema.xml 裏的 schema name 對應。
三:修改 schema.xml 邏輯庫的配置 主要配置的是邏輯庫,邏輯表,數據節點,和實際數據源之間的關係
mycat 邏輯數據庫、表的映射關係
mysql 數據節點、所屬物理數據庫的映射關係。
Mycat 對應的物理數據庫和數據庫表的配置
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mydb" checkSQLschema="true" sqlMaxLimit="100">
<table name="lsqtable" primaryKey="id" autoIncrement="true" dataNode="dn$1-2" rule="mod-long" />
<!-- <table name="jointable" primaryKey="id" type="global" dataNode="dn$1-2" autoIncrement="true" /> -->
</schema>
<dataNode name="dn1" dataHost="localhost1" database="mydb" />
<dataNode name="dn2" dataHost="localhost2" database="mydb" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100" maxRetryCount="4">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.85.128:3306" user="root" password="***">
</writeHost>
</dataHost>
<dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100" maxRetryCount="4">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.85.130:3306" user="root" password="***">
</writeHost>
</dataHost>
</mycat:schema>
schema name 要和 server.xml 對應上,既多個用戶擁有對該邏輯庫的權限。
<schema name="mydb">
city表 設置分表三張,單庫多表只能設置一個 datanote,rule 採用取模模式 mod-long 取模分片。
<table name="lsqtable" primaryKey="id" autoIncrement="true" dataNode="dn$1-2" rule="mod-long" />
writeHost 和 readHost 設爲同一數據庫。
四:修改 rule.xml
MyCat 分片(分庫分表)規則,mod-long 取模分片 取模列爲 id 取模算法爲 mod-long
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property>
</function>
此次選用默認的 mod-long 規則,只需修改 count 數.
修改 property count 等於 2。
這樣,配置已經完成。
五:修改 MySQL 數據庫
先在 MySQL 庫上,建 2 張表,lsqtable 。
啓動 Mycat
啓動:
./mycat start
查看啓動狀態:
./mycat status
停止:
./mycat stop
重啓(改變上面的 xml 配置不用重啓,管理端可以重新載入):
./mycat restart
查看 logs/ 下的 wrapper.log 和 mycat.log 可以查看運行時問題和異常。
mycat 啓動日誌:
cat ./logs/wrapper.log
mycat 應用日誌:
cat ./logs/mycat.log
六:測試
mysql 創建 mydb 數據庫,兩個數據源分別創建 lsqtable。
連接 mycat, 端口:8066,賬號:lsq, 密碼:123456 // 對應 server 表中的 user 標籤
執行 sql 語句,查看執行過程。
EXPLAIN
insert into lsqtable(id, l, s, q) VALUES (1, 'l1', 's1', 'q1')
可以分析 update 語句,或者 select 語句,可知偶數的 id 都被路由到了第一個庫,奇數的 id 都被路由到了第二個庫,因爲 datanode1 作爲第一個節點 0,datanode2 作爲第二個節點 1。使用除留餘數法,偶數的餘數都爲 0,而奇數的餘數都爲 1。打開 mysql 中的 mydb 數據庫 lsqtable 表可看到數據:
可查看執行過程路由到物理表 dn1 庫所在表上:
explain SELECT * FROM lsqtable WHERE id = 3
datanode sql
dn2 SELECT * FROM lsqtable WHERE id = 3
3 % 2 = 1 會路由到 1 的節點。dn2 在 xml 配置中屬於 1 的節點。從 0 開始