简单使用mycat实现单库分表

北慕城南 提交于 2020-02-10 16:02:51

1.下载安装mycat

通过mycat的官网,下载对应的包,我这里选择安装的linux系统的

http://dl.mycat.io/

上传在服务器某一位置,然后在该目录下解压

tar -xf   Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz 

2.配置mycat

进入 mycat中conf,首先我们需要配置mycat的用户和密码

vi server.xml

找到 user这一栏,默认的应该是123456,本地不改跳过这一步也行,当然服务器上弱口令不是很好..

再修改 schema.xml

vi schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode='dn01'>
            <table name="r_problem" primaryKey="id" dataNode="dn01" rule="rule1" subTables="r_problem$1-3" />
    </schema>

    <!-- 设置dataNode 对应的数据库,及 mycat 连接的地址dataHost -->
    <dataNode name="dn01" dataHost="dh01" database="recommend" />
    <dataNode name="dn02" dataHost="dh01" database="db02" />

    <!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 -->
    <dataHost name="dh01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
            <heartbeat>select user()</heartbeat>
            <writeHost host="service" url="127.0.0.1:3306" user="root" password="xxxxxxx"/>
    </dataHost>
</mycat:schema>

<schema>:表示的是在mycat中的逻辑库配置,逻辑库名称为:TESTDB,默认是TESTDB,在schema上的 dataNode可以将对应数据库的表全部拿到TESTDB中。

<table>:表示在mycat中的逻辑表配置,逻辑表名称为:r_problem ,映射到两个数据库节点dataNode中,切分规则为:rule1(在rule.xml配置)subTables 是分表 r_problem$1-3 是分为 r_problem1,r_problem2,r_problem3 三个表,我这里只进行了分表,没有分库,要分库 dataNode="dn01,dn02"选择添加下面配置的dataNode就行。

<dataNode>:表示数据库节点,这个节点不一定是单节点,可以配置成读写分离.

<dataHost>:真实的数据库的地址配置

<heartbeat>:用户心跳检测

<writeHost>:写库的配置,password是mysql数据库的密码

再修改 rule.xml

vi rule.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
    <tableRule name="rule1">
        <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>

count 数一定要和分库分表的结点个数对应,我这里分了3个表,就为3.

3.启动,连接mycat

在mycat 中lib下启动mycat

./bin/mycat { console | start | stop | restart | status | dump }  参数命令

./bin/mycat  start 启动

开放8066端口,然后远程连接

  这个密码不是mysql的密码,是之前配置mycat的密码

如果你 2003 连接失败,./bin/mycat  status 检查是否启动 ,又 ./bin/mycat  console检查原因

我遇到的问题在这篇博客解决了.

https://blog.csdn.net/qq_43268365/article/details/86542764

连接成功后

可以修改TESTDB名字,然后在之前的xml改名字.我就默认没改了..

简单测试下

INSERT INTO r_problem(id,xxx) value ('x','x'),('x','x'),('x','x');

然后在连接你的mysql,数据应该就存入了mysql中的r_problem1-3中的某一个表,默认按照取模来存

注意是在mycat中,SELECT * FROM r_problem 就会得到 三个表的数据集合。

在贴一张recommend原数据库的图,和TESTDB是一样的

4.springboot配置

datasource:
  druid:
    url: jdbc:mysql://xxx.xx.xx.xxx:8066/TESTDB?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
    username: root
    password: xxxxx

把你之前的数据库连接端口改成 8066 ,用户和密码是mycat的,不是之前mysql的.

因为mycat是中间件,之前代码部分不需修改就已经完成了分库分表

值得注意的是

<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode='dn01'>
            <table name="r_problem" primaryKey="id" dataNode="dn01" rule="rule1" subTables="r_problem$1-3" />
    </schema>

如果在schema上没有 dataNode ,就只能操作 table的表,其他表虽然在TESTDB显示,但不能被操作 

需要分库分表的表还是需要在table中配置。

 

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!