使用MyCat单库分表实战详解

简介: 本文目录1. 场景2. 实现3. 配置真实服务器信息4. 配置路由规则5. 配置MyCat服务信息6. 启动测试

1. 场景

比如一个大型集团公司,有一张表record保存了交易记录信息。该表数据量很大,但是查询、更新时基本都是按子公司来操作。


那么可以按子公司编号进行分表。例如子公司编号1的交易记录存储到record_1表,同理子公司编号为2的交易记录保存到record_2中…


2. 实现

在mysql中新建数据库实例dbcompany,并新建record0-record3,共4张表,代码如下

CREATE TABLE `record_0` (
  `id` int(11) NOT NULL,
  `companyid` int(11) DEFAULT NULL COMMENT '子公司编号',
  `info` varchar(255) DEFAULT NULL COMMENT '业务信息',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `record_1` (
  `id` int(11) NOT NULL,
  `companyid` int(11) DEFAULT NULL COMMENT '子公司编号',
  `info` varchar(255) DEFAULT NULL COMMENT '业务信息',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `record_2` (
  `id` int(11) NOT NULL,
  `companyid` int(11) DEFAULT NULL COMMENT '子公司编号',
  `info` varchar(255) DEFAULT NULL COMMENT '业务信息',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `record_3` (
  `id` int(11) NOT NULL,
  `companyid` int(11) DEFAULT NULL COMMENT '子公司编号',
  `info` varchar(255) DEFAULT NULL COMMENT '业务信息',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3. 配置真实服务器信息

通过修改conf/schema.xml,来配置真实服务器的信息,并为数据库划分节点,指定数据表所在的节点。


注意关键信息为subTables="record_$0-3"和rule="rule-record",通过规则分片后,数据会落入record_0至record_3中。

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
  <!-- name为逻辑数据库名 -->
  <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
    <!-- 配置对应表名、子表名、对应数据库、规则名 -->
    <table name="record" subTables="record_$0-3" dataNode="dn1" rule="rule-record" />
  </schema>
  <!-- 真实数据库名 -->
  <dataNode name="dn1" dataHost="localhost1" database="dbcompany" />
  <!-- 配置物理数据库连接信息 -->
  <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="Easy@0122"/>
  </dataHost>
</mycat:schema>

4. 配置路由规则

在schema.xml中我们已经制定了record表存储的节点,且设置了路由规则的名称rule-record,然后我们设置该规则具体的策略。

修改conf/role.xml,配置规则如下,注意我们是按companyid列来进行规则应用的。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
  <!-- 规则 -->
  <tableRule name="rule-record">
    <rule>
      <!-- 规则应用的列 -->
      <columns>companyid</columns>
      <algorithm>mod-long</algorithm>
    </rule>
  </tableRule>
  <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
    <!-- 此处设置有多少个子表即可 -->
    <property name="count">4</property>
  </function>
</mycat:rule>

5. 配置MyCat服务信息

通过上面两个配置文件,我们已指定了库、表、分表路由规则,下面我们将其通过MyCat暴露出来,让客户端进行访问。

通过修改conf/server.xml配置MyCat对外服务信息,主要就是用户名、密码、以及上面指定的抽象数据库名称TESTDB。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
  <!-- system部分采用默认即可 -->
  <system>
    <property name="nonePasswordLogin">0</property>    <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
    <property name="useHandshakeV10">1</property>
    <property name="useSqlStat">0</property>    <!-- 1为开启实时统计、0为关闭 -->
    <property name="useGlobleTableCheck">0</property>    <!-- 1为开启全加班一致性检测、0为关闭 -->
    <property name="sequnceHandlerType">2</property>
    <property name="subqueryRelationshipCheck">false</property>    <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
    <!--默认为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">1</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>
  </system>
  <!-- 设置访问的用户名密码 -->
  <user name="root" defaultAccount="true">
    <property name="password">123456</property>
    <!-- 注意此处是之前设定的抽象数据库名称 -->
    <property name="schemas">TESTDB</property>
  </user>
</mycat:server>

6. 启动测试

双击bin/startup_nowrap.bat启动MyCat,然后使用Navicat或其他工具连接MyCat虚拟的数据库即可。

我们执行如下8条sql语句

insert into record (id,companyid,info)values(1,1,'test');
insert into record (id,companyid,info)values(4,2,'test');
insert into record (id,companyid,info)values(2,3,'test');
insert into record (id,companyid,info)values(3,4,'test');
insert into record (id,companyid,info)values(5,5,'test');
insert into record (id,companyid,info)values(7,6,'test');
insert into record (id,companyid,info)values(6,7,'test');
insert into record (id,companyid,info)values(8,8,'test');

执行完之后,我们看下真实物理数据库中的数据:

record_0数据如下,说明是按companyid取模匹配的,我们的策略生效了!

image.png

相关文章
|
SQL 关系型数据库 MySQL
MyCat2介绍以及部署和读写分离/分库分表(MyCat2.0)
MyCat2介绍以及部署和读写分离/分库分表(MyCat2.0)
1993 0
|
存储 关系型数据库 数据库
用Patroni配置PostgreSQL高可用集群
Patroni是Zalando开发的数据库高可用管理软件,用于编排和自动化PostgreSQL集群的管理过程。Patroni 需要一系列其他组件的支持,通过利用第三方分布式一致性软件,组建并实现数据库高可用方案。
用Patroni配置PostgreSQL高可用集群
|
SQL 关系型数据库 MySQL
ShardingSphere-Sharding-Proxy(安装和分表配置)| 学习笔记
快速学习ShardingSphere-Sharding-Proxy(安装和分表配置)。
ShardingSphere-Sharding-Proxy(安装和分表配置)| 学习笔记
|
存储 中间件 关系型数据库
数据库切片大对决:ShardingSphere与Mycat技术解析
数据库切片大对决:ShardingSphere与Mycat技术解析
1364 0
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
SQL 分布式计算 Hadoop
hadoop数据查询和分析
【5月更文挑战第9天】
530 1
|
人工智能 自然语言处理 机器人
AI心语:智能时代的情感纽带
本文旨在探索人工智能在情感计算领域的应用,以及这些技术如何帮助我们更好地理解和模拟人类情感。通过分析当前的技术进展和面临的伦理挑战,文章为读者提供了一个关于AI与情感结合世界的全面视角。
1092 6
|
数据采集 Java API
使用阿里云接口(API)进行身份证实名认证
如今随着互联网产业的多元化发展,尤其是互联网金融,O2O,共享经济等新兴商业形式的兴起,企业对实名认证业务的数据形式和数据质量有了更高的需求。如今也衍生出身份证实名认证业务,通过接口将身份证号码、姓名上传至阿里云,再与全国公民身份信息系统进行匹配,判断信息的一致性。
15367 1
使用阿里云接口(API)进行身份证实名认证

热门文章

最新文章