Mycat源码调试环境搭建

在研究mycat源码之前必须先把环境搭建好。这篇文章的目标就是搭建mycat源码调试环境。环境主要包括:

  • git
  • jdk
  • maven
  • eclipse
  • mysql

这里假设你知道上面的知识点。我们搭建的环境所处于的操作系统是Windows7+。下面将一步一步讲解如何搭建源码调试环境:

1. 环境搭建

1.1 获取mycat源码

mycat源码托管在github上面,为了以后实时获取源码,我们需要先安装并配置好git客户端,请根据以下教程安装配置好git:

git安装教程

安装成功后,我们在本地某个文件路径下,鼠标右键打开Git Bash,执行以下命令将代码克隆到当前文件路径:

1
git clone https://github.com/MyCATApache/Mycat-Server.git

使用以下命令切换到最新1.6分支:

1
git checkout -b 1.6 origin/1.6

如果你对这个项目感兴趣并希望为mycat贡献代码,那么可以fork mycat代码到你个人的github上,然后从你自己fork的项目地址上面拉取代码。

1.2 安装jdk

jdk版本要求7或者更高。我们需要安装jdk并配置java环境变量。jdk的安装和环境变量的配置请参考:

JDK安装与环境变量配置

1.3 安装maven

mycat项目源码使用maven进行依赖管理、编译打包。因此我们需要安装maven并配置好,请参考以下教程进行配置:

Maven的安装及配置

1.4 安装配置eclipse

eclipse是开发Java项目常用的IDE,我们使用它来进行源码阅读和调试。eclipse可以在eclipse官网下载: https://www.eclipse.org/downloads/

我个人习惯使用STS——Spring Tool Suite,也是eclipse的一个扩展,可以在这个地址下载: http://spring.io/tools/sts/

完成后打开eclipse,配置maven使用我们自己下载的maven:

Windows -> Preferences -> Maven -> Installations

点击Add添加你的maven根目录,勾选你自己的maven,如下所示:

eclipse-maven-setting

最后点击OK确定即可。

eclipse和maven都依赖jdk环境,所以务必在安装之前先安装好jdk并配置好相应的环境变量。

1.5 导入mycat源码

完成上面配置后,就可以导入我们之前拉取的mycat源码:

File -> Import 选择 Existing Maven Projects,浏览选择我们clone的mycat源码,点击确定开始进行导入。第一次导入需要等待maven下载插件以及mycat项目需要用到的第三方依赖库,等待时间相对长一点。成功完成导入后的项目如下所示:

eclipse-mycat-project-structure

1.6 安装配置mysql

为了能够更方便地在本地开发环境调试mycat,我们最后还需要在我们的机器上安装mysql。建议windows下下载mysql绿色版,然后通过简单配置完成mysql的安装,具体参考以下教程:

Windows 下绿色安装Mysql 5.7 (zip压缩包)

根据上面教程使用root账号成功登陆mysql之后,建议修改root密码,eg:

1
mysql > set password = password('your password');

好了,到这里,我们的环境就算搭建完成了,下面我们将介绍如何在eclipse中根据mycat源码启动mycat。

2. IDE启动mycat

2.1 配置mycat

为了能够让mycat顺利启动,我们首先需要进行必要的配置。从github上面clone的源码在src/main/resources目录下存在mycat运行所需要配置的文件,有schema.xmlrule.xmlserver.xml。这里我们采用最简方式进行配置:

(1) schema.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"
rule="mod-long" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" 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="localhost:3306" user="root"
password="mysql">
<!-- can have multi read hosts -->
<!-- <readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" /> -->
</writeHost>
<!-- <writeHost host="hostS1" url="localhost:3316" user="root"
password="123456" /> -->
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
</mycat:schema>

这里使用本地mysql(localhost:3306)进行测试,user为root,密码是mysql,根据实际情况修改。

(2) rule.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>
</mycat:rule>

(3) server.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="useSqlStat">1</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="defaultSqlParser">druidparser</property>
<property name="sequnceHandlerType">0</property>
<!-- <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
<!-- <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号-->
<!-- <property name="processorBufferChunk">40960</property> -->
<!--
<property name="processors">1</property>
<property name="processorExecutor">32</property>
-->
<!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
<property name="processorBufferPoolType">0</property>
<!--默认是65535 64K 用于sql解析时最大文本长度 -->
<!--<property name="maxStringLiteralLength">65535</property>-->
<!--<property name="sequnceHandlerType">0</property>-->
<!--<property name="backSocketNoDelay">1</property>-->
<!--<property name="frontSocketNoDelay">1</property>-->
<!--<property name="processorExecutor">16</property>-->
<!--
<property name="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序
<property name="mutiNodePatchSize">100</property> 亿级数量排序批量
<property name="processors">32</property> <property name="processorExecutor">32</property>
<property name="serverPort">8066</property> <property name="managerPort">9066</property>
<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
<property name="handleDistributedTransactions">0</property>
<!--
off heap for merge/order/group/limit 1开启 0关闭
-->
<property name="useOffHeapForMerge">1</property>
<!--
单位为m
-->
<property name="memoryPageSize">1m</property>
<!--
单位为k
-->
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<!--
单位为m
-->
<property name="systemReserveMemorySize">384m</property>
</system>
<user name="root">
<property name="password">mysql</property>
<property name="schemas">TESTDB</property>
</user>
</mycat:server>

2.2 mysql数据库准备

登录到本地mysql,创建需要的database和table:

1
2
3
create database db1 default charset 'utf8';
create database db2 default charset 'utf8';
create database db3 default charset 'utf8';

分别在db1、db2、db3下创建hotnews表:

1
2
3
4
5
6
7
create table hotnews (
id int primary key,
title varchar(100),
author_id int,
create_tm datetime,
content text
) engine = innodb default character set = 'utf8';

2.3 启动mycat

到了这一步,所有的准备已经到位,在Eclipse的mycat项目下找到MycatStartup这个类,Run As -> Java Application即可跑起一个mycat server。默认mycat server端口8066,管理端口9066。

Eclipse里面使用Ctrl+Shift+T快捷键,输入类名,就可以快速定位到对应的源码文件。

这个时候使用mysql客户端工具,执行以下命令登录mycat:

1
2
> mysql -uroot -hlocalhost -P8066 -p
> 键入密码mysql

成功则表示mycat server调试环境已经部署成功了。好了,接下来以Debug默认运行,然后在你希望debug的位置打上断点,就可以尽情地阅读mycat源码了。

eg:
所有发往mycat的sql都会经过ServerQueryHandlerquery方法,在这个方法首行代码处打上断点,然后使用mysql客户端工具登录mycat并执行一个sql,程序就会定位到你设置的断点那里。

3. (可选)编译mycat软件包

我们可以通过mycat源码来编译得到mycat软件包,只要我们安装了maven即可。方法如下:

cmd进入到mycat源码根目录,即pom.xml所在目录,执行以下命令进行编译打包:

1
mvn package -Dmaven.test.skip=true

-Dmaven.test.skip=true表示忽略mycat的单元测试的执行,这样可以节省编译打包时间。

等待执行成功后,可以在mycat源码根目录的target子目录里面,看到如下格式的压缩包:

1
Mycat-server-${version}-${buildtime}-${platform}.tar.gz

其中${version}表示mycat版本号,${buildtime}为我们执行编译打包的日期时间,${platform}表示使用的操作系统平台,取值有winlinuxmacsolarisunix。这样我们就可以拿对应的软件包到对应的平台上去部署了。

坚持原创技术分享,您的支持将鼓励我继续创作!