袋鼠云技术团队 + 关注
手机版

mycat实现mysql分库分表

  1. 云栖社区>
  2. 袋鼠云技术团队>
  3. 博客>
  4. 正文

mycat实现mysql分库分表

红隐 2018-05-06 23:02:10 浏览3072 评论1

摘要: myCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。

1. mycat介绍

myCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。

MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度

2.使用介绍:
本次演示的是基于mysql数据库,通过中间件mycat实现分库分表功能。

3.环境
3台物理机linux操作系统
其中两台安装Mysql 5.7
另一台安装Mycat
4.原理图
1

5.搭建过程

  1. 下载mycat
    http://mycat.sourceforge.net/
  2. 安装及修改配置文件
    下载好安装包,解压即可

Mycat分为3个重要的配置文件,分别为 schema.xml server.xml rule.xml
1.scheme.xml
此配置文件是设置整体的scheme拆分任务;节点配置信息;表拆分信息;以及底层mysql数据库登录方式。
具体内容如下:

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

    <schema name="mycat" checkSQLschema="false" sqlMaxLimit="1000">     --schema任务配置

        <table name="test1" primaryKey="ID" dataNode="dn1,dn3,dn2" rule="auto-sharding-long"/>  --表test1 拆分的节点以及拆分规则
        <table name="test2" primaryKey="ID"  dataNode="dn2,dn4" rule="rule1"/>
    
    </schema>

    <dataNode name="dn1" dataHost="192.168.0.3" database="db1" />   --节点信息配置
    <dataNode name="dn2" dataHost="192.168.0.3" database="db2" />
    <dataNode name="dn3" dataHost="192.168.0.4" database="db3" />
    <dataNode name="dn4" dataHost="192.168.0.4" database="db4" />

    
    <dataHost name="192.168.0.3" maxCon="1000" minCon="10" balance="0"   --底层mysql登录方式
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>

        <writeHost host="mysql1" url="192.168.0.3:3306" user="root"
                   password="123456">

        </writeHost>


        
    </dataHost>
        <dataHost name="192.168.0.4" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>

        <writeHost host="mysql2" url="192.168.0.4:3306" user="root"
                   password="123456">

            
        </writeHost>


    </dataHost>

</mycat:schema>

2.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="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
    <property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->

        <property name="sequnceHandlerType">2</property>
  
        <property name="processorBufferPoolType">0</property>m-vy288c43d05418f4 
    
        <property name="handleDistributedTransactions">0</property>
        
            <!--
            off heap for merge/order/group/limit      1开启   0关闭
        -->
        <property name="useOffHeapForMerge">1</property>

        <!--
            单位为m
        -->
        <property name="memoryPageSize">1m</property>

        <!--
            单位为k
        -->
        <property name="spillsFileBufferSize">1k</property>

        <property name="useStreamOutput">0</property>

        <!--
            单位为m
        -->
        <property name="systemReserveMemorySize">384m</property>


        <!--是否采用zookeeper协调切换  -->
        <property name="useZKSwitch">true</property>


    </system>
    
 
    <firewall> 
       <whitehost>
          <host host="127.0.0.1" user="root"/>
          <host host="localhost" user="root"/>
       </whitehost>
       <blacklist check="false">
       </blacklist>
    </firewall>

    
    <user name="root">
        <property name="password">123456</property>
        <property name="schemas">mysql</property>
        
    

</mycat:server>

3.rule.xml
此配置文件配置的是表的拆分规则,以及拆分规则底层文件配置,
具体内容如下:

<?xml version="1.0" encoding="UTF-8"?>
c language governing permissions and - limitations 
    under the License. -->
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
    <tableRule name="test1"> --表test1拆分规则配置
        <rule>
            <columns>ID</columns>
            <algorithm>rang-long</algorithm>
        </rule>
    </tableRule>

    <tableRule name="test2">
        <rule>
            <columns>ID</columns>
            <algorithm>func1</algorithm>
        </rule>
    </tableRule>

    

    <function name="murmur"
        class="io.mycat.route.function.PartitionByMurmurHash">
        <property name="seed">0</property>
        <property name="count">2</property>
        <property name="virtualBucketTimes">160</property>
        
    </function>

    <function name="crc32slot"
              class="io.mycat.route.function.PartitionByCRC32PreSlot">
        <property name="count">2</property>
    </function>
    <function name="hash-int"
        class="io.mycat.route.function.PartitionByFileMap">
        <property name="mapFile">partition-hash-int.txt</property>
    </function>
    <function name="rang-long"
        class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">autopartition-long.txt</property>
    </function>
    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <!-- how many data nodes -->
        <property name="count">3</property>
    </function>

    <function name="func1" class="io.mycat.route.function.PartitionByLong">
        <property name="partitionCount">8</property>
        <property name="partitionLength">128</property>
    </function>
    <function name="latestMonth"
        class="io.mycat.route.function.LatestMonthPartion">
        <property name="splitOneDay">24</property>
    </function>
    <function name="partbymonth"
        class="io.mycat.route.function.PartitionByMonth">
        <property name="dateFormat">yyyy-MM-dd</property>
        <property name="sBeginDate">2015-01-01</property>
    </function>
    
    <function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
            <property name="mapFile">partition-range-mod.txt</property>
    </function>
    
    <function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">
        <property name="totalBuckets">3</property>
    </function>
</mycat:rule>

6.底层mysql配置
Mysql需要授予mycat所在主机的登录权限

在192.168.0.3上:

        mysql> grant all on db1.* to 'root'@'192.168.0.4' identified by '123';

mysql> grant all on db2.* to 'root'@'192.168.0.4' identified by '123';

    在192.168.0.4上:
        mysql> grant all on db3.* to 'root'@'192.168.0.4' identified by '123';

mysql> grant all on db4.* to 'root'@'192.168.0.4' identified by '123';

7.测试功能
1.开启mycat:
2

2.在mycat所在主机登录mysql

3

由上图可以看到,在mycat所在主机中登录mysql 会看到已经创建好的schema 下面有两个表 test1 test2

3.插入数据测试:
插入三条数据,在mycat 所在主机select会显示所有数据
4

在底层数据库中指挥显示根据拆分规则插入的数据:

192.168.0.4中结果如下

192.168.0.3中结果如下

【云栖快讯】阿里巴巴小程序繁星计划,20亿补贴第一弹云应用免费申请,限量从速!  详情请点击

网友评论