什么是MYCAT:
一個(gè)徹底開源的,面向企業(yè)應(yīng)用開發(fā)的大數(shù)據(jù)庫集群
支持事務(wù)、ACID、可以替代MySQL的加強(qiáng)版數(shù)據(jù)庫
一個(gè)可以視為MySQL集群的企業(yè)級數(shù)據(jù)庫,用來替代昂貴的Oracle集群
一個(gè)融合內(nèi)存緩存技術(shù)、NoSQL技術(shù)、HDFS大數(shù)據(jù)的新型SQL Server
結(jié)合傳統(tǒng)數(shù)據(jù)庫和新型分布式數(shù)據(jù)倉庫的新一代企業(yè)級數(shù)據(jù)庫產(chǎn)品
一個(gè)新穎的數(shù)據(jù)庫中間件產(chǎn)品
?Mycat關(guān)鍵特性 :
支持SQL92標(biāo)準(zhǔn)
遵守Mysql原生協(xié)議,跨語言,跨平臺(tái),跨數(shù)據(jù)庫的通用中間件代理。
基于心跳的自動(dòng)故障切換,支持讀寫分離,支持MySQL主從,以及galera cluster集群。
支持Galera for MySQL集群,Percona Cluster或者M(jìn)ariaDB cluster
基于Nio實(shí)現(xiàn),有效管理線程,高并發(fā)問題。
支持?jǐn)?shù)據(jù)的多片自動(dòng)路由與聚合,支持sum,count,max等常用的聚合函數(shù),支持跨庫分頁。
支持單庫內(nèi)部任意join,支持跨庫2表join,甚至基于caltlet的多表join。
支持通過全局表,ER關(guān)系的分片策略,實(shí)現(xiàn)了高效的多表join查詢。
支持多租戶方案。
支持分布式事務(wù)(弱xa)。
支持全局序列號,解決分布式下的主鍵生成問題。
分片規(guī)則豐富,插件化開發(fā),易于擴(kuò)展。
強(qiáng)大的web,命令行監(jiān)控。
支持前端作為mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。
支持密碼加密
支持服務(wù)降級
支持IP白名單
支持SQL黑名單、sql注入攻擊攔截
支持分表(1.6)
集群基于ZooKeeper管理,在線升級,擴(kuò)容,智能優(yōu)化,大數(shù)據(jù)處理(2.0開發(fā)版)。
(官方說明參考:Mycat 數(shù)據(jù)庫分庫分表中間件?)
JDK 下載(建議要求jdk7及以上):
http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html
Linux x86 147.68 MB?jdk-7u80-linux-i586.tar.gz
MyCAT 相關(guān):
Mycat 捐贈(zèng)地址:http://www.mycat.io/donate.html
Mycat 官斱網(wǎng)站:http://www.mycat.io/
Mycat 源碼:https://github.com/MyCATApache/Mycat-Server
Mycat 下載地址:https://github.com/MyCATApache/Mycat-download
既然 mycat ?那么強(qiáng)大,那就測試看看:
#測試環(huán)境:
# 有3張表 users,item,item_detail (item 的子表) 和 3 個(gè)數(shù)據(jù)庫 db01,db02,db03
# 表 users 存儲(chǔ)在數(shù)據(jù)庫 db01, 表 item 和 item_detail 分布存儲(chǔ)在數(shù)據(jù) db01 和 db02?
# 現(xiàn)在在3個(gè)數(shù)據(jù)庫都創(chuàng)建相同的表
[sql]?view plaincopy
create?database?db01;?? create?database?db02;?? create?database?db03;?? ?? CREATE?TABLE?users?(?? ????id?INT?NOT?NULL?AUTO_INCREMENT,?? ????name?varchar(50)?NOT?NULL?default?'',?? ????indate?DATETIME?NOT?NULL?default?'0000-00-00?00:00:00',?? ????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?NOT?NULL?default?'0000-00-00?00:00:00',?? ????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;??
# JDK 安裝配置
[plain]?view plaincopy
cd?/usr/local/src?? tar?xvf?jdk-7u80-linux-i586.tar.gz?? mkdir?-p?/usr/local/java?? mv?/usr/local/src/jdk1.7.0_80?/usr/local/java/?? chown?-R?root:root?/usr/local/java?? cd?/usr/local/java/??
#配置環(huán)境變量
[plain]?view plaincopy
vi?/etc/profile??? vi?~/.bash_profile?? ?? export?JAVA_HOME=/usr/local/java/jdk1.7.0_80?? export?PATH=$PATH:$JAVA_HOME/bin?? export?CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar??
#設(shè)置生效(最好重啟系統(tǒng))
[plain]?view plaincopy
source?/etc/profile?? source?~/.bash_profile??
#測試是否安裝成功
[plain]?view plaincopy
[root@server1?~]#?java?-version?? java?version?"1.7.0_80"?? Java(TM)?SE?Runtime?Environment?(build?1.7.0_80-b15)?? Java?HotSpot(TM)?Client?VM?(build?24.80-b11,?mixed?mode)??
# Mycat 安裝配置
[plain]?view plaincopy
cd?/usr/local/src?? tar?xvf?Mycat-server-1.5.1-RELEASE-20160405120037-linux.tar.gz??? mv?/usr/local/src/mycat?/usr/local/?? ?? groupadd?mycat?? useradd?-g?mycat?mycat?? passwd?mycat?? chown?-R?mycat.mycat?/usr/local/mycat??
#添加環(huán)境變量
[plain]?view plaincopy
vi?/etc/profile?? vi?~/.bash_profile?? ?? export?MYCAT_HOME=/usr/local/mycat??
#設(shè)置生效(最好重啟系統(tǒng))
[plain]?view plaincopy
source?/etc/profile?? source?~/.bash_profile??
#服務(wù)器名和IP綁定
[plain]?view plaincopy
vi?/etc/hosts?? 192.168.100.50??server1?? 127.0.0.1???????server1??
# 設(shè)置 wrapper.java.command 的java 路徑
?( 同時(shí)可設(shè)置?-Xmx 和?-Xms ,參考:?mycat 啟動(dòng)失敗 The specified size exceeds the maximum representable size)
[plain]?view plaincopy
vi?/usr/local/mycat/conf/wrapper.conf?? ?? wrapper.java.command=%JAVA_HOME%/bin/java??
#配置 server.xml 和 schema.xml ?(本案例配置信息在文章底部)
[plain]?view plaincopy
vi?/usr/local/mycat/conf/server.xml?? vi?/usr/local/mycat/conf/schema.xml??
#啟動(dòng)mycat服務(wù) ./mycat?
{ console | start | stop | restart | status | dump }
[plain]?view plaincopy
/usr/local/mycat/bin/mycat?console??
[plain]?view plaincopy
#mycat?進(jìn)程?? ps?-ef?|?grep?mycat?? ?? #日子信息?? tail?-20?/usr/local/mycat/logs/wrapper.log??
測試:
#訪問 mycat ? (憑據(jù)參考 /usr/local/mycat/conf/server.xml)
[plain]?view plaincopy
mysql?-utest?-ptest?-h127.0.0.1?-P8066?-DTESTDB??
[sql]?view plaincopy
mysql>?show?databases;?? +?? |?DATABASE?|?? +?? |?TESTDB???|??? +?? ?? mysql>?show?tables;?? +?? |?Tables?in?TESTDB?|?? +?? |?item?????????????|??? |?item_detail??????|??? |?users????????????|??? +??
#在 mycat 中插入數(shù)據(jù)并查詢:
[sql]?view plaincopy
insert?into?users(name,indate)?values('kk',now());?? insert?into?item(id,value,indate)?values(1,100,now());?? insert?into?item_detail(value,name,item_id)?values('pad',40,1);?? insert?into?item_detail(value,name,item_id)?values('phone',50,1);?? ?? insert?into?item(id,value,indate)?values(999,100,now());?? insert?into?item_detail(value,name,item_id)?values('pad',40,999);?? insert?into?item_detail(value,name,item_id)?values('phone',50,999);??
[sql]?view plaincopy
mysql>?select?*?from?users;?? +?? |?id?|?name?|?indate??????????????|?? +?? |??1?|?kk???|?2016-04-13?06:28:00?|??? +?? ?? mysql>?select?*?from?item;?? +?? |?id??|?value?|?indate??????????????|?? +?? |?999?|???100?|?2016-04-13?06:34:12?|??? |???1?|???100?|?2016-04-13?06:32:58?|??? +?? ?? mysql>?select?*?from?item_detail;?? +?? |?id?|?value?|?name?|?item_id?|?? +?? |??1?|?????0?|?40???|?????999?|??? |??2?|?????0?|?50???|?????999?|??? |??1?|?????0?|?40???|???????1?|??? |??2?|?????0?|?50???|???????1?|??? +??
#打開另一個(gè)終端,使用mysql賬號登陸訪問查看表情況
[plain]?view plaincopy
mysql?-uroot?-ptest?-p??
#具體的表數(shù)據(jù)存儲(chǔ)情況:
[sql]?view plaincopy
?? mysql>?select?*?from?db01.users;?? +?? |?id?|?name?|?indate??????????????|?? +?? |??1?|?kk???|?2016-04-13?06:28:00?|??? +?? ?? mysql>?select?*?from?db02.users;?? ?? mysql>?select?*?from?db03.users;?? ?? ?? ?? mysql>?select?*?from?db01.item;?? ?? mysql>?select?*?from?db02.item;?? +?? |?id??|?value?|?indate??????????????|?? +?? |?999?|???100?|?2016-04-13?06:34:12?|??? +?? ?? mysql>?select?*?from?db03.item;?? +?? |?id?|?value?|?indate??????????????|?? +?? |??1?|???100?|?2016-04-13?06:32:58?|??? +?? ?? ?? ?? mysql>?select?*?from?db01.item_detail;?? ?? mysql>?select?*?from?db02.item_detail;?? +?? |?id?|?value?|?name?|?item_id?|?? +?? |??1?|?????0?|?40???|?????999?|??? |??2?|?????0?|?50???|?????999?|??? +?? ?? mysql>?select?*?from?db03.item_detail;?? +?? |?id?|?value?|?name?|?item_id?|?? +?? |??1?|?????0?|?40???|???????1?|??? |??2?|?????0?|?50???|???????1?|??? +??
測試完成!!~數(shù)據(jù)進(jìn)行了分庫分表!
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
#?server.xml 和 schema.xml 配置情況
[plain]?view plaincopy
#?vi?/usr/local/mycat/conf/server.xml?? ?? <?xml?version="1.0"?encoding="UTF-8"?>?? <!DOCTYPE?mycat:server?SYSTEM?"server.dtd">?? <mycat:server?xmlns:mycat="http://org.opencloudb/">?? ????????<system>?? ????????????<!--??? ????????????????<property?name="processors">32</property>?? ????????????????<property?name="processorExecutor">32</property>??? ????????????????<property?name="bindIp">0.0.0.0</property>??? ????????????????<property?name="frontWriteQueueSize">4096</property>?? ????????????????<property?name="idleTimeout">300000</property>?? ????????????????<property?name="mutiNodePatchSize">100</property>?? ????????????-->?? ????????????????<property?name="defaultSqlParser">druidparser</property>?? ????????????????<property?name="mutiNodeLimitType">1</property>?? ????????????????<property?name="serverPort">8066</property>?? ????????????????<property?name="managerPort">9066</property>??? ????????</system>?? ????????<!--?任意設(shè)置登陸?mycat?的用戶名,密碼,數(shù)據(jù)庫??-->?? ????????<user?name="test">?? ????????????????<property?name="password">test</property>?? ????????????????<property?name="schemas">TESTDB</property>?? ????????</user>?? ?? ????????<user?name="user">?? ????????????????<property?name="password">user</property>?? ????????????????<property?name="schemas">TESTDB</property>?? ????????????????<property?name="readOnly">true</property>?? ????????</user>?? ????????<!--??? ????????<quarantine>??? ???????????<whitehost>?? ??????????????<host?host="127.0.0.1"?user="mycat"/>?? ??????????????<host?host="127.0.0.2"?user="mycat"/>?? ???????????</whitehost>?? ???????<blacklist?check="false"></blacklist>?? ????????</quarantine>?? ????????-->?? </mycat:server>??
[plain]?view plaincopy
#?vi?/usr/local/mycat/conf/schema.xml?? ?? <?xml?version="1.0"?>?? <!DOCTYPE?mycat:schema?SYSTEM?"schema.dtd">?? <mycat:schema?xmlns:mycat="http://org.opencloudb/">?? ?? ????<!--?設(shè)置表的存儲(chǔ)方式.schema?name="TESTDB"?與?server.xml中的?TESTDB?設(shè)置一致??-->?? ????<schema?name="TESTDB"?checkSQLschema="false"?sqlMaxLimit="100">?? ????????<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>?? ?? ????<!--?設(shè)置dataNode?對應(yīng)的數(shù)據(jù)庫,及?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?邏輯主機(jī)dataHost對應(yīng)的物理主機(jī).其中也設(shè)置對應(yīng)的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="mysql"/>?? ????</dataHost>?? </mycat:schema>??
其他參考:
http://www.csdn.net/article/2015-07-16/2825228?(原理及應(yīng)用)
http://www.songwie.com/articlelist/50(理論和實(shí)踐 寫的好)
http://ly.blog.itpub.net/29733787/viewspace-2049139/(示例) ?MyCAT安裝使用及簡單測試?
http://www.cnblogs.com/ivictor/p/5111495.html(示例) ?MyCAT簡易入門
http://www.2cto.com/database/201503/385641.html(示例) Mycat水平分表,垂直分表實(shí)踐(2)
http://www.51testing.com/html/34/369434-3686088.html(示例)使用Mycat 做簡單的讀寫分離(一)
來源:http://blog.csdn.net/kk185800961/article/details/51147029
總結(jié)
以上是生活随笔為你收集整理的MySQL 高可用:mysql+mycat实现数据库分片(分库分表)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。