上篇文章《MyCat 启蒙:分布式系统的数据库架构演变》中,我们通过一个项目从零到百万级访问的变化,展示了这个过程中的数据层架构变化。其中说到了数据层架构变化所带来的三个问题:
- 读写数据源判断
- 繁杂数据源地址
- 分表判断
而 MyCat 最初就是为了解决这个问题而存在的,它能集中管理项目涉及到的所有数据库连接,减少项目中非业务性代码的编写。了解了 MyCat 的诞生背景,我们这次就上手用一用这个框架。
话不多说,我们先通过一个简单的例子让 MyCat 跑起来。
运行MyCat服务器
提示:运行 MyCat 服务器需要安装 JDK 和 MySQL,请确保你的服务器上已经正确安装。
完成环境确认后,到 MyCat 官网下载 MyCat 的服务器包。MyCat 针对不同系统提供了不同的安装包,我这边下载的是 1.6.RELEASE 版本的 Mac 安装包。
下载完成后解压进入 bin 目录,运行下面的命令运行 MyCat 服务器:
查看 MyCat 安装包目录下的 logs/wrapper.log
日志,如果没有报错,那就是启动成功了。
MyCat 安装包默认为我们提供了有读写权限的账号,账号名为 root,密码是 123456。
下面我们直接用这个默认账号在命令行上连接 MyCat。(注意⚠️:
(我这里用的是MAMP自带的mysql)
Mini:bin lu$ /Applications/MAMP/Library/bin/mysql -uroot -proot -h127.0.0.1 -P8066
)。
可以看到我们已经成功连上了 MyCat 服务器。MyCat 服务器默认定义了一个名为 TESTDB 的逻辑数据库,并且也在该逻辑数据库中定义了一些逻辑表。
但当你尝试做一些 select 操作的时候,控制台会提示报错,这是因为 MyCat 配置错误导致的。
如果我们要使用 MyCat 正确执行 select 语句的话,我们需要在 MySQL 中先创建三个数据库,分别是:db1、db2、db3。
创建完成之后再创建 travelrecord 表。
最后在 schema.xml 中保留一个 DataHost 节点:
最后重启 MyCat 服务器:
之后连接 MyCat
连接成功后尝试运行相应的 SQL 语句:
到这里,我们已经学会最基本的 MyCat 服务器启动以及配置了。
MyCat的目录结构
打开 MyCat 的目录,我们可以看到 MyCat 主要包括了以下几个文件夹:
其中 bin 目录是 MyCat 的启动目录,conf 目录是 MyCat 的配置文件目录,lib 目录是 MyCat 自身的 Jar 包以及所依赖 Jar 包的目录,logs 目录是日志目录。
MyCat的配置文件
在这 MyCat 的目录中,最重要的是 conf 目录,这里面存放了 MyCat 所有的配置信息。在 conf 目录中有三个重要的配置文件:schema.xml、server.xml、rule.xml。
schema.xml
schema.xml 文件定义了 MyCat 到底连接那个数据库实例,连接这个数据库实例的哪个数据库。MyCat 一共有几个逻辑数据库,MyCat 一共有几个逻辑表。
schema.xml 文件一共有四个配置节点:DataHost、DataNode、Schema、Table。
DataHost 节点定义了 MyCat 要连接哪个 MySQL 实例,连接的账号密码是多少。默认的 MyCat 为我们定义了一个名为 localhost1 的数据服务器(DataHost),它指向了本地(localhost)3306 端口的 MySQL 服务器,对应 MySQL 服务器的账号是 root,密码是 123456。
DataNode 节点指定了需要连接的具体数据库名称,其使用一个 dataHost 属性指定该数据库位于哪个数据库实例上。默认的 MyCat 为我们创建了三个数据节点(DataNode),dn1 数据节点对应 localhost1 数据服务器上的 db1 数据库,dn2 数据节点对应 localhost1 数据服务器上的 db2 数据库,dn1 数据节点对应 localhost1 数据服务器上的 db3 数据库。
Schema 节点定义了 MyCat 的所有逻辑数据库,Table 节点定义了 MyCat 的所有逻辑表。默认的 MyCat 为我们定义了一个名为 TESTDB 的逻辑数据库,在这个逻辑数据库下又定义了名为 travaelrecord、company 等 6 个逻辑表。
所以上面当我们登陆 MyCat 输入show databases
会看到只有一个名为 TESTDB 的数据库,这个就是 MyCat 的逻辑数据库。
我们输入show tables
可以看到 TESTDB 下对应的逻辑表。
server.xml
server.xml 定义了项目中连接 MyCat 服务器所需要的账号密码,以及该账号能访问那些逻辑数据库。 server.xml 配置文件中有 System 和 User 两个配置节点。
System 节点定义了连接 MyCat 服务器的系统配置信息。例如是否开启实时统计功能,是否开启全加班一致性检测等。
User 配置节点定义了连接 MyCat 服务器的账号密码,以及该账号密码所能进行的数据库操作。默认的 MyCat 为我们创建了一个账户名为 root,密码为 123456 的账号,只能访问 TESTDB 逻辑数据库,并且定义了对相关表的操作权限。
rule.xml
rule.xml 定义了逻辑表使用哪个字段进行拆分,使用什么拆分算法进行拆分。rule.xml 中有两个配置节点,分别是:TableRule 和 Function 配置节点。
TableRule 配置节点定义了逻辑表的拆分信息,例如使用哪个字段进行拆分,使用什么拆分算法。默认的 MyCat 为我们配置了一个名为 rule2 的表拆分规则,表示根据 user_id 字段进行拆分,拆分算法是 func1。
Function 配置节点则定义了具体的拆分算法。例如使用对 1000 取余的拆分算法,对 100 取余的拆分算分等等。默认的 MyCat 为我们定义了一个名为 func1 的拆分算法,这个拆分算法定义在 o.mycat.route.function.PartitionByLong 类中,并且还传入了两个参数值。