美文网首页
springboot整合mycat实现分库分表

springboot整合mycat实现分库分表

作者: lzm_CX330 | 来源:发表于2020-12-01 12:59 被阅读0次

    1:下载mycat

    下载地址:http://dl.mycat.org.cn/
    

    下载后将文件解压

    解压目录

    2:提前创建数据库跟表

    数据库跟表

    我这里先创建了三个库,每个库中的表都是一样的,准备条件做好之后,接下来修改myat的配置文件以达到分库的效果

    3:修改主要配置文件

    conf目录下的配置文件

    server.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mycat:server SYSTEM "server.dtd">
    <mycat:server xmlns:mycat="http://io.mycat/">
        <system>
        <property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
        <property name="ignoreUnknownCommand">0</property><!-- 0遇上没有实现的报文(Unknown command:),就会报错、1为忽略该报文,返回ok报文。
        在某些mysql客户端存在客户端已经登录的时候还会继续发送登录报文,mycat会报错,该设置可以绕过这个错误-->
        <property name="useHandshakeV10">1</property>
        <property name="removeGraveAccent">1</property>
        <property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
        <property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->
        <property name="sqlExecuteTimeout">300</property>  <!-- SQL 执行超时 单位:秒-->
        <property name="sequnceHandlerType">1</property>
            
        <property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
        <property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
        <property name="sequenceHanlderClass">io.mycat.route.sequence.handler.HttpIncrSequenceHandler</property>
       
            <!--默认为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">0</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>
    
        <property name="strictTxIsolation">false</property>
            
        <property name="useZKSwitch">true</property>
        <!--如果为0的话,涉及多个DataNode的catlet任务不会跨线程执行-->
        <property name="parallExecute">0</property>
        </system>
    
        <user name="root" defaultAccount="true">
            <property name="password">123456</property>
            <property name="schemas">radar</property>
            <property name="defaultSchema">radar</property>
            <!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
            
            <!-- 表级 DML 权限设置 -->
            <!--        
            <privileges check="false">
                <schema name="TESTDB" dml="0110" >
                    <table name="tb01" dml="0000"></table>
                    <table name="tb02" dml="1111"></table>
                </schema>
            </privileges>       
             -->
        </user>
    
        <user name="user">
            <property name="password">123456</property>
            <property name="schemas">radar</property>
            <property name="readOnly">true</property>
            <property name="defaultSchema">radar</property>
        </user>
    
    </mycat:server>
    
    

    主要修改<use/>标签
    name:连接mycat时的用户名
    password:连接mycat时的密码
    schemas:mycat逻辑库的名称

    schema.xml

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    
        <schema name="radar" checkSQLschema="true" sqlMaxLimit="100" >
            <!-- auto sharding by id (long) -->
            <table name="t_respire" dataNode="dn1,dn2,dn3" rule="mod-long" splitTableNames ="true"/>
             <table name="student" dataNode="dn1,dn2,dn3" rule="mod-long" splitTableNames ="true"/>
        </schema>
        <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
            /> -->
        <dataNode name="dn1" dataHost="localhost1" database="radar-01" />
        <dataNode name="dn2" dataHost="localhost1" database="radar-02" />
        <dataNode name="dn3" dataHost="localhost1" database="radar-03" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
            <heartbeat>select user()</heartbeat>
            <!-- can have multi write hosts -->
            <writeHost host="hostM1" url="localhost:3306" user="root"
                       password="123456">
            </writeHost>
            <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
        </dataHost>
    </mycat:schema>
    

    schema:
    -- name:逻辑库名称,需要与server.xml中<user/>标签下的schemas对应
    table:
    --name:数据库中的表名
    --dateNode: 分片的节点
    --rule:分片规则 根据 id 进行十进制求模预算,相比固定分片 hash
    dataNode:
    --name:数据节点的名字(禁止重复,对应schema里的dataNode对应的名)
    --dataHost:跟物理库对应的名称(datahost.name对应)
    --database:物理数据库名(物理库中的真是数据库名称,我这里配置的就是之前提前创建好的三个库)
    writeHost:
    --name:自定义名称(对应dataNode里的dataHost)
    --url:连接数据库地址
    --name:连接数据库地址的用户名
    --password:连接数据库地址的密码

    rule.xml

    rule.xml

    里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算法,或者对表使用相同的算法但具体的参数不同。这个文件里面主要有tableRule和function这两个标签。在具体使用过程中可以按照需求添加tableRule和function。

    4:连接mycat

    远程连接mycat

    连接成功,查看mycat

    mycat库

    radar :我们在schema.xml中定义好的逻辑数据库名
    student,t_respire: 我们在schema.xml中定义好的逻辑数据库中的表

    5:springboot整合mycat

    修改mysql连接地址,更换为mycat

    mysql配置

    使用esaycode插件快速生成代码,这里直接略过

    接口

    使用postman插入三条数据

    插入数据

    插入三条id不同的数据,我这里已经插入了id={1,2,3}的数据,查看mycat与分片数据


    mycat库中的数据

    查看三个分片数据库中的数据


    radar-01
    radar-02 radar-03

    这里mycat已经会根据我们所选择的分片策略自动将数据插入不同的库中

    相关文章

      网友评论

          本文标题:springboot整合mycat实现分库分表

          本文链接:https://www.haomeiwen.com/subject/ijskiktx.html