1. 程式人生 > >mycat分庫分表demo

mycat分庫分表demo

關於Mycat,它是一個阿里的開源專案,用來解決分庫分表的海量資料儲存和查詢優化,關於它的簡介,可以直接參考介紹:Mycat簡介

下面對自己的demo做個記錄:

我之前從192.168.68.3克隆了一臺伺服器192.168.68.6(關於克隆可以看我前面的文章),在192.168.68.6上面安裝了mysql(mysql安裝可以參考我前面的文章)

在192.168.68.3中可以沒有mysql(實際中已經安裝好了mysql的讀寫分離,我怕用這個當作mysql會對68.4/68.5機器上的資料造成影響),下面會提到這臺機器需要jdk,然後用這臺機器來安裝mycat,控制其它機器的mysql進行讀寫操作。

0.準備工作

Mycat是用java寫的,所以執行環境需要jdk的支援。我之前沒有裝,所以把安裝步驟說一下:

可以先試下自己有沒有裝java環境,我輸入java提示沒有該命令

1)linux版jdk下載:http://www.oracle.com/technetwork/java/archive-139210.html

由於我的虛擬機器是64位centos6.5,我下的是1.7.0_80的解壓版的

下載之後,我還是放在了/software資料夾下

學會用rz來傳檔案,直接yum install -y lrzsz安裝上傳檔案工具,安裝好之後,進入到要上傳的路徑下,直接rz命令,就可以將本地的檔案上傳到該路徑下。

2)解壓

我把他解壓到了/user/local路徑下 tar -zxvf jdkxxxxx -C /user/local

3)配置環境變數

解壓後,jdk的bin目錄所在的路徑是/usr/local/jdk1.7.0_80

所以在/etc/profile

export JAVA_HOME=/usr/local/jdk1.7.0_80
export PATH=$JAVA_HOME/bin:$PATH

然後source一下,source /etc/profile使配置檔案生效

這樣再java就有該命令了

1.下載Mycat

官方下載地址:http://dl.mycat.io/

我下的是1.6的解壓版

2.解壓mycat

同樣使用rz工具將它上傳到/software資料夾下 並解壓到/user/local路徑下(解壓後的檔名就叫做mycat)

進入到/usr/local/mycat/bin/

它下面的mycat是啟動檔案

./mycat start 啟動

./mycat stop 停止

./mycat restart 重啟

./mycat status 檢視mycat的啟動狀態

這樣mycat就安裝好了

3.mycat分庫分表例項

1)需求

前面也提到了,mycat安裝在了192.168.68.3這臺機器上,並且前提裝好了jdk。

192.168.68.6裝了個單機版的mysql。在這個上面,建立3個數據庫db1/db2/db3,這幾個庫中都建一張item(商品表)

建表語句很簡單

CREATE TABLE `item` (
  `id` int(11) NOT NULL COMMENT '主鍵id',
  `name` varchar(20) DEFAULT NULL COMMENT '名稱',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

到時想測試下操作192.168.68.3的mycat,進行讀和寫操作。它是怎麼把資料存到192.168.68.6的三個庫的各個表中,以及怎麼讀取 的。

在安裝目錄的/usr/local/mycat/conf資料夾下,是mycat的各種配置檔案儲存的地方。

而簡單的分庫分表操作,需要修改這三個配置檔案

schema.xml

server.xml

rule.xml

而檔案的修改,如果直接看可能不太方便,可以用notepad++等工具遠端連線

外掛的下載,地址如下:https://github.com/ashkulz/NppFTP/releases/

外掛的安裝,地址如下:https://www.cnblogs.com/beijinglaolei/p/7710825.html

 

schema.xml配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
		<!-- auto sharding by id (long) -->
		<table name="item" dataNode="dn1,dn2,dn3" rule="mod-long" />
	</schema>
	<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
		/> -->
	<dataNode name="dn1" dataHost="localhost1" database="db1" />
	<dataNode name="dn2" dataHost="localhost1" database="db2" />
	<dataNode name="dn3" dataHost="localhost1" database="db3" />

	<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="192.168.68.6:3306" user="root"
				   password="root">
		</writeHost>
	</dataHost>
</mycat:schema>

server.xml

<user name="root">
		<property name="password">root</property>
		<property name="schemas">TESTDB</property>
		
		<!-- 表級 DML 許可權設定 -->
		<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 -->
	</user>

注意使用者名稱連線的schema的TESTDB要和schema.xml和保持一致

而連線的預設埠是8066

我用的sqlyog工具,發現查不到表,而用命令列的客戶端連線,或使用Navicat連線都沒問題

INSERT INTO item(id, NAME) VALUES(1, 'a');
INSERT INTO item(id, NAME) VALUES(2, 'b');
INSERT INTO item(id, NAME) VALUES(3, 'c');
INSERT INTO item(id, NAME) VALUES(4, 'd');
INSERT INTO item(id, NAME) VALUES(5, 'f');
INSERT INTO item(id, NAME) VALUES(6, 'g');

SELECT * FROM item; 

插入了6條資料,可以看到查詢出來的不是按照順序的。

而看192.168.68.6的db1/db2/db3的庫

db1:

db2:

db3:

雖然分庫了,但可以通過排序將不同庫中的資料在查詢後,在mycat中排序

這可能算是最簡單的demo了。後續如果繼續深入學習,還會將學習筆記進行更新。