从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。
MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQLServer、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。
因为mycat有如此多让人感兴趣的点,所以赶紧开始学起来。
因为mycat是使用java开发的,所以安装运行mycat,需要有java环境支持,目前mycat最新版本依赖jdk1.7的支持,如果服务器没有安装jdk1.7,则需要提前准备安装好。安装jdk1.7,请参考Linux系统CentOS6.2版本下安装JDK7详细过程:http://blog.csdn.net/mchdba/article/details/38768513
Mycat是开源项目,所以可以在开源社区地址:http://code.google.com/p/MyCAT/目前最新代码暂时在淘宝上托管,二进制包下载地址:
http://code.taobao.org/svn/openclouddb/downloads/,windows环境可以下载Mycat-server-xxxx.ZIP,linux下可以下载tar.gz解开在某个目录下,因为从事互联网行业,所以习惯了linux在,这里就以centos系统为主,下载的包是Mycat-server-1.5-alpha-20151221110028-linux.tar。
下载完,上传到/soft目录,然后解压缩,如下所示:
[root@hch_test_pd_121_217 local]# tar -xvf /soft/Mycat-server-1.5-alpha-20151221110028-linux.tar.gz -C /usr/local mycat/bin/wrapper-linux-ppc-64 mycat/bin/wrapper-linux-x86-64 mycat/bin/wrapper-linux-x86-32 …… mycat/bin/startup_nowrap.sh mycat/bin/rehash.sh mycat/logs/ mycat/catlet/ [root@hch_test_pd_121_217 local]# ll /usr/local/mycat 总用量 24 drwxr-xr-x 2 root root 4096 4月 14 20:26 bin drwxrwxrwx 2 root root 4096 12月 13 16:55 catlet drwxrwxrwx 2 root root 4096 4月 14 20:26 conf drwxr-xr-x 2 root root 4096 4月 14 20:26 lib drwxrwxrwx 2 root root 4096 12月 13 16:55 logs -rwxrwxrwx 1 root root 215 12月 21 11:00 version.txt [root@hch_test_pd_121_217 local]# |
目录解释如下:
Bin 程序目录,存放了window版本和linux版本,除了提供封装成服务的版本之外,也提供了nowrap的shell脚本命令,方便大家选择和修改,进入到bin目录:
Warp方式的命令,可以安装成服务并启动或停止。
注:mycat必须依赖jdk1.7,在1.6的情景下会报错,如果机器未升级可以指定jdk的目录,我考了一个jdk的包出来的,添加的绝对路径,根据情况定。
wrapper.java.command= /usr/local/jdk1.7.0_55/bin/java
# Java Additional Parameters
wrapper.java.additional.5=-XX:MaxDirectMemorySize=2G
wrapper.java.additional.6=-Dcom.sun.management.jmxremote
# Initial Java Heap Size (in MB)
wrapper.java.initmemory=2048
# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=2048
这个内存值可以调整,目前版本最佳是2G到8G,4G设置比较稳定。
Conf目录下存放配置文件:
server.xml是Mycat服务器参数调整和用户授权的配置文件
schema.xml是逻辑库定义和表以及分片定义的配置文件
rule.xml是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改,需要重启Mycat或者通过9066端口reload。
autopartition-long.txt是规则文件,里面记录了一些分片规则
wrapper.conf是java参数配置文件,里面记录了一些java参数的配置,比如路径内存等
log4j.xml是日志配置文件,里面可以设置日志路径以及记录级别。
日志存放在logs目录,logs/mycat.log中,每天一个文件,日志的配置是在conf/log4j.xml中,根据自己的需要,可以调整输出级别为debug,debug级别下,会输出更多的信息,方便排查问题。
Mycat是数据库中间件,所以它连接的是数据库,需要准备好mysql数据库,linux下安装mysql数据库,可以参考:
mysql5.6.21自动化安装:http://blog.csdn.net/renfengjun/article/details/41635101
mysql5.7.11 批量一键式自动化安装:http://blog.csdn.net/mchdba/article/details/51138063
mysql5.7.10最新源码安装:http://blog.csdn.net/mchdba/article/details/50354213
mysql5.6.12源码安装过程:http://blog.csdn.net/mchdba/article/details/35994251
源码编译mysqlcluseter7.2.15安装:http://blog.csdn.net/mchdba/article/details/19854665
MySQL 使用mysqld_multi部署单机多实例详细过程:http://blog.csdn.net/mchdba/article/details/45798139
MySQL 最新版本5.6.13源码安装过程:http://blog.csdn.net/mchdba/article/details/10210847
mysql启动多个实例:http://blog.csdn.net/mchdba/article/details/11162037
CentOS6.3下源码安装MySQLGA 5.6.10:http://blog.csdn.net/mchdba/article/details/8646606
centos下安装percona5.5版本mysql:http://blog.csdn.net/mchdba/article/details/8646204
blog源地址:http://blog.csdn.net/mchdba/article/details/51155340,谢绝转载
在启动之前,在mysql服务器端配置里面my.cnf,添加大小写参数:
在MySQL的配置文件中my.ini [mysqld] 中增加一行
lower_case_table_names = 1
然后启动mysql服务器。
准备mycat中配置,因为启动mycat之前,需要配置mycat所管理连接的mysql数据库,这里管理的是192.168.121.61的mysql库,这些配置信息在schema.xml里面配置,如下所示:
<!—mycat配置中,先配置表company,标注数据节点dn1、dn2、dn3,然后再配置数据节点dn1、dn2、dn3.,然后再配置3个数据节点所涉及的数据源(这里安装只配置了一个mysql实例实际也可以配置多个mysql实例) -->
<!—定义mycat管理的表 --> <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> <table name="employee" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" /> <!—数据节点 --> <dataNode name="dn1" dataHost="dh1" database="db1" /> <dataNode name="dn2" dataHost="dh1" database="db2" /> <dataNode name="dn3" dataHost="dh1" database="db3" />
<!—数据源 --> <dataHost name="dh1" 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.121.61:3306" user="root" password=""> <!-- can have multi read hosts -->
</writeHost> <writeHost host="hostS1" url="192.168.121.61:3316" user="root" password="" /> </dataHost> |
在PATH添加mycat目录,vim /etc/profile:
PATH=/usr/local/mycat/bin:$PATH
然后执行source /etc/profile生效,再启动mycat::
[root@hch_test_pd_121_217 bin]# mycat --help Usage: /usr/local/mycat/bin/mycat { console | start | stop | restart | status | dump } [root@hch_test_pd_121_217 bin]# mycat start Starting Mycat-server... [root@hch_test_pd_121_217 bin]# |
启动成功,查看后台mycat日志:
[root@hch_test_pd_121_217 bin]# tail -fn200 ../logs/mycat.log 04/14 21:09:39.375 INFO [WrapperSimpleAppMain] (MycatServer.java:197) -=============================================== 04/14 21:09:39.376 INFO [WrapperSimpleAppMain] (MycatServer.java:198) -MyCat is ready to startup ... 04/14 21:09:39.376 INFO [WrapperSimpleAppMain] (MycatServer.java:208) -Startup processors ...,total processors:24,aio thread pool size:48 each process allocated socket buffer pool bytes ,buffer chunk size:4096 buffer pool's capacity(buferPool/bufferChunk) is:24000 04/14 21:09:39.377 INFO [WrapperSimpleAppMain] (MycatServer.java:209) -sysconfig params:SystemConfig [processorBufferLocalPercent=100, frontSocketSoRcvbuf=1048576, frontSocketSoSndbuf=4194304, backSocketSoRcvbuf=4194304, backSocketSoSndbuf=1048576, frontSocketNoDelay=1, backSocketNoDelay=1, maxStringLiteralLength=65535, frontWriteQueueSize=2048, bindIp=0.0.0.0, serverPort=8066, managerPort=9066, charset=utf8, processors=24, processorExecutor=48, timerExecutor=2, managerExecutor=2, idleTimeout=1800000, catletClassCheckSeconds=60, sqlExecuteTimeout=300, processorCheckPeriod=1000, dataNodeIdleCheckPeriod=300000, dataNodeHeartbeatPeriod=10000, clusterHeartbeatUser=_HEARTBEAT_USER_, clusterHeartbeatPass=_HEARTBEAT_PASS_, clusterHeartbeatPeriod=5000, clusterHeartbeatTimeout=10000, clusterHeartbeatRetry=10, txIsolation=3, parserCommentVersion=50148, sqlRecordCount=10, processorBufferPool=98304000, processorBufferChunk=4096, defaultMaxLimit=100, sequnceHandlerType=0, sqlInterceptor=org.opencloudb.interceptor.impl.DefaultSqlInterceptor, sqlInterceptorType=select, sqlInterceptorFile=/usr/local/mycat/logs/sql.txt, mutiNodeLimitType=0, mutiNodePatchSize=100, defaultSqlParser=druidparser, usingAIO=0, packetHeaderSize=4, maxPacketSize=16777216, mycatNodeId=1] 04/14 21:09:39.551 INFO [WrapperSimpleAppMain] (MycatServer.java:268) -using nio network handler 04/14 21:09:39.591 INFO [WrapperSimpleAppMain] (MycatServer.java:286) -$_MyCatManager is started and listening on 9066 04/14 21:09:39.592 INFO [WrapperSimpleAppMain] (MycatServer.java:290) -$_MyCatServer is started and listening on 8066 04/14 21:09:39.592 INFO [WrapperSimpleAppMain] (MycatServer.java:292) -=============================================== 04/14 21:09:39.592 INFO [WrapperSimpleAppMain] (MycatServer.java:295) -Initialize dataHost ... 04/14 21:09:39.592 INFO [WrapperSimpleAppMain] (PhysicalDBPool.java:294) -init backend myqsl source ,create connections total 10 for hostM1 index :0 04/14 21:09:39.593 INFO [WrapperSimpleAppMain] (PhysicalDatasource.java:373) -not ilde connection in pool,create new connection for hostM1 of schema db1 04/14 21:09:39.594 INFO [WrapperSimpleAppMain] (PhysicalDatasource.java:373) -not ilde connection in pool,create new connection for hostM1 of schema db2 04/14 21:09:39.596 INFO [WrapperSimpleAppMain] (PhysicalDatasource.java:373) -not ilde connection in pool,create new connection for hostM1 of schema db3 |
Mycat启动成功后,默认数据端口为8066,管理端口为9066。
客户端也可以用图形化的客户端如:mysqlworkbench、 navicat 、以及一些基于Java的数据库客户端来访问,注意要填写端口号8066,以及database 为TESTDB。
命令行运行:mysql-utest -ptest -h127.0.0.1 -P8066 -DTESTDB 就能访问OpenCloudDB了,以下操作都在此命令行里执行(JDBC则将mysql的URL中的端口3306改为8066即可),这里安装mycat的服务器没有安装mysql:
[root@hch_test_pd_121_217database]# mysql -utest -ptest -h127.0.0.1 -P8066 -DTESTDB
-bash: mysql:command not found
[root@hch_test_pd_121_217database]#
天空飘来5个字“那都不是事”,我们可以去已经安装好mysql的服务器,通过远程的方式访问:
[root@localhost ~]# mysql -utest -ptest -h192.168.121.217 -P8066 -DTESTDB Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.5.8-mycat-1.5-alpha-20151221110028 MyCat Server (OpenCloundDB)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> |
提示:访问MyCAT的用户账号和授权信息是在conf/server.xml文件中配置,而MyCAT用来连接后端MySQL库的用户名密码信息则在conf/schema.xml中,这是两套完全独立的系统,类似的还有MyCAT的逻辑库(schema),逻辑表(table)也是类似的。
开始创建company表并且录入数据:
--登8066窗口,在mycat命令行上执行: mysql> create table company(id int not null primary key,name varchar(100)); Query OK, 0 rows affected (0.01 sec)
--录入数据 mysql> insert into company(id,name) values(1,'hp'); Query OK, 1 row affected (0.00 sec)
mysql> insert into company(id,name) values(2,'ibm'); Query OK, 1 row affected (0.00 sec)
mysql> insert into company(id,name) values(3,'oracle'); Query OK, 1 row affected (0.01 sec)
--查看路由状况,会去3个数据节点上去check mysql> explain insert into company(id,name) values(1,'hp') -> ; +-----------+---------------------------------------------+ | DATA_NODE | SQL | +-----------+---------------------------------------------+ | dn1 | insert into company(id,name) values(1,'hp') | | dn2 | insert into company(id,name) values(1,'hp') | | dn3 | insert into company(id,name) values(1,'hp') | +-----------+---------------------------------------------+ 3 rows in set (0.01 sec) -- 查询录入的company数据 mysql> mysql> select * from company; |
PS:温馨提示àexplain可以用于任何正确的SQL上,其作用是告诉你,这条SQL会路由到哪些分片节点上执行,这对于诊断分片相关的问题很有帮助。另外,explain可以安全的执行多次,它仅仅是告诉你SQL的路由分片,而不会执行该SQL。
至此,mycat入门安装操作已经完成了,接下来就是师傅领进门,修行在个人了,^_^!
参考:mycat权威指南.pdf