來源:https://segmentfault.com/a/1190000009495748php
參考文檔:Mycat安裝與使用java
環境 | 版本 |
---|---|
windows | 10 |
java | 1.8.0 |
mysql | 5.7.17 |
navicat for mysql | 10 |
PS:MyCAT使用Java開發,用到了JDK 7的部分功能,因此在使用前請確保安裝了JDK 7.0,並設置了正確的Java環境變量(可在命令行窗口輸入:「java –version」獲知是否安裝成功,以及獲取JDK的版本)。node
下載1.6版本mysql
下載地址git
F盤新建mycat-server文件夾,解壓Mycat-server-1.6-RELEASE-20161028204710-win.tar.gz,獲得mycat文件夾github
將數據水平分佈到不一樣的DB或table中,在經過相應的DB路由][1] 或者table路由規則找到須要查詢的具體的DB或者table以進行Query操做,好比根據用戶ID將用戶表切分到多臺數據庫上。web
將某個訪問極其頻繁的表再按照某個字段的某種規則來分散到多個表之中,每一個表中包含一部分數據。sql
例如,全部數據都是和用戶關聯的,那麼咱們就能夠根據用戶來進行水平拆分,將不一樣用戶的數據切分到不一樣的數據庫中。數據庫
如今互聯網很是火爆的web 2.0類型的網站,基本上大部分數據都可以經過會員用戶信息關聯上,可能不少核心表都很是適合經過會員ID來進行數據的水平切分。而像論壇社區討論系統,就更容易切分了,很是容易按照論壇編號來進行數據的水平切分。切分以後基本上不會出現各個庫之間的交互。segmentfault
優勢:
表關聯基本可以在數據庫端所有完成;
不會存在某些超大型數據量和高負載的表遇到瓶頸的問題;
應用程序端總體架構改動相對較少;
事務處理相對簡單;
只要切分規則可以定義好,基本上較難遇到擴展性限制。
缺點:
切分規則相對複雜,很難抽象出一個可以知足整個數據庫的切分規則;
後期數據的維護難度有所增長,人爲手工定位數據更困難;
應用系統各模塊耦合度較高,可能會對後面數據的遷移拆分形成必定的困難。
MyCAT使用MySQL的通信協議模擬成一個MySQL服務器,並創建了完整的Schema(數據庫)、Table (數據表)、User(用戶)的邏輯模型。
schema 是實際邏輯庫的配置,多個schema表明多個邏輯庫。
DataNode是MyCAT的邏輯數據節點,映射到後端的某一個物理數據庫的一個Database,爲了作到系統高可用,每一個DataNode能夠配置多個引用地址(DataSource),當主DataSource被檢測爲不可用時,系統會自動切換到下一個可用的DataSource上,這裏的DataSource便可認爲是Mysql的主從服務器的地址。dataNode是邏輯庫對應的分片,若是配置多個分片只須要多個dataNode便可。
dataHost是實際的物理庫配置地址,能夠配置多主主從等其餘配置,多個dataHost表明分片對應的物理庫地址,下面的writeHost、readHost表明該分片是否配置多寫,主從,讀寫分離等高級特性。
這裏主要是爲了熟悉mycat,表字段很省略
CREATE DATABASE IF NOT EXISTS `weibo_simple`;
-- ------------------------------------ -- Table structure for `t_users` 用戶表 -- ------------------------------------ DROP TABLE IF EXISTS `t_users`; CREATE TABLE `t_users` ( `user_id` varchar(64) NOT NULL COMMENT '註冊用戶ID', `user_email` varchar(64) NOT NULL COMMENT '註冊用戶郵箱', `user_password` varchar(64) NOT NULL COMMENT '註冊用戶密碼', `user_nikename` varchar(64) NOT NULL COMMENT '註冊用戶暱稱', `user_creatime` datetime NOT NULL COMMENT '註冊時間', `user_status` tinyint(1) NOT NULL COMMENT '驗證狀態 1:已驗證 0:未驗證', `user_deleteflag` tinyint(1) NOT NULL COMMENT '刪除標記 1:已刪除 0:未刪除', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ------------------------------------- -- Table structure for `t_message`微博表 -- ------------------------------------- DROP TABLE IF EXISTS `t_message`; CREATE TABLE `t_message` ( `messages_id` varchar(64) NOT NULL COMMENT '微博ID', `user_id` varchar(64) NOT NULL COMMENT '發表用戶', `messages_info` varchar(255) DEFAULT NULL COMMENT '微博內容', `messages_time` datetime DEFAULT NULL COMMENT '發佈時間', `messages_commentnum` int(12) DEFAULT NULL COMMENT '評論次數', `message_deleteflag` tinyint(1) NOT NULL COMMENT '刪除標記 1:已刪除 0:未刪除', `message_viewnum` int(12) DEFAULT NULL COMMENT '被瀏覽量', PRIMARY KEY (`messages_id`), KEY `user_id` (`user_id`), CONSTRAINT `t_message_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `t_users` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/** user 節點測試表 */ DROP TABLE IF EXISTS `t_node`; CREATE TABLE `t_node` ( `node_id` int(11) NOT NULL COMMENT 'ID', `user_id` int(11) NOT NULL COMMENT '用戶ID', `node_note` varchar(256) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'note', `node_createtime` datetime NOT NULL, PRIMARY KEY (`vid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='note表';
<!-- 開啓實時統計 --> <property name="useSqlStat">1</property> <!-- 1爲開啓實時統計、0爲關閉 --> <!-- 去掉註釋 --> <property name="maxStringLiteralLength">65535</property> <property name="sequnceHandlerType">0</property> <property name="backSocketNoDelay">1</property> <property name="frontSocketNoDelay">1</property> <!-- 添加user --> <user name="mycat"> <property name="password">mycat</property> <property name="schemas">mycat</property> </user>
添加weibo_simple數據庫的dataNode設置,並添加t_users和t_message表的schema設置,本次配置了雙主,讀寫分離配置,同一個表多個分片的配置能夠用dataNode="dn$1-100" 通配方式。
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!-- 與server.xml中user的schemas名一致 --> <schema name="mycat" checkSQLschema="true" sqlMaxLimit="100"> <table name="t_users" primaryKey="user_id" dataNode="dn1,dn2" rule="rule1"/> <table name="t_node" primaryKey="node_id" autoIncrement="true" dataNode="dn1,dn2" rule="rule1" /> <table name="t_message" type="global" primaryKey="messages_id" dataNode="dn1,dn2" /> </schema> <dataNode name="dn1" dataHost="jdbchost" database="weibo_simple" /> <dataNode name="dn2" dataHost="jdbchost2" database="weibo_simple" /> <dataHost name="jdbchost" maxCon="500" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select 1</heartbeat> <writeHost host="maste1" url="192.168.0.1:3306" user="root" password="root"> </writeHost> <writeHost host="maste2" url="192.168.0.3:3306" user="root" password="root"> </writeHost> </dataHost> <dataHost name="jdbchost2" maxCon="500" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select 1</heartbeat> <writeHost host="maste1" url="192.168.0.5:3306" user="root" password="root"> </writeHost> <writeHost host="maste2" url="192.168.0.6:3306" user="root" password="root"> </writeHost> </dataHost> </mycat:schema>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:rule SYSTEM "rule.dtd"> <mycat:rule xmlns:mycat="http://io.mycat/"> <tableRule name="rule1"> <rule> <columns>user_id</columns> <algorithm>func1</algorithm> </rule> </tableRule> <function name="func1" class="io.mycat.route.function.PartitionByLong"> <property name="partitionCount">8</property> <property name="partitionLength">128</property> </function> </mycat:rule>
<!-- 默認info改成debug --> <asyncRoot level="debug" includeLocation="true">
啓動mycat數據庫
命令行
F:\mycat-server\mycat\bin>startup_nowrap.bat
啓動成功
打開navicat for mysql 創建mycat鏈接
在mycat數據庫插入數據,數據同步到mysql實際數據庫中
--server.xml:是Mycat服務器參數調整和用戶受權的配置文件。 --schema.xml:是邏輯庫定義和表以及分片定義的配置文件。 --rule.xml:是分片規則的配置文件,分片規則的具體一些參數信息單獨存放爲文件,也在這個目錄下,配置文件修改須要重啓MyCAT。 --log4j.xml:日誌存放在logs/log中,天天一個文件,日誌的配置是在conf/log4j.xml中,根據本身的須要能夠調整輸出級別爲debug debug級別下,會輸出更多的信息,方便排查問題。 --autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties, sequence_db_conf.properties 分片相關的id分片規則配置文件 --lib MyCAT自身的jar包或依賴的jar包的存放目錄。 --logs MyCAT日誌的存放目錄。日誌存放在logs/log中,天天一個文件