使用MyCat分库实战详解

环境准备

JDK 1.8,官网下载安装即可。
MySQL 5.7,官网下载安装即可。
MyCat1.6.5,下载地址http://dl.mycat.io/1.6.5/,此处我们选择windows版本下载即可。
在这里插入图片描述
下载解压后,直接双击bin/startup_nowrap.bat即可启动MyCat
在这里插入图片描述

数据库准备

我们来模拟一个博客系统的数据库,规划设计三个库db001、db002、db003,我们先将三个库都放到本地数据库实例中,后续如果是部署到云端的话,更改服务器地址信息即可。

然后我们有两个表用户表user和博客表blog,用户表存储于db001,博客表存储于db001/db002/db003。

所以在db001执行如下语句创建user表

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增序号',
  `name` varchar(255) DEFAULT '' COMMENT '姓名',
  `password` varchar(255) DEFAULT '' COMMENT '密码',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

然后再db001/db002/db003执行如下语句创建blog表

CREATE TABLE `blog` (
  `id` int(11) NOT NULL COMMENT '序号',
  `title` varchar(255) DEFAULT '' COMMENT '博客标题',
  `content` varchar(255) DEFAULT '' COMMENT '博客内容',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

数据库创建完成后结构如下:
在这里插入图片描述

配置真实服务器信息

通过修改conf/schema.xml,来配置真实服务器的信息,并为数据库划分节点,指定数据表所在的节点。

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
  <!-- 注意TESTDB是MyCat设置的抽象数据库名,对应我们配置的多个真实数据库 -->
  <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
    <!-- user表对应dn1节点 -->
    <table name="user" dataNode="dn1" />
    <!-- blog表对应dn1/dn2/dn3节点,rule-blog表示对blog表的路由规则名称 -->
    <table name="blog" dataNode="dn1,dn2,dn3" rule="rule-blog" />
  </schema>

  <!-- 为实例下面的各个库设置节点 -->
  <dataNode name="dn1" dataHost="localhost1" database="db001" />
  <dataNode name="dn2" dataHost="localhost1" database="db002" />
  <dataNode name="dn3" dataHost="localhost1" database="db003" />

  <!-- 配置真实数据库实例信息 -->
  <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <!-- 配置数据库url、用户名、密码 -->
    <writeHost host="server1" url="localhost:3316" user="root" password="Easy@0122" />
  </dataHost>
</mycat:schema>

配置路由规则

在schema.xml中我们已经制定了blog表存储的节点,且设置了路由规则的名称rule-blog,然后我们设置该规则具体的策略。

修改conf/role.xml,配置规则如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
  <!-- 指定要设置的规则 -->
  <tableRule name="rule-blog">
    <rule>
      <!-- 规则生效的列 -->
      <columns>id</columns>
      <!-- 对应的路由算法 -->
      <algorithm>rule-blog-algorithm</algorithm>
    </rule>
  </tableRule>

  <!-- 配置算法具体实现方式 -->
  <function name="rule-blog-algorithm" class="io.mycat.route.function.PartitionByMod">
    <property name="count">3</property>    <!-- 表示对id进行除3取模分表 -->
  </function>

</mycat:rule>

配置MyCat服务信息

通过上面两个配置文件,我们已指定了库、表、分表路由规则,下面我们将其通过MyCat暴露出来,让客户端进行访问。

通过修改conf/server.xml配置MyCat对外服务信息,主要就是用户名、密码、以及上面指定的抽象数据库名称TESTDB。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
  <!-- system部分采用默认即可 -->
  <system>
    <property name="nonePasswordLogin">0</property>    <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
    <property name="useHandshakeV10">1</property>
    <property name="useSqlStat">0</property>    <!-- 1为开启实时统计、0为关闭 -->
    <property name="useGlobleTableCheck">0</property>    <!-- 1为开启全加班一致性检测、0为关闭 -->
    <property name="sequnceHandlerType">2</property>
    <property name="subqueryRelationshipCheck">false</property>    <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
    <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
    <property name="processorBufferPoolType">0</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">64k</property>
    <!--单位为k-->
    <property name="spillsFileBufferSize">1k</property>
    <property name="useStreamOutput">0</property>
    <!--单位为m-->
    <property name="systemReserveMemorySize">384m</property>
    <!--是否采用zookeeper协调切换  -->
    <property name="useZKSwitch">false</property>
  </system>
  <!-- 设置访问的用户名密码 -->
  <user name="root" defaultAccount="true">
    <property name="password">123456</property>
    <!-- 注意此处是之前设定的抽象数据库名称 -->
    <property name="schemas">TESTDB</property>
  </user>
</mycat:server>

启动测试

双击bin/startup_nowrap.bat启动MyCat,如图启动成功:
在这里插入图片描述
我们使用navicat(其他工具也可以),通过上面配置的MyCat用户名密码连接MyCat,如下图:
在这里插入图片描述
连接成功后,会发现一个数据库TESTDB,及两张表user/blog,TESTDB即为MyCat抽象出来的数据库,操作TESTDB中的数据会按照当时设定的规则,实际操作会发生在db001/db002/db003中,这个我们不必关心,MyCat会自动为我们实现。
在这里插入图片描述

数据插入与查询测试

我们在TESTDB执行6次insert语句。

insert into blog(id,title,content)values(1,"title1","content1")
insert into blog(id,title,content)values(2,"title2","content2")
insert into blog(id,title,content)values(3,"title3","content3")
insert into blog(id,title,content)values(4,"title4","content4")
insert into blog(id,title,content)values(5,"title5","content5")
insert into blog(id,title,content)values(6,"title6","content6")

在TESTDB查询有6条数据,说明插入成功。
而db001有id为3/6的数据。
db002有id为1/4的数据。
db003有id为2/5的数据。
说明MyCat自动为我们取模了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章