数据库中间件mycat分库分表

    科技2025-05-30  9

    首先我们先通过一个案例来初步认识。 准备两个数据库服务 dhost1: 192.168.130.128:3306 dhost2: 192.168.130.129:3306 两个服务中均有testdb数据库,数据库中均有t_order表。 查看表结构:

    配置schema.xml

    <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="testdb" checkSQLschema="false" sqlMaxLimit="100"> #配置表分片规则为rule1,分片规则在rule.xml中定义 <table name="t_order" primaryKey="orderId" autoIncrement="true" dataNode="dn$1-2" rule="rule1" /> </schema> <dataNode name="dn1" dataHost="dhost1" database="testdb" /> <dataNode name="dn2" dataHost="dhost2" database="testdb" /> <dataHost name="dhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="192.168.130.128:3306" user="root" password="qwe123"> </writeHost> </dataHost> <dataHost name="dhost2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM2" url="192.168.130.129:3306" user="root" password="qwe123"> </writeHost> </dataHost> </mycat:schema>

    配置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>orderId</columns> <algorithm>mod-fun</algorithm> </rule> </tableRule> <function name="mod-fun" class="io.mycat.route.function.PartitionByMod"> <property name="count">2</property> </function> </mycat:rule>

    tableRule标签说明:

    name 属性指定唯一的名字,用于标识不同的表规则。内嵌的rule 标签则指定对物理表中的哪一列进行拆分和使用什么路由算法。columns 内指定要拆分的列名字。algorithm 使用function 标签中的name 属性。连接表规则和具体路由算法。当然, 多个表规则可以连接到同一个路由算法上。table 标签内使用。让逻辑表使用这个规则进行分片。

    function标签说明:

    name 指定算法的名字。class 制定路由算法具体的类名字。property 为具体算法需要用到的一些属性

    此处我们为rule1规则定义了采用orderId这一列的值进行对2取模的算法。也就是说orderId为偶数的记录存放在dn0上,为奇数的记录存放在dn1上。

    主键值生成

    由于orderId为主键列,而在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,MyCat 提供了全局sequence,并且提供了包含本地配置和数据库配置等多种实现方式。 此处采用本地配置方式: 此方式MyCAT 将sequence 配置到文件中,当使用到sequence 中的配置后,MyCAT 会 更新 conf中的sequence_conf.properties 文件中sequence 当前的值。 在sequence_conf.properties 中配置以表名为名的序列:

    T_ORDER.HISIDS= T_ORDER.MAXID=2000 T_ORDER.MINID=1001 T_ORDER.CURID=1000

    其中HISIDS 表示使用过的历史分段(一般无特殊需要可不配置),MINID 表示最小ID 值, MAXID 表示最大 ID 值,CURID 表示当前ID 值

    server.xml 中修改配置:

    <system><property name="sequnceHandlerType">0</property></system>

    sequnceHandlerType 需要配置为0,表示使用本地文件方式。 配置完成,启动mycat

    bin/mycat start

    navicat连接测试 此时没有数据,我们插入数据,测试主键自增和分库是否成功。

    insert into t_order(orderTime,customerId) values(1601960672,3); insert into t_order(orderTime,customerId) values(1601960775,10); insert into t_order(orderTime,customerId) values(1601960873,24); insert into t_order(orderTime,customerId) values(1601964652,18); insert into t_order(orderTime,customerId) values(1601910619,9); insert into t_order(orderTime,customerId) values(1601930682,32);

    查看dn0 查看dn1 实现了分库分表和主键自增。


    下一篇文章介绍常用分片规则,欢迎关注。

    Processed: 0.010, SQL: 8