1. 安裝Java環境
MyCAT 是使用 JAVA 語言進行編寫開發,使用前需要先安裝 JAVA 運作環境(JRE),由于 MyCAT 中使用了JDK7 中的一些特性,是以要求必須在 JDK7 以上的版本上運作。
1.1 檢視是否已經安裝jdk
[root@localhost lmy]# rpm -qa | grep java
[root@localhost lmy]#
顯示沒有安裝jdk,若是存在centOS自帶的,openjdk,需要解除安裝。
1.2下載下傳安裝JDK
1.2.1首先建立檔案夾,然後下載下傳jdk,我下載下傳的是64位的jdk8,需要根據需要到下載下傳位址選擇自己所需的版本。
[root@localhost lmy]# cd /
[root@localhost /]# cd usr/local
[root@localhost local]# mkdir java
[root@localhost local]# cd java
[root@localhost java]# wget http://202.119.24.249/cache/9/02/download.oracle.com/bcd3e06fe42195d3f3496e6548f0152a/jdk-8u151-linux-x64.tar.gz
[root@localhost java]# ls
jdk-u151-linux-x64.tar.gz
1.2.2此時已經下載下傳好了jdk,接下來就是解壓配置了。
解壓
[root@localhost java]# tar -zxvf jdk-8u151-linux-x64.tar.gz
[root@localhost java]# ls
jdk1. jdk-u151-linux-x64.tar.gz
打開配置檔案
将下面的配置資訊放在最下面,儲存退出。(注意位址要根據自己的來寫。)
export JAVA_HOME=/usr/local/java/jdk1.
export JRE_HOME=/usr/local/java/jdk1./jre
export PATH=$PATH:/usr/local/java/jdk1./bin
export
CLASSPATH=./:/usr/local/java/jdk1./lib:/usr/local/java/jdk1./jre/lib
使配置生效
檢視Java版本
[root@localhost java]# java -version
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build .0_151-b12)
Java HotSpot(TM) -Bit Server VM (build -b12, mixed mode)
到這裡Java環境就安裝好了。
2. 安裝MySQL
2.1 解除安裝原有的mysql
首先檢視系統中是否已經安裝mysql
[root@localhost java]# rpm -qa | grep mysql
mysql-libs-.-.el6_5.x86_64
此時顯示系統中并沒有安裝mysql,如果已經安裝了,使用該指令解除安裝删除。
[root@localhost java]# rpm -e mysql //普通删除方式
[root@localhost java]# rpm -e --nodeps mysql // 強力删除模式,如果使用上面指令删除時,提示有依賴的其它檔案,則用該指令可以對其進行強力删除
2.2 通過yum來進行mysql的安裝
出現如下提示就表明安裝成功了!
我們可以檢視一下安裝完成的版本。
當然,此時我們安裝的并不是最新版本。我們可以啟動一下mysql看看。
2.3配置mysql
為root使用者設定密碼:
設定mysql開機啟動
[root@localhost java]# chkconfig mysqld on
[root@localhost java]# chkconfig --list | grep mysql
mysqld :off :off :on :on :on :on :off
接下來我們就可以登入我們的mysql資料庫了。
到這為止mysql也已經安裝完成了。
3. 安裝MyCat
MyCat的安裝比較簡單,隻要下載下傳下來解壓,然後就是編寫配置檔案了。
3.1 下載下傳解壓MyCat
此時我下載下傳的版本為1.6,你也可以根據自己的需要到下載下傳位址選擇需要的版本下載下傳。
[root@localhost java]# cd /usr/local/java/ //下載下傳到該目錄
[root@localhost java]# wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
[root@localhost java]# tar -zxvf Mycat-server--RELEASE--linux.tar.gz //解壓
[root@localhost java]# ls //可以看到解壓後的檔案夾名為mycat
jdk1_151
jdk-u151-linux-x64.tar.gz
mycat
Mycat-server--RELEASE--linux.tar.gz
測試啟動mycat.
Linux環境下啟動mycat的方式為:進入bin目錄下,使用 ./mycat start指令啟動。
[root@localhost bin]# ./mycat start
Starting Mycat-server...
3.2 測試MyCat
整體的結構是這樣的:有兩個表,一個user表,一個goods表。user表放在db01資料庫中,goods表使用分片的方法放在db02和db03資料庫中。雖然goods表被分片存儲在不同的資料庫中,但是通過MyCat通路goods表時仍然像一張表一樣。我們先在mysql中建立這三張表,然後通過MyCat将分片規則配置,再通過MyCat進行增删改查操作。
3.2.1建立資料庫和表
首先我們先在mysql中建立三個資料庫和這三張表。腳本分别如下:
create database db01;
use db01;
CREATE TABLE user (
id INT NOT NULL AUTO_INCREMENT,
name varchar() NOT NULL default '',
indate DATETIME NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id)
)AUTO_INCREMENT= ENGINE=InnoDB DEFAULT CHARSET=utf8;
create database db02;
use db02;
CREATE TABLE goods(
id INT NOT NULL AUTO_INCREMENT,
value INT NOT NULL default ,
indate DATETIME NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id)
)AUTO_INCREMENT= ENGINE=InnoDB DEFAULT CHARSET=utf8;
create database db03;
use db03;
CREATE TABLE goods(
id INT NOT NULL AUTO_INCREMENT,
value INT NOT NULL default ,
indate DATETIME NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id)
)AUTO_INCREMENT= ENGINE=InnoDB DEFAULT CHARSET=utf8;
3.2.2配置MyCat.
下面我們要配置三個檔案,在mycat/conf目錄裡面。
conf/server.xml 中定義使用者以及系統相關變量,如端口等.
conf/schema.xml 中定義邏輯庫,表、分片節點等内容.
conf/rule.xml 中定義分片規則.
以下為三個配置檔案。
server.xml
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<system>
<property name="defaultSqlParser">druidparser</property>
<property name="serverPort">8066</property>
<property name="managerPort">9066</property>
</system>
<!-- 新增一個user -->
<user name="mycat">
<property name="password">mycat</property>
<property name="schemas">TESTDB</property>
</user>
</mycat:server>
schema.xml
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 設定表的存儲方式.schema name="TESTDB" 與 server.xml中的 TESTDB 設定一緻 -->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="user" primaryKey="id" dataNode="node_db01" />
<table name="goods" primaryKey="id" dataNode="node_db02,node_db03" rule="rule1" />
</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="dataHost01" database="db03" />
<!-- mycat 邏輯主機dataHost對應的實體主機.其中也設定對應的mysql登陸資訊 -->
<dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="server1" url="127.0.0.1:3306" user="root" password="123456"/>
</dataHost>
</mycat:schema>
rule.xml
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<!-- 分片規則為模2運算 -->
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property>
</function>
</mycat:rule>
三個配置檔案配置完之後,重新開機mycat服務。
[root@localhost bin]# cd /usr/local/java/mycat/bin/
[root@localhost bin]# ./mycat restart
3.2.3測試結果
我們先通路mycat邏輯資料庫,此時的視角是看不出分庫分表的資訊,這些表就好像在一個資料庫中。
*補充:後來我在其它機器上實驗時,設定了兩個datahost,啟動mycat時一直報錯
[[email protected] conf]$ mysql -umycat -pmycat -h127.0.0.1 -P8066 -Dtestdb
ERROR 2003 (HY000): Can’t connect to MySQL server on ‘127.0.0.1’ (111)
我查找了server.xml schema.xml發現使用者名,密碼都沒有配置錯,端口也開放了,最後發現有一個datahost的沒有寫,希望以後對碰到此類問題的朋友有幫助。*
ok,現在我們可以往這兩個表中插入資料,看看mycat能否按照我們之前的規則,将資料插入到相應的資料庫表中。
insert into user(name,indate) values('hello',now());
insert into user(name,indate) values('world',now());
insert into goods(id,value,indate) values(,,now());
insert into goods(id,value,indate) values(,,now());
可以看到,對于mycat的邏輯表來說,資料已經插入成功了,但是實際上資料是否按照規則存在那三個資料庫中呢?我們登入實際的資料庫來檢視。
我們看到,插入到user表中的資料全部都在db01的user表中,插入到goods表中的資料分别放在了db02和db03資料庫中的goods表中。完美的完成了分庫分表的操作!