什么是MYCAT:
一个彻底开源的,面向企业应用开发的大数据库集群
支持事务、ACID、可以替代MySQL的加强版数据库
一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
一个新颖的数据库中间件产品
Mycat关键特性 :
支持SQL92标准
遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。
基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。
支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
基于Nio实现,有效管理线程,高并发问题。
支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页。
支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。
支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。
支持多租户方案。
支持分布式事务(弱xa)。
支持全局序列号,解决分布式下的主键生成问题。
分片规则丰富,插件化开发,易于扩展。
强大的web,命令行监控。
支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。
支持密码加密
支持服务降级
支持IP白名单
支持SQL黑名单、sql注入攻击拦截
支持分表(1.6)
集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。
(官方说明参考:Mycat 数据库分库分表中间件)
JDK 下载(建议要求jdk7及以上):
/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html
Linux x86 147.68 MBjdk-7u80-linux-i586.tar.gz
MyCAT 相关:
Mycat 捐赠地址:http://www.mycat.io/donate.html
Mycat 官斱网站:http://www.mycat.io/
Mycat 源码:/MyCATApache/Mycat-Server
Mycat 下载地址:/MyCATApache/Mycat-download
既然 mycat 那么强大,那就测试看看:
#测试环境:
# 有3张表 users,item,item_detail (item 的子表) 和 3 个数据库 db01,db02,db03
# 表 users 存储在数据库 db01, 表 item 和 item_detail 分布存储在数据 db01 和 db02
# 现在在3个数据库都创建相同的表
[sql]view plaincopycreatedatabasedb01; createdatabasedb02; createdatabasedb03; CREATETABLEusers( idINTNOTNULLAUTO_INCREMENT, namevarchar(50)NOTNULLdefault'', indateDATETIMENOTNULLdefault'0000-00-0000:00:00', PRIMARYKEY(id) )AUTO_INCREMENT=1ENGINE=InnoDBDEFAULTCHARSET=utf8; CREATETABLEitem( idINTNOTNULLAUTO_INCREMENT, valueINTNOTNULLdefault0, indateDATETIMENOTNULLdefault'0000-00-0000:00:00', PRIMARYKEY(id) )AUTO_INCREMENT=1ENGINE=InnoDBDEFAULTCHARSET=utf8; CREATETABLEitem_detail( idINTNOTNULLAUTO_INCREMENT, valueINTNOTNULLdefault0, namevarchar(50)NOTNULLdefault'', item_idINTNOTNULL, PRIMARYKEY(id), key(item_id) )AUTO_INCREMENT=1ENGINE=InnoDBDEFAULTCHARSET=utf8;
# JDK 安装配置
[plain]view plaincopycd/usr/local/src tarxvfjdk-7u80-linux-i586.tar.gz mkdir-p/usr/local/java mv/usr/local/src/jdk1.7.0_80/usr/local/java/ chown-Rroot:root/usr/local/java cd/usr/local/java/
#配置环境变量
[plain]view plaincopyvi/etc/profile vi~/.bash_profile exportJAVA_HOME=/usr/local/java/jdk1.7.0_80 exportPATH=$PATH:$JAVA_HOME/bin exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#设置生效(最好重启系统)
[plain]view plaincopysource/etc/profile source~/.bash_profile
#测试是否安装成功[plain]view plaincopy[root@server1~]#java-version javaversion"1.7.0_80" Java(TM)SERuntimeEnvironment(build1.7.0_80-b15) JavaHotSpot(TM)ClientVM(build24.80-b11,mixedmode)
# Mycat 安装配置
[plain]view plaincopycd/usr/local/src tarxvfMycat-server-1.5.1-RELEASE-040517-linux.tar.gz mv/usr/local/src/mycat/usr/local/ groupaddmycat useradd-gmycatmycat passwdmycat chown-Rmycat.mycat/usr/local/mycat
#添加环境变量
[plain]view plaincopyvi/etc/profile vi~/.bash_profile exportMYCAT_HOME=/usr/local/mycat
#设置生效(最好重启系统)
[plain]view plaincopysource/etc/profile source~/.bash_profile
#服务器名和IP绑定
[plain]view plaincopyvi/etc/hosts 192.168.100.50server1 127.0.0.1server1
# 设置 mand 的java 路径
( 同时可设置-Xmx 和-Xms ,参考:mycat 启动失败 The specified size exceeds the maximum representable size)
[plain]view plaincopyvi/usr/local/mycat/conf/wrapper.conf mand=%JAVA_HOME%/bin/java
#配置 server.xml 和 schema.xml (本案例配置信息在文章底部)
[plain]view plaincopyvi/usr/local/mycat/conf/server.xml vi/usr/local/mycat/conf/schema.xml
#启动mycat服务 ./mycat{ console | start | stop | restart | status | dump }
[plain]view plaincopy/usr/local/mycat/bin/mycatconsole
[plain]view plaincopy#mycat进程 ps-ef|grepmycat #日子信息 tail-20/usr/local/mycat/logs/wrapper.log
测试:
#访问 mycat (凭据参考 /usr/local/mycat/conf/server.xml)
[plain]view plaincopymysql-utest-ptest-h127.0.0.1-P8066-DTESTDB
[sql]view plaincopymysql>showdatabases; +----------+ |DATABASE| +----------+ |TESTDB| +----------+ mysql>showtables; +------------------+ |TablesinTESTDB| +------------------+ |item| |item_detail| |users| +------------------+
#在 mycat 中插入数据并查询:[sql]view plaincopyinsertintousers(name,indate)values('kk',now()); insertintoitem(id,value,indate)values(1,100,now()); insertintoitem_detail(value,name,item_id)values('pad',40,1); insertintoitem_detail(value,name,item_id)values('phone',50,1); insertintoitem(id,value,indate)values(999,100,now()); insertintoitem_detail(value,name,item_id)values('pad',40,999); insertintoitem_detail(value,name,item_id)values('phone',50,999);[sql]view plaincopymysql>select*fromusers; +----+------+---------------------+ |id|name|indate| +----+------+---------------------+ |1|kk|-04-1306:28:00| +----+------+---------------------+ mysql>select*fromitem; +-----+-------+---------------------+ |id|value|indate| +-----+-------+---------------------+ |999|100|-04-1306:34:12| |1|100|-04-1306:32:58| +-----+-------+---------------------+ mysql>select*fromitem_detail; +----+-------+------+---------+ |id|value|name|item_id| +----+-------+------+---------+ |1|0|40|999| |2|0|50|999| |1|0|40|1| |2|0|50|1| +----+-------+------+---------+
#打开另一个终端,使用mysql账号登陆访问查看表情况
[plain]view plaincopymysql-uroot-ptest-p
#具体的表数据存储情况:[sql]view plaincopy----------------------------------------- mysql>select*fromdb01.users; +----+------+---------------------+ |id|name|indate| +----+------+---------------------+ |1|kk|-04-1306:28:00| +----+------+---------------------+ mysql>select*fromdb02.users; mysql>select*fromdb03.users; ----------------------------------------- mysql>select*fromdb01.item; mysql>select*fromdb02.item; +-----+-------+---------------------+ |id|value|indate| +-----+-------+---------------------+ |999|100|-04-1306:34:12| +-----+-------+---------------------+ mysql>select*fromdb03.item; +----+-------+---------------------+ |id|value|indate| +----+-------+---------------------+ |1|100|-04-1306:32:58| +----+-------+---------------------+ ----------------------------------------- mysql>select*fromdb01.item_detail; mysql>select*fromdb02.item_detail; +----+-------+------+---------+ |id|value|name|item_id| +----+-------+------+---------+ |1|0|40|999| |2|0|50|999| +----+-------+------+---------+ mysql>select*fromdb03.item_detail; +----+-------+------+---------+ |id|value|name|item_id| +----+-------+------+---------+ |1|0|40|1| |2|0|50|1| +----+-------+------+---------+
测试完成!!~数据进行了分库分表!
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
#server.xml 和 schema.xml 配置情况
[plain]view plaincopy#vi/usr/local/mycat/conf/server.xml <?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEmycat:serverSYSTEM"server.dtd"> <mycat:serverxmlns:mycat="http://org.opencloudb/"> <system> <!-- <propertyname="processors">32</property> <propertyname="processorExecutor">32</property> <propertyname="bindIp">0.0.0.0</property> <propertyname="frontWriteQueueSize">4096</property> <propertyname="idleTimeout">300000</property> <propertyname="mutiNodePatchSize">100</property> --> <propertyname="defaultSqlParser">druidparser</property> <propertyname="mutiNodeLimitType">1</property> <propertyname="serverPort">8066</property> <propertyname="managerPort">9066</property> </system> <!--任意设置登陆mycat的用户名,密码,数据库--> <username="test"> <propertyname="password">test</property> <propertyname="schemas">TESTDB</property> </user> <username="user"> <propertyname="password">user</property> <propertyname="schemas">TESTDB</property> <propertyname="readOnly">true</property> </user> <!-- <quarantine> <whitehost> <hosthost="127.0.0.1"user="mycat"/> <hosthost="127.0.0.2"user="mycat"/> </whitehost> <blacklistcheck="false"></blacklist> </quarantine> --> </mycat:server>
[plain]view plaincopy#vi/usr/local/mycat/conf/schema.xml <?xmlversion="1.0"?> <!DOCTYPEmycat:schemaSYSTEM"schema.dtd"> <mycat:schemaxmlns:mycat="http://org.opencloudb/"> <!--设置表的存储方式.schemaname="TESTDB"与server.xml中的TESTDB设置一致--> <schemaname="TESTDB"checkSQLschema="false"sqlMaxLimit="100"> <tablename="users"primaryKey="id"type="global"dataNode="node_db01"/> <tablename="item"primaryKey="id"dataNode="node_db02,node_db03"rule="mod-long"> <childTablename="item_detail"primaryKey="id"joinKey="item_id"parentKey="id"/> </table> </schema> <!--设置dataNode对应的数据库,及mycat连接的地址dataHost--> <dataNodename="node_db01"dataHost="dataHost01"database="db01"/> <dataNodename="node_db02"dataHost="dataHost01"database="db02"/> <dataNodename="node_db03"dataHost="dataHost01"database="db03"/> <!--mycat逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息--> <dataHostname="dataHost01"maxCon="1000"minCon="10"balance="0"writeType="0"dbType="mysql"dbDriver="native"> <heartbeat>selectuser()</heartbeat> <writeHosthost="server1"url="127.0.0.1:3306"user="root"password="mysql"/> </dataHost> </mycat:schema>
其他参考:
/article/-07-16/2825228(原理及应用)
/articlelist/50(理论和实践 写的好)
http://ly./29733787/viewspace-2049139/(示例) MyCAT安装使用及简单测试
/ivictor/p/5111495.html(示例) MyCAT简易入门
/database/03/385641.html(示例) Mycat水平分表,垂直分表实践(2)
/html/34/369434-3686088.html(示例)使用Mycat 做简单的读写分离(一)
来源:/kk185800961/article/details/51147029