mycat - 解开它神秘的面纱

-->引言mycat

从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。

 

MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQLServer、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

 

因为mycat有如此多让人感兴趣的点,所以赶紧开始学起来。

 

 

1,版本下载

因为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。

 

 

2,进行安装

 下载完,上传到/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目录:

  • Windows 下 运行: mycat.bat  console 在控制台启动程序,也可以装载成服务,若此程序运行有问题,也可以运行startup_nowrap.bat,确保java命令可以在命令执行。
  • Linux下运行:nohup sh  mycat  console &,首先要chmod +x mycat

Warp方式的命令,可以安装成服务并启动或停止。

  • mycat install (可选)
  • mycat start

 

 

3,JDK参数配置

注: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设置比较稳定。

 

 

4,Conf配置文件解读

Conf目录下存放配置文件:

server.xml是Mycat服务器参数调整和用户授权的配置文件

schema.xml是逻辑库定义和表以及分片定义的配置文件

rule.xml是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改,需要重启Mycat或者通过9066端口reload。

autopartition-long.txt是规则文件,里面记录了一些分片规则

wrapper.conf是java参数配置文件,里面记录了一些java参数的配置,比如路径内存等

log4j.xml是日志配置文件,里面可以设置日志路径以及记录级别。

 

 

5,Logs文件夹

日志存放在logs目录,logs/mycat.log中,每天一个文件,日志的配置是在conf/log4j.xml中,根据自己的需要,可以调整输出级别为debug,debug级别下,会输出更多的信息,方便排查问题。

 

 

6,准备mysql服务器

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,谢绝转载

 

 

7,启动mycat

在启动之前,在mysql服务器端配置里面my.cnf,添加大小写参数:

在MySQL的配置文件中my.ini [mysqld] 中增加一行

  lower_case_table_names = 1

然后启动mysql服务器。

 

准备mycat中配置,因为启动mycat之前,需要配置mycat所管理连接的mysql数据库,这里管理的是192.168.121.61的mysql库,这些配置信息在schema.xml里面配置,如下所示:

 

        

      

       

       

 

       

       

                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

                select user()

               

               

                        password="">

                       

 

               

               

                        password="" />

       

 

在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

 

 

8,访问管理mycat

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)也是类似的。

 

 

9,简易操作mycat

开始创建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;
+----+--------+
| id | name   |
+----+--------+
|  1 | hp     |
|  2 | ibm    |
|  3 | oracle |
+----+--------+
3 rows in set (0.06 sec)


mysql> 

 

PS:温馨提示àexplain可以用于任何正确的SQL上,其作用是告诉你,这条SQL会路由到哪些分片节点上执行,这对于诊断分片相关的问题很有帮助。另外,explain可以安全的执行多次,它仅仅是告诉你SQL的路由分片,而不会执行该SQL。

 

至此,mycat入门安装操作已经完成了,接下来就是师傅领进门,修行在个人了,^_^!

 

参考:mycat权威指南.pdf

 

 

 

你可能感兴趣的:(mycat)