mycat实现分库

7.1 分库规则

  • auto-sharding-long 范围约定:以500万为单位,实现分片规则,逻辑库A对应 dataNode-db1和db2. 1-500万保存在db1中, 500万零1到1000万保存在db2 中,1000万零1到1500万保存在db1中.依次类推.
  • crc32slot规则:在CRUD操作时,根据具体数据的crc32算法计算,数据应该保存在 哪一个dataNode中

配置分片规则需要注意的地方

  • id 中推荐配置主键列
  • 所有的 tableRule 只能使用一次。如果需要为多个表配置相同的分片规则,那 么需要在此重新定义该规则。
  • 在 crc32Slot 算法中的分片数量一旦给定,MyCat会将该分片数量和slot的取值 范围保存到文件中。在次修改分片数量时是不会生效的,需要将该文件删除。文 件位置位于 conf 目录中的 ruledata 目录中。

7.2 配置分库

在master中创建3个数据库

create database demo1 default character set utf8;
create database demo2 default character set utf8;
create database demo3 default character set utf8;

3个数据库中都要创建t_users表

CREATE TABLE `t_users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

修改Schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="suibian" checkSQLschema="false" sqlMaxLimit="100">
        <table name="t_users" dataNode="dn1,dn2,dn3" rule="crc32slot" />
    </schema>
    <dataNode name="dn1" dataHost="localhost1" database="demo1" />
    <dataNode name="dn2" dataHost="localhost1" database="demo2" />
    <dataNode name="dn3" dataHost="localhost1" database="demo3" />
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
     writeType="0" dbType="mysql" dbDriver="native" switchType="1"slaveThreshold="100">
       <heartbeat>select user()</heartbeat>
       <writeHost host="hostM1" url="192.168.10.102:3306" user="root" password="root">
         <readHost host="hostS2" url="192.168.10.103:3306" user="root"password="root" />
       </writeHost>
    </dataHost>
</mycat:schema>

修改rule.xml

<function name="crc32slot" class="io.mycat.route.function.PartitionByCRC32PreSlot">
      <property name="count">3</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
</function>

测试

image-20210106094307350

注意:

  • 使用MyCat实现分库时,先在MyCat中定义逻辑库与逻辑表,然后在MyCat的链接中执行创建表的命令必须要在 MyCat中运行。因为MyCat在创建表时,会在表中添加一个新的列,列名为_slot。
  • 使用MyCat插入数据时,语句中必须要指定所有的列。即便是一个完全项插入也不允许省略列名。

猜你喜欢

转载自blog.csdn.net/zhanduo0118/article/details/112258276