MyCat部署运⾏(Windows环境)与使⽤步骤详解
1、MyCat概念
1.1 总体架构
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的主从服务器的地址。
1.2 逻辑库
与任何⼀个传统的关系型数据库⼀样,MyCAT也提供了“数据库”的定义,并有⽤户授权的功
能,下⾯是MyCAT逻辑库相关的⼀些概念:
schema:逻辑库,与MySQL中的Database(数据库)对应,⼀个逻辑库中定义了所包括的
Table。
table:表,即物理数据库中存储的某⼀张表,与传统数据库不同,这⾥的表格需要声明其所存
储的逻辑数据节点DataNode,这是通过表格的分⽚规则定义来实现的,table可以定义其所属
的“⼦表(childTable)”,⼦表的分⽚依赖于与“⽗表”的具体分⽚地址,简单的说,就是属于⽗表⾥
某⼀条记录A的⼦表的所有记录都与A存储在同⼀个分⽚上。
分⽚规则:是⼀个字段与函数的捆绑定义,根据这个字段的取值来返回所在存储的分⽚
(DataNode)的序号,每个表格可以定义⼀个分⽚规则,分⽚规则可以灵活扩展,默认提供了
基于数字的分⽚规则,字符串的分⽚规则等。
dataNode: MyCAT的逻辑数据节点,是存放table的具体物理节点,也称之为分⽚节点,通过DataSource来关联到后端某个具体数据库上,⼀般来说,为了⾼可⽤性,每个DataNode都设置
两个DataSource,⼀主⼀从,当主节点宕机,系统⾃动切换到从节点。
dataHost:定义某个物理库的访问地址,⽤于捆绑到dataNode上。
MyCAT⽬前通过配置⽂件的⽅式来定义逻辑库和相关配置:
·        MYCAT_HOME/l中定义逻辑库,表、分⽚节点等内容;
·        MYCAT_HOME/l中定义分⽚规则;
·        MYCAT_HOME/l中定义⽤户以及系统相关变量,如端⼝等。
下图给出了MyCAT⼀个可能的逻辑库到物理库(MySQL的完整映射关系),可以看出强⼤
的分⽚能⼒以及灵活的Mysql集整合能⼒。
2、  MyCat基本使⽤教程
2.1 下载和安装
MyCAT使⽤Java开发,因为⽤到了JDK 7的部分功能,所以在使⽤前请确保安装了JDK 7.0,要求是JDK 7.0以上,并设置了正确的Java环境变量
⽬前下载的版本是免安装,解压在任意磁盘、根⽬录下,避免路径中出现中⽂。
⽬录下的“Mycat-server-1.”⽂件,解压后的⽬录结构如下图所⽰:
⽬录说明见下表所⽰:
⽬录名称说明
bin存放window版本和Linux版本,除了提供封装成服务的版本之
外,也提供nowrap的shell脚本命令,⽅便⼤家选择和修改。
Windows 下运⾏:mycat.bat console在控制台启动程序,也可以
装载成服务,若此程序运⾏有问题,也可以运⾏
startup_nowrap.bat,确保java命令可以在命令执⾏。
Warp⽅式的命令,可以安装成服务并启动或停⽌。
l mycat install (可选)
l mycat start
注意,wrap⽅式的程序,其JVM配置参数在f中,可
以修改为合适的参数,参数调整参
照wrapper.tanukisoftware/doc/english/properties.html。
conf存放配置⽂件:
l:是Mycat服务器参数调整和⽤户授权的配置⽂件。
l:是逻辑库定义和表以及分⽚定义的配置⽂件。
l:是分⽚规则的配置⽂件,分⽚规则的具体⼀些参数信息
单独存放为⽂件,也在这个⽬录下,配置⽂件修改,需要重启
MyCAT或者通过9066端⼝reload。
f:JVM配置参数等设置。
l:⽇志存放在logs/mycat.log中,每天⼀个⽂件,⽇志的
配置是在l中,根据⾃⼰的需要,可以调整输出级
别为debug,debug级别下,会输出更多的信息,⽅便排查问
题。
lib MyCAT⾃⾝的jar包或依赖的jar包的存放⽬录。
logs MyCAT⽇志的存放⽬录。⽇志存放在logs/mycat.log中,每天⼀个
⽂件
2.2 启动和停⽌
安装mycat服务:mycate install
启动mycat服务:mycate start
免安装版的mysql下载停⽌mycat服务:mycate stop
注意:当修改配置⽂件后,需要重启mycat服务
3、使⽤教程
3.1 硬件配置和安装数据库
本地          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,免安装版本安装⽅法请参考:blog.csdn/q98842674/article/details/12094777
3.2 创建数据库
分别在服务器A、服务器B创建所⽤的分⽚数据库;
CREATE database db1;
3.3 配置⽂件
置多个writeHost,则为主从配置。type="global"时,为全局表,
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="org.opencloudb/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="travelrecord" dataNode="dn1,dn2" rule="auto-sharding-long" />
<!-- global table is auto cloned to all defined data nodes ,so can join
with any table whose sharding node is in the same data node -->
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<!-- random sharding using mod sharind rule -->
<table name="hotnews" primaryKey="ID" dataNode="dn1,dn2"
rule="mod-long" />
<!-- <table name="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global"
needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_dn3 "
rule="mod-long" /> -->
<table name="employee" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile" />
<table name="customer" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile">
<childTable name="orders" primaryKey="ID" joinKey="customer_id"
parentKey="id">
<childTable name="order_items" joinKey="order_id"
parentKey="id" />
</childTable>
<childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
parentKey="id" />
</table>
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost2" database="db1" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.1.201:3306" user="shopuser"
password="123456">
</writeHost>
</dataHost>
<dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.1.202:3306" user="shopuser"
password="123456">
</writeHost>
</dataHost>
</mycat:schema>
name:⽤户名
password:密码
schemas:实例名,和l定义的schema对应,这⾥的实例名是虚拟名,也就是对mycat服务的⼀种别名,是应⽤程序以及客户端连接的⼊⼝。
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License. - You
may obtain a copy of the License at - - /licenses/LICENSE-2.0
- - Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="org.opencloudb/">
<system>
<property name="defaultSqlParser">druidparser</property>
<!--  <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
<!-- <property name="processorBufferChunk">40960</property> -->
<!--
<property name="processors">1</property>
<property name="processorExecutor">32</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> -->
</system>
<user name="test">
<property name="password">test</property>
<property name="schemas">TESTDB</property>
</user>
</mycat:server>
3.4 登录mycat
在任意有mysql的客户端的机器连接Mycat, 执⾏以下命令
mysql -utest -ptest -h192.168.1.5 -P8066 -DTESTDB  注意:8066登录mycat数据端
⼝,9066登录mycat管理端⼝(能看到mycat内的配置、以及各个数据库连接情况,很有⽤)
3.5 测试
全局表:company
mysql> create table company(id int not null primary key,name varchar(100),sharding_id int not null);
Query OK, 0 rows affected (0.30 sec)
mysql> explain create table company(id int not null primary key,name
varchar(100),sharding_id int not null);
+-----------+------------------------------------------------------------------------------------------------+
| DATA_NODE | SQL                                                                                            |
+-----------+------------------------------------------------------------------------------------------------+
| dn1      | create table company(id int not null primary key,name varchar(100),sharding_id int not null) |
| dn2      | create table company(id int not null primary key,name varchar(100),sharding_id int not null) |
+-----------+------------------------------------------------------------------------------------------------+
2 rows in set (0.04 sec)
mysql> insert into company(id,name,sharding_id) values(1,'leader us',10000);
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying
Connection id:    6
Current database: TESTDB
Query OK, 1 row affected (0.03 sec)
mysql> explain insert into company(id,name,sharding_id) values(1,'leader us',10000);      +-----------+-----------------------------------------------------------------------+
| DATA_NODE | SQL                                                                  |
+-----------+-----------------------------------------------------------------------+
| dn1      | insert into company(id,name,sharding_id) values(1,'leader us',10000) |
+-----------+-----------------------------------------------------------------------+
1 row in set (0.00 sec)
⽔平分表: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:729038198,我们将在24小时内删除。