MyCat部署运行(Windows环境)与使用步骤详解
MyCAT的架构如下图所示:
MyCAT使用MySQL的通讯协议模拟成一个MySQL服务器,并建立了完整的Schema(数据库)、Table(数据表)、User(用户)的逻辑模型,并将这套逻辑模型映射到后端的存储节点DataNode(MySQL Instance)上的真实物理库中,这样一来,所有能使用MySQL的客户端以及编程语言都能将MyCAT当成是MySQLServer来使用,不必开发新的客户端协议。
当MyCAT收到一个客户端发送的SQL请求时,会先对SQL进行语法分析和检查,分析的结果用于SQL路由,SQL路由策略支持传统的基于表格的分片字段方式进行分片,也支持独有的基于数据库E-R关系的分片策略,对于路由到多个数据节点(DataNode)的SQL,则会对收到的数据集进行“归并”然后输出到客户端。
SQL执行的过程,简单的说,就是把SQL通过网络协议发送给后端的真正的数据库上进行执行,对于MySQL Server来说,是通过MySQL网络协议发送报文,并解析返回的结果,若SQL不涉及到多个分片节点,则直接返回结果,写入客户端的SOCKET流中,这个过程是非阻塞模式(NIO)。
DataNode是MyCAT的逻辑数据节点,映射到后端的某一个物理数据库的一个Database,为了做到系统高可用,每个DataNode可以配置多个引用地址(DataSource),当主DataSource被检测为不可用时,系统会自动切换到下一个可用的DataSource上,这里的DataSource即可认为是Mysql的主从服务器的地址。
与任何一个传统的关系型数据库一样,MyCAT也提供了“数据库”的定义,并有用户授权的功能,下面是MyCAT逻辑库相关的一些概念:
MyCAT目前通过配置文件的方式来定义逻辑库和相关配置:
·MYCAT_HOME/conf/schema.xml中定义逻辑库,表、分片节点等内容;
·MYCAT_HOME/conf/rule.xml中定义分片规则;
·MYCAT_HOME/conf/server.xml中定义用户以及系统相关变量,如端口等。
下图给出了MyCAT一个可能的逻辑库到物理库(MySQL的完整映射关系),可以看出强大的分片能力以及灵活的Mysql集群整合能力。
MyCAT使用Java开发,因为用到了JDK 7的部分功能,所以在使用前请确保安装了JDK 7.0,要求是JDK 7.0以上,并设置了正确的Java环境变量
目前下载的版本是免安装,解压在任意磁盘、根目录下,避免路径中出现中文。
目录下的“Mycat-server-1.2-GA-win.tar.gz”文件,解压后的目录结构如下图所示:
目录说明见下表所示:
目录名称 |
说明 |
bin |
存放window版本和linux版本,除了提供封装成服务的版本之外,也提供nowrap的shell脚本命令,方便大家选择和修改。 Windows 下 运行:mycat.batconsole在控制台启动程序,也可以装载成服务,若此程序运行有问题,也可以运行startup_nowrap.bat,确保java命令可以在命令执行。 Warp方式的命令,可以安装成服务并启动或停止。 lmycat install (可选) lmycat start 注意,wrap方式的程序,其JVM配置参数在conf/wrap.conf中,可以修改为合适的参数,参数调整参照http://wrapper.tanukisoftware.com/doc/english/properties.html。 |
conf |
存放配置文件: lserver.xml:是Mycat服务器参数调整和用户授权的配置文件。 lschema.xml:是逻辑库定义和表以及分片定义的配置文件。 lrule.xml:是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改,需要重启MyCAT或者通过9066端口reload。 lwrapper.conf:JVM配置参数等设置。 llog4j.xml:日志存放在logs/mycat.log中,每天一个文件,日志的配置是在conf/log4j.xml中,根据自己的需要,可以调整输出级别为debug,debug级别下,会输出更多的信息,方便排查问题。 |
lib |
MyCAT自身的jar包或依赖的jar包的存放目录。 |
logs |
MyCAT日志的存放目录。日志存放在logs/mycat.log中,每天一个文件 |
安装mycat服务 :mycate install
启动mycat服务 :mycate start
停止mycat服务 :mycate stop
注意:当修改配置文件后,需要重启mycat服务
本地 mycat 192.168.1.5
服务器A mysql 192.168.1.201
服务器A mysql 192.168.1.202
安装MySQL服务器和MySQL客户端,笔者使用的MySQL服务器是免安装版本:mysql-noinstall-5.1.73-winx64,MySQL客户端是:Navicat
for MySQL,免安装版本安装方法请参考:http://blog.csdn.net/q98842674/article/details/12094777
3.2 创建数据库
分别在服务器A、服务器B创建所用的分片数据库;
CREATE database db1;
schema.xml配置文件,因为分库在不同的服务器,因此配置两个datahost;如果在一个datahost中配置多个writeHost,则为主从配置。type="global"时,为全局表,
server.xml配置文件,本实例很简单,就只定义user,
name:用户名
password:密码
schemas:实例名,和schema.xml定义的schema对应,这里的实例名是虚拟名,也就是对mycat服务的一种别名,是 应用程序以及客户端连接的入口。
水平分表:travelrecord
mysql> explain create table travelrecord(id int not null primary key,name varchar(100));
+-----------+---------------------------------------------------------------------+
| DATA_NODE | SQL |
+-----------+---------------------------------------------------------------------+
| dn1 | create table travelrecord(id int not null primary key,name varchar(100)) |
| dn2 | create table travelrecord(id int not null primary key,name varchar(100)) |
| dn3 | create table travelrecord(id int not null primary key,name varchar(100)) |
+-----------+---------------------------------------------------------------------+
3 rows in set (0.01 sec)
(7) 三个分片上都插入了3条数据
mysql> explain insert into travelrecord(id,name) values(1,'hp');
+-----------+---------------------------------------------+
| DATA_NODE | SQL |
+-----------+---------------------------------------------+
| dn1 | insert into travelrecord(id,name) values(1,'hp') |
| dn2 | insert into travelrecord(id,name) values(1,'hp') |
| dn3 | insert into travelrecord(id,name) values(1,'hp') |
+-----------+---------------------------------------------+
3 rows in set (0.00 sec)
-------------------------------------
顺便推荐QQ群,仅供学习和交流,欢迎大家的加入
Java : 139978466
MySQL: 167209377
大数据 : 181560406
前端 : 139978026
测试 : 299057857
运维 : 139978281