1.安裝jdk1.7
2.鏈接實際mysql數據庫
用命令行工具或圖形化客戶端,鏈接mysql,建立DEMO所用三個分片數據庫;(默認schema.xml中的配置須要三個庫)
CREATE database db1;
CREATE database db2;
CREATE database db3;
4.解壓Mycat-server-1.X.X.X-20150105144205-Linux.tar.gz 到/usr/local/mycat
4.修改 mycat配置文件
server.xml:這裏配置客戶端鏈接mycat 使用的用戶名和密碼,以及配置用戶對應的數據庫(邏輯庫,虛擬)
下面是默認配置(可不用修改):
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
</user>
schema.xml:因爲採用一個mysql,因此配一個寫和一個讀(同一個)
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="localhost:3307" user="root"
password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="localhost:3307" user="root" password="123456" />
</writeHost>
<!--<writeHost host="hostS1" url="localhost:3316" user="root"
password="123456" />-->
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
5.進入 /usr/local/mycat/bin (默認數據端口爲8066,管理端口爲9066)
執行./mycat start
顯示: Starting Mycat-server...java
6. 進入logs目錄,查看日誌,若是wrapper.log 報錯 java.NET.BindException: Address already in use 殺掉正在執行的相關java進程
ps -ef|grep java
kill -9 xxx
7.使用客戶端鏈接mycat
端口8066,用戶名root,密碼123456
成功後能夠看到 schema.xml中配置的邏輯表 如 employee等(假象)
查詢表時會報錯
7.確認:db一、db二、db3中沒有表 employeemysql
8.使用客戶端鏈接mycat,經過mycat建立表
create table employee (id int not null primary key,name varchar(100),sharding_id int not null);
而後查看 db1 和 db2 發現都已經建立了表 employee,幾乎同時建立。因爲employee表沒有配置到db3中,因此db3中沒有employee表
9.插入數據
insert into employee(id,name,sharding_id) values(1,'leader us',10000);
而後分去db1 和 db2數據庫中查詢 ,發現db1中的empoyee表有數據插入,可是db2中沒有。分片緣由
10.直接鏈接 db2
插入數據
insert into employee(id,name,sharding_id) values(2,'zhanghui',10010);算法
db2數據庫中新增一條數據:分片緣由
11.經過mycat查詢
select * from employee
返回兩條數據sql
12.分片測試:
根據規則sharding-by-intfile(分片枚舉)進行分片測試
employee邏輯表定義
<table name="employee" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile" />
能夠在rule.xml中找到 sharding-by-intfile 的定義
<tableRule name="sharding-by-intfile">
<rule>
<columns>sharding_id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
hash-int算法:
<function name="hash-int"
class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
</function>
partition-hash-int.txt根據這個文件進行分片
在mycat安裝目錄 conf目錄下可以找到這個 txt文件,裏面的內容以下:
10000=0
10010=1
至關於 值爲10000的數據 寫入0 分片;10010寫入1分片。 0 和1 表明分片序號。
步驟9 和10 的操做驗證了這個分片規則,這裏不重複
13.全局表測試:
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
注意 company表是 全局表,會冗餘存在個分區。數據庫
在mycat 客戶端執行:app
create table company(id int not null primary key,name varchar(100));
執行完後 db1 db2 db3 中都建立了company表工具
插入數據:
insert into company(id,name) values(1,'hp');測試
執行完成後,db1 db2 db2中都 寫入了這條數據ui