mycat初体验

一、简介

  • mycat是一个彻底开源的数据库分库分表中间件;它是基于proxy模式使用,通过简单的配置,使用时只需要连接上mycat,就能轻松实现分库分表,读写分离等业务。具体特性及详情可以查看mycat官网

二、安装mycat和配置

在这里插入图片描述
有linux、windows这些版本的,我这里演示linux版本的。

  • 解压后的目录
    在这里插入图片描述

  • 还需要数据库,我这里使用mysql,为了看到分库分表的效果,我用2个mysql(分别端口3306/3307)

  • 为了快速我是直接用docker构建的mysql;当然也可以用其他方式创建mysql。
    在这里插入图片描述

  • 再把库和表建好,两个数据库一样。
    在这里插入图片描述

  • 表结构
    在这里插入图片描述

  • 下面计算配置mycat,主要配置这三个文件。
    在这里插入图片描述

  • 修改server.xml,这里只修改连接MyCat的用户名和密码,如下:
    在这里插入图片描述

  • 其中schemas是逻辑库,在后边的配置会用到,这里配置了一个逻辑库为:mycat_deom。

  • 修改schema.xml文件,配置逻辑库:

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

        <schema name="mycat_demo" checkSQLschema="false" sqlMaxLimit="100">
                <!-- auto sharding by id (long) -->
                <table name="dwc_account"  primaryKey="user_id"  dataNode="dn1,dn2" rule="sharding-by-murmur">

                <!-- 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>
                <!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
                        /> -->
        </schema>
        <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
                /> -->
        <dataNode name="dn1" dataHost="db235" database="mycat_demo" />
        <dataNode name="dn2" dataHost="db237" database="mycat_demo" />
        <!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
         <dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
        <dataNode       name="jdbc_dn2" dataHost="jdbchost" database="db2" />
        <dataNode name="jdbc_dn3"       dataHost="jdbchost" database="db3" /> -->
        <dataHost name="db235" 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="192.168.137.135:3306" user="root"
                                   password="root">
                        <!-- can have multi read hosts -->
                </writeHost>
                <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
        </dataHost>

        <dataHost name="db237" 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="192.168.137.135:3307" user="root"
                                   password="root">
                        <!-- can have multi read hosts -->
                </writeHost>
                <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
        </dataHost>

        <!--
                <dataHost name="sequoiadb1" maxCon="1000" minCon="1" balance="0" dbType="sequoiadb" dbDriver="jdbc">
                <heartbeat>             </heartbeat>
                 <writeHost host="hostM1" url="sequoiadb://1426587161.dbaas.sequoialab.net:11920/SAMPLE" user="jifeng"  password="jifeng"></writeHost>
                 </dataHost>

          <dataHost name="oracle1" maxCon="1000" minCon="1" balance="0" writeType="0"   dbType="oracle" dbDriver="jdbc"> <heartbeat>select 1 from dual</heartbeat>
                <connectionInitSql>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'</connectionInitSql>
                <writeHost host="hostM1" url="jdbc:oracle:thin:@127.0.0.1:1521:nange" user="base"       password="123456" > </writeHost> </dataHost>

                <dataHost name="jdbchost" maxCon="1000"         minCon="1" balance="0" writeType="0" dbType="mongodb" dbDriver="jdbc">
                <heartbeat>select       user()</heartbeat>
                <writeHost host="hostM" url="mongodb://192.168.0.99/test" user="admin" password="123456" ></writeHost> </dataHost>

                <dataHost name="sparksql" maxCon="1000" minCon="1" balance="0" dbType="spark" dbDriver="jdbc">
                <heartbeat> </heartbeat>
                 <writeHost host="hostM1" url="jdbc:hive2://feng01:10000" user="jifeng"         password="jifeng"></writeHost> </dataHost> -->

        <!-- <dataHost name="jdbchost" maxCon="1000" minCon="10" balance="0" dbType="mysql"
                dbDriver="jdbc"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1"
                url="jdbc:mysql://localhost:3306" user="root" password="123456"> </writeHost>
                </dataHost> -->
</mycat:schema>
                                                       

主要是修改这部分:
在这里插入图片描述

  • 在mycat中schema是逻辑库,schema 标签下的table是逻辑表,其中:
  <table name="dwc_account"  primaryKey="user_id"  dataNode="dn1,dn2" rule="sharding-by-murmur">

代表具体的数据库表中的dwc_account,primaryKey是主键,dataNode 是mycat中的分片节点,rule 对使用这种表的路由规则,murmur算法是将字段进行hash后分发到不同的数据库,字段类型支持int和varchar。

 <dataNode name="dn1" dataHost="db235" database="mycat_demo" />

  • dataNode节点中的name就是上述table节点中使用到的dataNode名称,dataHost是具体每一个数据库服务器的节点名称,在下边进行配置的,database就是该节点中具体存在的一个数据库。
 <dataHost name="db235" 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="192.168.137.135:3306" user="root"
                                   password="root">
                        <!-- can have multi read hosts -->
                </writeHost>
                <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
        </dataHost>


  • 剩下还有个表的路由规则rule.xml:
    在这里插入图片描述
    在这里插入图片描述
  • columns里一般是写表的主键id,然后计算要分片的数据库节点数量了,我这儿是2个。

三、使用mycat

在这里插入图片描述

  • 操作mycat,就把数据库地址、端口、用户名、密码改一下就行了,其他的不变。
    在这里插入图片描述
  • 现在我用代码在mycat插入一些数据查看分片的效果:
    在这里插入图片描述
    在这里插入图片描述
  • 两个数据库的数据是不同的,已经达到了分片的效果。文章到此结束。
  • 我目前对mycat还处于入门的状态,如果有描述错误的地方 ,还请指正,感激不尽。

posted on 2019-05-31 00:03  愤怒的苹果ext  阅读(25)  评论(0编辑  收藏  举报

导航