iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mycat分库路由规则
  • 156
分享到

Mycat分库路由规则

2024-04-02 19:04:59 156人浏览 安东尼
摘要

一、Mycat分库路由分为连续路由和离散路由。1、连续路由:(1)、常用的路由方式:auto-sharding-long、sharding-by-date、sharding-by-month(2)、优点:扩

一、Mycat分库路由分为连续路由和离散路由。

1、连续路由:

(1)、常用的路由方式:auto-sharding-long、sharding-by-date、sharding-by-month

(2)、优点:扩容无需迁移数据;范围条件查询消耗资源少。

(3)、缺点:存在数据热点的可能性;并发访问能力受限于单一或少量的Datanode

2、离线路由:

(1)、常用的路由方式:sharding-by-intfile、sharding-by-murmur、mod-long(取模)、crc32slot(取模)

(2)、优点:并发访问能力增强。

(3)、缺点:数据扩容比较困难,涉及到数据迁移问题;数据库链接消耗资源多。


二、auto-sharding-long:

1、路由规则:

<tableRule name="auto-sharding-long-userid">

      <rule>

             <columns>userid</columns>

             <alGorithm>rang-long-userid</algorithm>

      </rule>

</tableRule>

 

<function name="rang-long-userid"

        class="io.mycat.route.function.AutoPartitionByLong">

        <property name="mapFile">autopartition-long-userid.txt</property>

</function>

[root@host01 conf]# more autopartition-long-userid.txt

# range start-end ,data node index

# K=1000,M=10000.

0-1000=0

1001-2000=1

2001-3000=2

3001-4000=3

4001-5000=4

5001-6000=5

2、例子:

CREATE TABLE tb_user_detail_t (

  userid bigint not null primary key,

  name varchar(64) DEFAULT NULL,

  createtime datetime DEFAULT CURRENT_TIMESTAMP,

  moditytime datetime DEFAULT CURRENT_TIMESTAMP

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

写入数据

insert into tb_user_detail_t(userid,name) values(999,'name999');

insert into tb_user_detail_t(userid,name) values(1999,'name999');

insert into tb_user_detail_t(userid,name) values(2999,'name999');

insert into tb_user_detail_t(userid,name) values(3999,'name999');

insert into tb_user_detail_t(userid,name) values(4999,'name999');

insert into tb_user_detail_t(userid,name) values(5999,'name999');

、sharding-by-date:

1、路由规则:

<tableRule name="sharding-by-date-test">

<rule>

       <columns>createtime</columns>

       <algorithm> partbydate </algorithm>

</rule>

</tableRule>

<function name=" partbydate" class="io.mycat.route.function.PartitionByDate">

    <property name="dateFORMat"> yyyy-MM-dd HH:mm:ss </property>

    <property name="sBeginDate">2016-01-01 00:00:00</property>

    <property name="sPartionDay">2</property>

</function>

分片日期从2016-01-01开始,每2天一个分片。

2、例子:

CREATE TABLE `tb_user_partbydate` (

  `id` varchar(32) NOT NULL,

  `name` varchar(64) DEFAULT NULL,

  `createtime` varchar(10)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

insert into tb_user_partbydate (id,name,createtime) values('a0001','name1','2016-01-01 00:01:00');
insert into tb_user_partbydate (id,name,createtime) values('a0002','name1','2016-01-02 00:01:00');
insert into tb_user_partbydate (id,name,createtime) values('a0003','name1','2016-01-03 00:01:00');
insert into tb_user_partbydate (id,name,createtime) values('a0004','name1','2016-01-04 00:01:00');
insert into tb_user_partbydate (id,name,createtime) values('a0005','name1','2016-01-05 00:01:00');
insert into tb_user_partbydate (id,name,createtime) values('a0006','name1','2016-01-06 00:01:00');
insert into tb_user_partbydate (id,name,createtime) values('a0007','name1','2016-01-07 00:01:00');
insert into tb_user_partbydate (id,name,createtime) values('a0005','name1','2016-01-08 00:01:00');
insert into tb_user_partbydate (id,name,createtime) values('a0006','name1','2016-01-09 00:01:00');
insert into tb_user_partbydate (id,name,createtime) values('a0007','name1','2016-01-10 00:01:00');

、sharding-by-month:

1、路由规则:

<tableRule name="sharding-by-month">

        <rule>

                <columns>createtime</columns>

                <algorithm>partbymonth</algorithm>

        </rule>

</tableRule>

<function name="partbymonth"

        class="io.mycat.route.function.PartitionByMonth">

        <property name="dateFormat">yyyy-MM-dd HH:mm:ss</property>

        <property name="sBeginDate">2015-01-01 00:00:00</property>

</function>

dateFormat为日期格式,sBeginDate为开始日期。

2、例子:

CREATE TABLE ` tb_partbymonth ` (

  `id` varchar(32) NOT NULL,

  `name` varchar(64) DEFAULT NULL,

  `createtime` datetime DEFAULT CURRENT_TIMESTAMP

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

写入数据(注意这里不能使用now函数)

insert into tb_partbymonth(id,name,createtime) values('a0001','name1','2015-01-01 10:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0002','name1','2015-02-02 10:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0003','name1','2015-03-01 00:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0004','name1','2015-04-01 00:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0005','name1','2015-05-01 10:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0006','name1','2015-06-02 10:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0007','name1','2015-07-01 00:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0008','name1','2015-08-01 00:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0009','name1','2015-09-01 10:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0010','name1','2015-10-02 10:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0011','name1','2015-11-01 00:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0012','name1','2015-12-01 00:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0013','name1','2016-01-01 00:00:00');

五、sharding-by-intfile(枚举):

1、路由规则:

<tableRule name="sharding-by-intfile-provcode">

        <rule>

                <columns>provcode</columns>

                <algorithm>hash-int-provcode</algorithm>

        </rule>

</tableRule>

 

<function name="hash-int-provcode"

        class="io.mycat.route.function.PartitionByFileMap">

        <property name="mapFile">partition-hash-int-provcode.txt</property>

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

</function>

type=0 代表×××

type=1 代表字符串类型

[root@host01 conf]# more partition-hash-int-provcode.txt

1=0

2=1

3=2

4=3

5=4

6=5

7=0

8=1

9=2

10=3

11=4

12=5

DEFAULT_NODE=0 ##找不到省份匹配的情况下,默认放到数据库1

这里是6个库,序号0-5,将不同的省份映射到对应的库。所有的省份和库哦对应关系都要枚举出来。

2、例子:

CREATE TABLE `tb_user_t` (

  id bigint auto_increment not null primary key,

  `name` varchar(64) DEFAULT NULL,

   provcode int ,

  `createtime` datetime DEFAULT CURRENT_TIMESTAMP,

  `moditytime` datetime DEFAULT CURRENT_TIMESTAMP

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

发现分库情况下定义自动增长的id不管用,因为每个库都有自己的自增长id,通过mycat查询的话会有重复的id.

如下:

Mysql> select * from tb_user_t order by id;

+----+----------+----------+---------------------+---------------------+

| id | name     | provcode | createtime          | moditytime          |

+----+----------+----------+---------------------+---------------------+

|  1 | name0005 |        5 | 2017-08-09 10:54:44 | 2017-08-09 10:54:44 |

|  1 | name0001 |        1 | 2017-08-09 10:54:44 | 2017-08-09 10:54:44 |

|  1 | name0004 |        4 | 2017-08-09 10:54:44 | 2017-08-09 10:54:44 |

|  1 | name0002 |        2 | 2017-08-09 10:54:44 | 2017-08-09 10:54:44 |

|  1 | name0003 |        3 | 2017-08-09 10:54:44 | 2017-08-09 10:54:44 |

|  1 | name0006 |        6 | 2017-08-09 10:54:44 | 2017-08-09 10:54:44 |

|  2 | name0011 |       11 | 2017-08-09 10:54:53 | 2017-08-09 10:54:53 |

|  2 | name0007 |        7 | 2017-08-09 10:54:53 | 2017-08-09 10:54:53 |

|  2 | name0010 |       10 | 2017-08-09 10:54:53 | 2017-08-09 10:54:53 |

|  2 | name0008 |        8 | 2017-08-09 10:54:53 | 2017-08-09 10:54:53 |

|  2 | name0009 |        9 | 2017-08-09 10:54:53 | 2017-08-09 10:54:53 |

|  2 | name0012 |       12 | 2017-08-09 10:54:53 | 2017-08-09 10:54:53 |

|  3 | name0013 |       13 | 2017-08-09 11:12:17 | 2017-08-09 11:12:17 |

+----+----------+----------+---------------------+---------------------+

、sharding-by-murmur:

murmur算法是将字段进行hash后分发到不同的数据库,字段类型支持int和varchar.

1、路由规则:

<tableRule name="sharding-by-murmur-userid">

        <rule>

                <columns>userid</columns>

                <algorithm>murmur</algorithm>

        </rule>

</tableRule>

 

<function name="murmur"

class="io.mycat.route.function.PartitionByMurmurHash">

<property name="seed">0</property><!-- 默认是0 -->

<property name="count">6</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->

<property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->

<!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件

的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->

<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property>

用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映

射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->

</function>

2、例子:

CREATE TABLE `tb_user_murmur_string_t` (

  `userid` varchar(32) NOT NULL,

  `name` varchar(64) DEFAULT NULL,

  `createtime` datetime DEFAULT CURRENT_TIMESTAMP,

  `moditytime` datetime DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (`userid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

 

写入数据

insert into tb_user_murmur_string_t(userid,name) values('user002','name002');

insert into tb_user_murmur_string_t(userid,name) values('user003','name003');

insert into tb_user_murmur_string_t(userid,name) values('user004','name004');

insert into tb_user_murmur_string_t(userid,name) values('user005','name005');

insert into tb_user_murmur_string_t(userid,name) values('user006','name006');

insert into tb_user_murmur_string_t(userid,name) values('user007','name007');

insert into tb_user_murmur_string_t(userid,name) values('user008','name008');

insert into tb_user_murmur_string_t(userid,name) values('user009','name009');

insert into tb_user_murmur_string_t(userid,name) values('user010','name010');

、crc32slot:

crs32算法,分库字段类型支撑int和varchar.

1、路由规则:

<tableRule name="crc32slot">

       <rule>

           <columns>id</columns>

           <algorithm>crc32slot</algorithm>

       </rule>

 </tableRule>

 <function name="crc32slot" class="io.mycat.route.function.PartitionByCRC32PreSlot">

        <property name="count">6</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->

 </function>

count=6指定需要分库的个数.

2、例子:

CREATE TABLE `tb_user_crc32slot_t` (

  `id` varchar(32) NOT NULL,

  `name` varchar(64) DEFAULT NULL,

  `createtime` datetime DEFAULT CURRENT_TIMESTAMP,

  `moditytime` datetime DEFAULT CURRENT_TIMESTAMP

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

写入数据:

insert into tb_user_crc32slot_t(id,name) values('a0002','name1');

insert into tb_user_crc32slot_t(id,name) values('a0003','name1');

insert into tb_user_crc32slot_t(id,name) values('a0004','name1');

insert into tb_user_crc32slot_t(id,name) values('a0005','name1');

insert into tb_user_crc32slot_t(id,name) values('a0006','name1');

insert into tb_user_crc32slot_t(id,name) values('a0007','name1');

insert into tb_user_crc32slot_t(id,name) values('a0008','name1');

insert into tb_user_crc32slot_t(id,name) values('a0009','name1');

insert into tb_user_crc32slot_t(id,name) values('a0010','name1');

insert into tb_user_crc32slot_t(id,name) values('a0011','name1');

insert into tb_user_crc32slot_t(id,name) values('a0012','name1');

insert into tb_user_crc32slot_t(id,name) values('a0013','name1');

insert into tb_user_crc32slot_t(id,name) values('a0014','name1');

insert into tb_user_crc32slot_t(id,name) values('a0015','name1');


、mod-long:

1、路由规则:对十进制数进行按照节点取模。

<tableRule name="mod-long">

       <rule>

           <columns>id</columns>

           <algorithm>mod-long</algorithm>

       </rule>

 </tableRule>

 <function name="mod-long" class="io.mycat.route.function.PartitionByMod">

        <property name="count">3</property>

         <!-- 要分片的数据库节点数量,必须指定,否则没法分片,即对十进制数进行按照节点取模,将数据离散的分散到各个数据节点上 -->

 </function>



九、mycat分库规则E/R规则 :


1、路由规则:

E/R规则通过childTable设定之后,父子表相同的Id会落在相同的库,这样的避免关联的时候跨库进行关联.

joinKey="order_id" 是子表的order_id字段

parenTKEy="id"     是父表的id字段

即子表通过order_id字段跟父表的id字段进行关联

Mycat分库路由规则

2、例子

(2.1)、创建表语句:

create table orders

(

  id int not null,

  order_name varchar(64),

  createtime datetime DEFAULT CURRENT_TIMESTAMP,

  moditytime datetime DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (id)

);



create table orders_cargo

(

  order_id int not null,

  cargo_name varchar(64),

  createtime datetime DEFAULT CURRENT_TIMESTAMP,

  moditytime datetime DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (order_id)  

);

(2.2)、客户Custermer和订单Order

    每个客户和每个客户的订单最好在同一个库中。

    Mycat分库路由规则

3、如果把父表最为全局表也能解决join的效率问题。

Mycat分库路由规则

您可能感兴趣的文档:

--结束END--

本文标题: Mycat分库路由规则

本文链接: https://www.lsjlt.com/news/37336.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mycat分库路由规则
    一、Mycat分库路由分为连续路由和离散路由。1、连续路由:(1)、常用的路由方式:auto-sharding-long、sharding-by-date、sharding-by-month(2)、优点:扩...
    99+
    2022-10-18
  • Mycat分表分库原则
    分表分库虽然能解决大表对数据库系统的压力,但它并不是万能的,也有一些不利之处,因此首要问题是,分不分库,分哪些库,什么规则分,分多少分片。  原则一:能不分就不分,1000万以内的表,不建议分片,...
    99+
    2022-10-18
  • Mycat分片规则是怎么样的
    Mycat分片规则是怎么样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 1.sharding-by-intfile hash分片表...
    99+
    2022-10-19
  • laravel路由规则有哪些
    Laravel路由规则有以下几种:1. 基本路由规则:包括GET、POST、PUT、PATCH、DELETE等请求方法的路由规则。2...
    99+
    2023-09-06
    laravel
  • GateWay路由规则与动态路由详细介绍
    目录1、路由规则2、动态路由1、路由规则 Spring Cloud GateWay 帮我们内置了很多 Predicates功能,实现了各种路由匹配规则(通过 Header、请求参数等...
    99+
    2022-11-13
  • 苹果cms默认路由规则路径
    当我们在自定义设置苹果cms伪静态的时候会对苹果cms默认路由规则路径进行修改,假如我们修改失败后不能打开或是伪静态设置后404,想恢复到原来默认路由规则路径,可以直接复制下面的苹果cms默认路由规则路径粘贴进去恢复即可。1,苹果cms默认...
    99+
    2023-06-03
  • nginx路由匹配规则解析
    一、规则分类 = 精确匹配             (优先级最高)^~ 精确前缀匹配         (优先级仅次于=)~ 区分大小写的正则匹配   (优先级次于^~)~* 不区分大小写的正则匹配   (...
    99+
    2023-09-25
    服务器 运维 nginx Powered by 金山文档
  • ThinkPHP中如何修改路由规则
    这篇文章主要介绍“ThinkPHP中如何修改路由规则”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ThinkPHP中如何修改路由规则”文章能帮助大家解决问题。一、路由的基本概念在Think PHP框...
    99+
    2023-07-05
  • Mycat读写分离以及拆库拆表综合实验3:通过日志分析mycat路由过程
    #在客户端查询t1表中id=1的值 我们在之前的schma.cnf中定义了t1在是一张全局表,且位于名称为mysql的分片节点(datanode)上,因此当mycat拦截到客户端SQL语句之后,分析t1位...
    99+
    2022-10-18
  • ASP.NET Core中怎么给路由规则命名
    今天就跟大家聊聊有关ASP.NET Core中怎么给路由规则命名,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。比如,放到 /Views 下。Views(目录)  ...
    99+
    2023-06-19
  • CSS规则由什么部分构成
    本篇内容主要讲解“CSS规则由什么部分构成”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS规则由什么部分构成”吧! CSS 规定由两个主要的有部分形成:选...
    99+
    2022-10-19
  • CSS规则由哪些部分组成
    这篇文章主要讲解了“CSS规则由哪些部分组成”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS规则由哪些部分组成”吧! CSS 规则由两个主要的部分构成...
    99+
    2022-10-19
  • Thinkphp路由定义伪静态规则的方法
    这篇文章主要介绍了Thinkphp路由定义伪静态规则的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Thinkphp路由定义伪静态规则的方法文章都会有所收获,下面我们一起来看看吧。Thinkphp 6.0路...
    99+
    2023-06-30
  • MVC路由自定义及视图找寻规则的示例分析
    这篇文章将为大家详细讲解有关MVC路由自定义及视图找寻规则的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。MVC路由自定义相信对于MVC路由的配置大家也都了解过一些,其实,这也不是本章的重点。创建...
    99+
    2023-06-17
  • SpringCloud 服务网关路由规则的坑及解决
    一、场景简述 笔者最近用到SpringCloud 服务网关的时候,进行服务网关的路由测试,发现无法路由自己设置的规则,测试的时候如下 通过错误排查发现,原来是路由规则写错了! 路由...
    99+
    2022-11-12
  • PHP中使用路由匹配器实现路由规则的动态配置和扩展
    在Web应用程序中,路由规则是非常重要的一部分。它决定了如何根据用户的请求将其映射到相应的处理程序或控制器。传统的做法是在应用程序的代码中硬编码路由规则,这样会导致代码难以维护和扩展。为了解决这个问题,可以使用路由匹配器来实现路由规则的动态...
    99+
    2023-10-21
    路由匹配器 (Route Matcher) 路由规则 (Route Rules) 动态配置 (Dynamic Confi
  • React路由规则定义与声明式导航及编程式导航分别介绍
    目录1. 路由使用2. 声明式导航3. 编程式导航1. 路由使用 安装路由模块: 路由模块不是react自带模块,需要安装第3方模块: yarn add react-router-d...
    99+
    2022-11-13
  • Spring cloud网关gateway进行websocket路由转发规则配置过程
    目录Spring cloud网关gateway进行websocket路由转发规则配置一、websocket及http路由转发规则配置补充:Spring Cloud Gateway--...
    99+
    2023-05-14
    Spring cloud网关gateway 路由转发规则 Spring cloud gateway 路由转发 Spring cloud gateway Spring Cloud Gateway配置路由
  • Spring cloud网关gateway进行websocket路由转发规则怎么配置
    这篇“Spring cloud网关gateway进行websocket路由转发规则怎么配置”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下...
    99+
    2023-07-05
  • k8s Ingress实现流量路由规则控制的定义格式类型
    目录前言什么是 IngressIngress 的定义格式Ingress 的类型有哪几种?1. Simple fanout2. Name-based virtual hosting3....
    99+
    2023-05-15
    k8s Ingress流量路由规则控制 k8s Ingress
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作