Mycat 之 水平拆分(分表)_兰叶书的博客-程序员秘密

技术标签: 水平拆分  mycat  分表  mysql  数据库  

分表原则:按照数据行的切分。就是将表中的某些有关联的字段分到一个数据库,而另外的某些字段又切分到其他数据库中。原理图如下:

主表

一、配置文件


vim /usr/local/mycal/conf/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" dataNode="dn1">
                <table name="customer" dataNode="dn2"></table>
                <table name="orders" dataNode="dn1,dn2" rule="mod_rule"></table>
        </schema>
        <dataNode name="dn1" dataHost="host1" database="orders" />
        <dataNode name="dn2" dataHost="host2" database="orders" />
        <dataHost name="host1" 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.157.133:3306" user="root"
                                   password="root">
                </writeHost>
        </dataHost>
        <dataHost name="host2" 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.157.139:3306" user="root"
                                   password="root">
                </writeHost>
        </dataHost>
</mycat:schema>

在rule配置文件里新增分片规则mod_rule,并指定customer_id。选择的分片算法是mod_long(对字段求模运算),customer_id对两个节点求模,根据结果分片。

vim /usr/local/mycal/conf/rule.xml

<tableRule name="mod_rule">
        <rule>
                <columns>customer_id</columns>
                <algorithm>mod-long</algorithm>
        </rule>
</tableRule>

<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <!-- how many data nodes -->
        <property name="count">2</property>
</function>

二、在数据节点dn2上建立orders表

三、重启mycat,让配置生效

mycat console

四、访问mycat实现分片

INSERT INTO orders(id,order_type,customer_id,amount) VALUES (1,101,100,100100);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(2,101,100,100300);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(3,101,101,120000);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(4,101,101,103000);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020);

注:在mycat里向orders表插入数据时,insert字段不能省略

在mycat里查看是否分表成功

到此分表已经完成了,下面我们来介绍一下订单表【orders】如何与订单详情表【orders_detail】进行join查询。

注:子表的存储位置将依赖于主表,根据这一思路提出了E-R关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上。

ER表【子关联表】

 一、配置orders的关系表


vim /usr/local/mycal/conf/schema.xml

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        <table name="customer" dataNode="dn2"></table>
        <table name="orders" dataNode="dn1,dn2" rule="mod_rule">
             <childTable name="orders_detail" primaryKey="id" joinKey="order_id" parentKey="id"/>
        </table>
</schema>

二、在数据节点dn2上建立orders_detail表

三、重启mycat,让配置生效

mycat console

四、访问mycat实现分片

INSERT INTO orders_detail(id,detail,order_id) values(1,'detail1',1);
INSERT INTO orders_detail(id,detail,order_id) VALUES(2,'detail1',2);
INSERT INTO orders_detail(id,detail,order_id) VALUES(3,'detail1',3);
INSERT INTO orders_detail(id,detail,order_id) VALUES(4,'detail1',4);
INSERT INTO orders_detail(id,detail,order_id) VALUES(5,'detail1',5);
INSERT INTO orders_detail(id,detail,order_id) VALUES(6,'detail1',6);

五、mycat里验证关联

Select o.*,od.detail from orders o inner join orders_detail od on o.id=od.order_id order by o.id;

到此了关联表就配置完成了,但是因为有的表两个数据分片都需要用到,而且数据量比较小,所以就有了全局表的引入。

全局表

特点如下:

1、全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性

2、全局表的查询操作,只从一个节点获取

3、全局表可以跟任何一个表进行 JOIN 操作

一、配置全局表【dict_order_type】

vim /usr/local/mycal/conf/schema.xml

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        <table name="customer" dataNode="dn2"></table>
        <table name="orders" dataNode="dn1,dn2" rule="mod_rule">
             <childTable name="orders_detail" primaryKey="id" joinKey="order_id" parentKey="id"/>
        </table>
        <table name="dict_order_type" dataNode="dn1,dn2" type="global"></table>
</schema>

二、在数据节点dn2上建立dict_order_type表

三、重启mycat,让配置生效

mycat console

四、访问mycat实现分片

INSERT INTO dict_order_type(id,order_type) VALUES(101,'type1');
INSERT INTO dict_order_type(id,order_type) VALUES(102,'type2');

五、mycat里验证

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013227399/article/details/109841467

智能推荐

对FCOS论文的一点理解_fcos算法创新点_苗老大的博客-程序员秘密

一、创新点1、anchor free,对每个feature map 上的每个像素点进行预测2、FPN 多尺度预测,预测不同尺度的目标框3、引入Center-ness 层,减少误检框二、网络输出1、分类分支特征图上的每个点(x,y) 通过下面的公式映射到input image上的接近中心的位置2、Center-ness 分支主要目的是为了减少误检框发现问题:部分误检框离真实框的中心点距离较大解决方法:将分类支路的输出乘以一个权重图得到最终的分类置信度,而这.

ajax获取返回值两种方式_yuhui66666688gfbfdy的博客-程序员秘密

===用data,这种是通用的===function queryHealthCount(){ $.ajax({ url:'${ctx}/flex!flexHealth.json', async:false, type:'POST', dataType : 'json', success:function(data){ healthCou

编写简单的连接MongoDB数据库C++程序 && 解决编译C++程序时链接MongoDB动态库失败的问题_WUJIAQIANHUI的博客-程序员秘密

不过重点在于如何让这个程序真正可以跑起来显示出来结果,着实费了一番功夫。 1 #include 2 #include "client/dbclient.h" 3 4 using namespace mongo; 5 using namespace std; 6 void run() { 7 DBClientConnection c; 8 c.conne

java8中 Collectors.groupingBy用法_collector.groupingby_炎升的博客-程序员秘密

Collectors.groupingBy根据一个或多个属性对集合中的项目进行分组1、数据准备:public Product(Long id, Integer num, BigDecimal price, String name, String category) { this.id = id; this.num = num; this.price = price; this.name = name; this.category = category;}...

揽海听风,驾广汽讴歌TXL-L寻找中国一号公路_趣味科技v的博客-程序员秘密

虽然古人云“七月流火”,但是入秋后的北京,依旧让人感觉闷热不已。如果这时候能够驾着爱车一路沿海飞驰,听风吟唱,那该有多么惬意!这样令人遐想的场景,还真的就梦想成真了。8月...

JAVA——Exception(异常)_exception::new 参数?_BerglingYY的博客-程序员秘密

异常机制概述:什么是异常,java提供异常处理机制有什么用int a = 10;int b = 0;// 实际上JVM在执行到此处的时候,会new异常对象:new ArithmeticException("/ by zero");// 并且JVM将new的异常对象抛出,打印输出信息到控制台了。int c = a / b;System.out.println(a + "/" + b + "=" + c);// 此处运行也会创建一个:ArithmeticException类型的异常对象。

随便推点

SpringBoot 同一项目本地启动两个实例(同一环境和不同环境)_本地启动两个相同实例的springboot_桃月十二_的博客-程序员秘密

方法一 ( 同一环境 )可以通过修改端口号来实现拷贝配置(原端口号8070),并修改其端口号8060启动以后,在nacos控制台查看实例实例详情,注册了两个实例,端口号分别为8070,8060方法二 ( 不同环境 )可以通过修改端口号\指定环境来实现在上面修改端口号的基础上,配置指定环境启动发现8070请求的是local环境配置,8060请求的是alpha环境配置8070启动日志截图8060启动日志截图...

人生尽陷邮件中:是时候清理邮箱了!_「已注销」的博客-程序员秘密

全文共2971字,预计学习时长8分钟图源:unsplash最近几周,谷歌反复发送提醒,说笔者的谷歌硬盘容量已经接近极限。从前,笔者很少想到到谷歌会限制存储容量,该公司在数据收集方面的潜...

Windows wsl2支持systemd_程序航的博客-程序员秘密

背景很多Linux发行版都是使用systemd来管理程序进程,但是在WSL中默认是用init来管理进程的。为了符合长久的使用习惯,且省去不必要的学习成本,就在WSL的发行版(我这里安装的是Ubuntu20.04)中支持systemd,也就可以使用systemctl命令来启停进程。相关知识能够支持使用systemctl命令,提供完整 systemd 的项目有很多:diddledani/...

为什么老程序员的效率如此高?编程速度快,Bug数量又少_m0_66264798的博客-程序员秘密

i上厕所;i洗脸;…i做早餐;i终于出门了…i上公车…}getUpAndGotoWork();如果是老手,做法就是function getup(i){…}function fuckWC(i){…}function fuckTheJob(i){…}function Todo_Morning(){let i = 我;getup(i);//起床fuckWC(i);//上厕所fuckTheJob(i);//去上班}Todo_Morning();这一手漂亮的代码,是之

HBase版本问题:Column family table does not exist in region hbase_从此山水不相逢丶的博客-程序员秘密

解决HBase版本高低差异造成表查询失败问题如果出现这样的报错就是你HBASE的jar包与你的HBase的版本不一致我的hbse是1.2.1的版本,我用idea对hbase操作时用的包是2.1.2的org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException: org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException: Column family tabl

android.intent.action.MAIN与android.intent.category 决定哪个activity最先执行_mainactivity为什么最先执行_mosliang的博客-程序员秘密

http://hi.baidu.com/fgfd0/blog/item/a9ccaa1e76d85a0e41341700.htmlandroid.intent.category.LAUNCHER 具体有什么作用?我在xml里面加和不加 感觉没什么区别啊。谁能解释下!

推荐文章

热门文章

相关标签