天天看點

mycat之分表分庫

環境:master:192.168.225.128  slave:192.168.225.129
master和slave上面各有兩個資料庫db01,db02。users表存放在db01,db02中都有,但是不做分表,查詢随機發送到哪台伺服器。item表其中一部分資料存放在master的db02中,另一部分資料存放在slave的db02中。
item_detail依賴父表進行分片(也即E-R分片政策),兩個表的關聯關系為t_user_detail.user_id=t_user.id。分片規則用取模的方式,如果在分表的時候還要做讀寫分離,隻需要在writeHost下面添加readhost選項即可。           

1,mycat安裝部署

參考上一篇博文:

link

2,修改配置檔案

[root@slave conf]# cat schema.xml
<?xml version="1.0"?>  
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">  
<mycat:schema xmlns:mycat="http://io.mycat/">
 
   <!-- 設定表的存儲方式.schema name="TESTDB" 與 server.xml中的 TESTDB 設定一緻  -->  
   <schema name="MYDB" checkSQLschema="false" sqlMaxLimit="100">  

   <!-- global表示全局表,即表示users表所有記錄都在node_db01中,不做拆分,如果user表很小,當業務需要這個表和其他大表進行join的時候,也可以-->
                    <!--将這個users表在每個庫中都儲存一份,隻需要在node_db01後面添加其他的庫名即可。-->  
       <table name="users" primaryKey="id" type="global" dataNode="node_db01" />
       <table name="item" primaryKey="id" dataNode="node_db02,node_db03" rule="mod-long">  
               <childTable name="item_detail" primaryKey="id" joinKey="item_id" parentKey="id" />  
       </table>  
   </schema>  
 
   <!-- 設定dataNode 對應的資料庫,及 mycat 連接配接的位址dataHost -->  
    <dataNode name="node_db01" dataHost="dataHost01" database="db01" />
   <dataNode name="node_db02" dataHost="dataHost01" database="db02" />  
   <dataNode name="node_db03" dataHost="dataHost02" database="db02" />  
 
   <!-- mycat 邏輯主機dataHost對應的實體主機.其中也設定對應的mysql登陸資訊 -->  
   <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">  
           <heartbeat>select user()</heartbeat>  
           <writeHost host="slave" url="192.168.225.129:3306" user="root" password="123456"/>  
   </dataHost>  
<dataHost name="dataHost02" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
           <heartbeat>select user()</heartbeat>
           <writeHost host="master" url="192.168.225.128:3306" user="root" password="123456"/>
   </dataHost>
</mycat:schema>             

3,測試:

create database db01;  
create database db02;  
 
CREATE TABLE users (  
   id INT NOT NULL AUTO_INCREMENT,  
   name varchar(50) NOT NULL default '',  
   indate DATETIME  default null,  
   PRIMARY KEY (id)  
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;  
 
CREATE TABLE item (  
   id INT NOT NULL AUTO_INCREMENT,  
   value INT NOT NULL default 0,  
   indate DATETIME default  NULL ,
   PRIMARY KEY (id)  
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;  
 
CREATE TABLE item_detail (  
   id INT NOT NULL AUTO_INCREMENT,  
   value INT NOT NULL default 0,  
   name varchar(50) NOT NULL default '',  
   item_id INT NOT NULL,  
   PRIMARY KEY (id),  
   key (item_id)  
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;  


#mysql -umy -p123456 -h192.168.225.129 -P8066
>insert into item(id,value,indate) values(1,100,now());  
>insert into item_detail(value,name,item_id) values('40','pad',1);  
>insert into item(id,value,indate) values(2,100,now());  
>insert into item_detail(value,name,item_id) values('50',phone,2);           

*實際生産環境:

** 在實際中ip1和ip2是主從關系,假設dataHost01對應db1,dataHost02對應db2,這樣ip1和ip2中存儲了db1的分片資料,ip3中存儲了db2的分片資料,在寫操作的時候,mycat會将對應資料寫入ip1,通過主從通過到ip2, 另一部分資料寫入ip3

在讀操作的時候,mycat會從ip2和ip3中擷取對應資料合并後傳回用戶端。配置如下:

<!-- mycat 邏輯主機dataHost對應的實體主機.其中也設定對應的mysql登陸資訊 -->  
   <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">  
           <heartbeat>select user()</heartbeat>  
           <writeHost host="slave" url="192.168.225.129:3306" user="root" password="123456"/>  
       <readHost host="third" url="192.168.225.130:3009" user="root" password="123456"/>
   </dataHost>  
<dataHost name="dataHost02" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
           <heartbeat>select user()</heartbeat>
           <writeHost host="master" url="192.168.225.128:3306" user="root" password="123456"/>
   </dataHost>
</mycat:schema>