第106讲:Mycat实践指南:范围分片下的水平分表详解

news2024/11/25 8:19:37

文章目录

    • 1.Mycat水平拆分的分片规则
    • 2. Mycat水平拆分之范围分片
      • 2.1.使用范围分片水平分表的背景
      • 2.2.水平分表范围分片案例
      • 2.3.准备测试的表结构
      • 2.4.配置Mycat实现范围分片的水平分表
        • 2.4.1.配置Schema配置文件
        • 2.4.2.配置Rule分片规则配置文件
        • 2.4.3.配置Server配置文件
        • 2.4.4.重启Mycat
      • 2.5.写入数据观察水平分表效果

1.Mycat水平拆分的分片规则

Mycat水平分库分表,都是对表中的数据量进行拆分的,将一个数据库中的表数据拆分到多个数据库实例中,并不能实现将一个表在当前数据库中拆成多个表。

Mycat的分片规则都已经写好了,我们直接来调用即可,无需认为编写。

水平拆分主要是根据分片规则进行逻辑上的拆分,常用的水平拆分分片规则如下:

  • 范围分片
    • 根据表中的数据量大小,决定将表中的数据拆分到那些分片上,例如0~500w条数据拆分到分片1,500w-1000w数据拆分到分片2。
  • 取模分片
    • 根据数据量与节点数量的求模运算,根据运算结果,决定数据存储的分片,例如插入第50条数据,节点有4个,那么就是50÷4=12余2,余数2就是该条数据写入的分片ID。
  • 一致性Hash分片
    • 所谓一致性哈希,相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加而改变原来数据的分区位置,有效的解决了分布式数据的拓容问题。
  • 枚举分片
    • 通过在配置文件中配置可能的枚举值, 指定数据分布到不同数据节点上, 本规则适用于按照省份、性别、状态拆分数据等业务
  • 日期分片
    • 根据日期时间来进行分库分表,常见的有按月分表,每个月产生一个新表。

2. Mycat水平拆分之范围分片

2.1.使用范围分片水平分表的背景

平台库下有一张表的数据量非常多,目前已经达到了600w行数据,查询效率很低,数据量越大,索引的结构就越高,性能会有所下降。

基于这种情况,我们决定针对这张业务表进行水平分表,分表后,原表的数据量就会被分到多张表中,缓解单表的压力,将该表的数据拆分到多个数据库实例中存放,0500万的数据在分片1中,500100万的数据在分片2中。

水平分表,如果不想将表数据拆分到多个数据库实例中,只想在本库新增一张表,来存放后期产生的数据,这种情况就不能通过Mycat实现了,Mycat只能跨实例分表,无法在本实例下分表。

2.2.水平分表范围分片案例

在db_1数据库下有一张table1表,其数据量已经达到500w行,查询效率较低,现需要对这张表进行水平分表,0500w行的数据写入到分片1的数据库实例中,5001000w行的数据写入到分片2的数据库实例中。

2.3.准备测试的表结构

配置水平分表前,需要将要分的表在所有的分片上创建出来。

如果是生产环境的某张表进行水平分表,比如说表数据400w行都在分片1中读写的,水平分表时,分片1中的数据可以不动,按照范围,400w以后的数据在分表完成后,会自动路由到分片2上,因此只需要在所有的分片上准备好表结构即可,旧数据就在原实例。

当然也可以手动进行分表,就是开发同事会比较麻烦。

分片节点数依旧是2个,还是之前垂直分库分表时使用的两套双主双从集群。

1.在两个分片上创建数据库
[root@mysql-1 ~]# mysql -uroot -p123456 -P3306 -h 192.168.20.11 -e "create database db_2;"
[root@mysql-1 ~]# mysql -uroot -p123456 -P3307 -h 192.168.20.11 -e "create database db_2;"

2.在两个分片上创建表结构
[root@mysql-1 ~]# mysql -uroot -p123456 -P3306 -h 192.168.20.11 -e "use db_2; create table table1 (id int,name varchar(10));"
[root@mysql-1 ~]# mysql -uroot -p123456 -P3307 -h 192.168.20.11 -e "use db_2; create table table1 (id int,name varchar(10));"

image-20220714165957282

2.4.配置Mycat实现范围分片的水平分表

2.4.1.配置Schema配置文件

我们针对table1这张表进行水平分表时,要为其同时指定上两个分片,然后再为其指定分片规则,同时指定两个分片后,Mycat根据分片规则路由到不同的分片上。

[root@mysql-1 ~]# vim /data/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">  
<mycat:schema xmlns:mycat="http://io.mycat/">
         <!--定义逻辑库 库名叫做db_shopping 该逻辑库关联dn1这个数据节点-->
        <schema name="db_2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
            <!--定义逻辑表 将table1这张大表水平拆分到dn1、dn2这两个分片上 并且分片规则使用auto-sharding-long-->
            <table name="table1" dataNode="dn1,dn2" rule="auto-sharding-long"/>
        
        </schema>  

        <!--定义数据节点 也就是分片 一个分片会关联一个数据主机组 然后对应真实的数据库名称-->
        <dataNode name="dn1" dataHost="mysqlcluster-1" database= "db_2" />          
        <dataNode name="dn2" dataHost="mysqlcluster-2" database= "db_2" />          

        <!--定义数据主机 在这个标签下定义具体的读写操作路由的数据库实例地址 schema、table划分如何指定的是该数据主机关联的数据节点 那么对应的库、表都会被存储在数据主机定义的数据库实例中-->
        <dataHost name="mysqlcluster-1" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql"  dbDriver="native" switchType="1">    
                <heartbeat>select user()</heartbeat>  
                <!--定义写操作路由的数据库实例-->
                <writeHost host="c1-1-master3306" url="192.168.20.11:3306" user="root" password="123456">
                        <!--定义读操作路由的数据库实例-->
                        <readHost host="c1-1-slave3308" url="192.168.20.11:3308" user="root" password="123456" />
                </writeHost> 
                <!--备用的主库 也是提供写操作的数据库,当主库c1-1-master3306故障后 备用库开始提供写操作-->
                <writeHost host="c1-2-master3306" url="192.168.20.12:3306" user="root" password="123456">
                        <!--备用主库的从库 从始至终 只要备用主库不故障 会一直提供读服务-->
                        <readHost host="c1-2-slave3308" url="192.168.20.12:3308" user="root" password="123456" />
                </writeHost> 
        </dataHost>  

        <dataHost name="mysqlcluster-2" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql"  dbDriver="native" switchType="1">    
                <heartbeat>select user()</heartbeat>  
                <writeHost host="c2-1-master3307" url="192.168.20.11:3307" user="root" password="123456">
                        <readHost host="c2-1-slave3309" url="192.168.20.11:3309" user="root" password="123456" />
                </writeHost> 
                <!--备用主库db3 主库db1故障后 开始提供写操作-->
                <writeHost host="c2-2-master3307" url="192.168.20.12:3307" user="root" password="123456">
                        <!--备用主库的从库 从始至终 只要备用主库不故障 会一直提供读服务-->
                        <readHost host="c2-2-slave3309" url="192.168.20.12:3309" user="root" password="123456" />
                </writeHost> 
        </dataHost>  

</mycat:schema>
2.4.2.配置Rule分片规则配置文件

在Rule分片规则配置文件中,我们要配置主要是根据表中的那个字段进行范围分片,如果做范围分片的字段也是id字段,就不需要调整这个配置文件,只需要调整范围分片中传入的参数。

如果同时由多个表需要范围分片,并且做范围分片的字段都是不同的,我们也可以自己定义一个分片规则,只是给分片规则改个名而已,然后指定做分片的字段,指定调用哪一个函数即可,范围分片的函数是rang-long,在配置文件下面有显示。

[root@mysql-1 ~]# vim /data/mycat/conf/rule.xml 
	<!--分片规则的名称-->>
    <tableRule name="auto-sharding-long">
        <rule>
            <!--要对哪个字段进行分片-->>
            <columns>id</columns>
            <!--使用那种类型的分片 指定某类型分片所对应的函数-->>
            <algorithm>rang-long</algorithm>
        </rule>
    </tableRule>

    <!--特定类型所对应的函数名称-->>
    <function name="rang-long"
        class="io.mycat.route.function.AutoPartitionByLong">
        <!--分片规则函数传入的参数 从这里看会传入一个文件 这个文件应该就是要定义的范围-->>
        <property name="mapFile">autopartition-long.txt</property>
    </function>

范围分片的函数需要把autopartition-long.txt这个文件的内容,作为传参,该文件中定义的就是分片的范围。

该文件的含义:1M=10000 -K=1000,默认参数0500M也就是0500w之间的数据路由到分片1,500-1000M的数据路由到分片2,1000-1500M的数据路由到分片3

=0指的是我们再Schema配置文件中声明的第一个分片dn1,以此类推,Rule配置文件中定义的分片id都是从0开始的。

image-20220714173415459

我们的需求刚好就是0500w和5001000w,并没有说1000-1500W的数据如何路由,并且我们也没有第三个分片节点,因此我们需要配置这个文件,将第三个分片删除,否则启动Mycat将会是啊比,我们也可以根据自己实际的情况来配置分片范围。

[root@mysql-1 conf]# vim autopartition-long.txt
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
2.4.3.配置Server配置文件
[root@mysql-1 ~]# vim /data/mycat/conf/server.xml
    <user name="root" defaultAccount="true">
        <!--登录用户的密码-->
        <property name="password">123456</property>
        <!--该用户登录后可以显示那些Schema-->
        <property name="schemas">db_2</property>
    </user>
2.4.4.重启Mycat
[root@mysql-1 ~]# mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

2.5.写入数据观察水平分表效果

1)写入0~500W的数据观察是否会落在分片1中

[root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
mysql> use db_2;
mysql> insert into table1 (id,name) values (100,'abc');
mysql> insert into table1 (id,name) values (100000,'abc');

0~500W之间的数据成功被分到了分片1这个集群中,水平分表成功。

image-20220714174343348

2)写入0~500W的数据观察是否会落在分片1中

[root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
mysql> insert into table1 (id,name) values (7000000,'abc');
mysql> insert into table1 (id,name) values (9000078,'abc');

500W~1000W之间的数据成功被分到了分片2这个集群中,水平分表成功。

image-20220714174559309

3)在Mycat中通过查询table1表就能看到所有的数据

image-20220714233137063

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1493416.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛客网 华为机试 取近似值

本题是要实现四舍五入。我们采用float的数据类型&#xff0c;因为这样数据精度更高。然后我们可以把得到的数据0.5&#xff0c;然后再转换成int数据类型&#xff0c;因为转换成int数据类型的时候是向下取整的&#xff0c;比如4.9转换成int就是4&#xff0c;4.2转换成int也是4。…

Python错题集-7:DeprecationWarning: Conversion of an array with ndim(被弃用警告)

1问题描述 DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.) X[i] np.random.nor…

LCR 188. 买卖芯片的最佳时机

解题思路&#xff1a; 动态规划 方法一&#xff1a;常规解法 class Solution {public int bestTiming(int[] prices) {int n prices.length;if (n 0) return 0;int[] dp new int[n];int cost prices[0];for (int i 1; i < n; i) {cost Math.min(cost, prices[i]);dp…

Unity类银河恶魔城学习记录8-2 p78.Improving black with clone creating源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作【Unity教程】从0编程制作 Blackhole_Hotkey_Controller.cs using System.Collections; using System.Collectio…

Dell R620中文手册下载

poweredge-r620_owners-manual_zh-cn.pdf https://url20.ctfile.com/f/36743220-1030280698-8d9322?p2024 (访问密码: 2024)

为什么我建议你2024年一定要入局鸿蒙?

自去年发布现象级“爆款”手机Mate 60后&#xff0c;华为就备受关注。小灰作为一枚程序员&#xff0c;关注的重心更偏向于技术。华为手机搭载的国产自研的鸿蒙操作系统&#xff08;HarmonyOS&#xff09;&#xff0c;已经成为一个业界的里程碑&#xff0c;是我国国产技术自主化…

ChatGPT Plus 自动扣费失败,如何续订

ChatGPT Plus 自动扣费失败&#xff0c;如何续订 如果您的 ChatGPT Plus 订阅过期或扣费失败&#xff0c;本教程将指导您如何重新订阅。 本周更新 ChatGPT Plus 是一种每月20美元的订阅服务。扣费会自动进行&#xff0c;如果您的账户余额不足&#xff0c;OpenAI 将在一次扣费…

C语言写学生信息管理系统

说明:本博文来自CSDN-问答板块,题主提问。 需要:用C语言设计一个学生信息管理系统(尽量不使用指针),学生信息包括学号,姓名,数学成绩,C语言成绩,英语成绩和每个学生的总成绩这几项。系统要实现如下几个功能:1.添加学生2.删除学生3.修改学生信息4.查询学生信息5进行学…

C#,无监督的K-Medoid聚类算法(K-Medoid Algorithm)与源代码

1 K-Medoid算法 K-Medoid&#xff08;也称为围绕Medoid的划分&#xff09;算法是由Kaufman和Rousseeuw于1987年提出的。中间点可以定义为簇中的点&#xff0c;其与簇中所有其他点的相似度最小。 K-medoids聚类是一种无监督的聚类算法&#xff0c;它对未标记数据中的对象进行聚…

安装/升级 gcc

文章目录 查看当前 gcc 版本查看 yum 软件库 gcc 版本列表下载最新版本安装 查看当前 gcc 版本 查看 yum 软件库 gcc 版本列表 只有一个4.8的版本&#xff0c;过旧 下载最新版本 wget https://ftp.gnu.org/gnu/gcc/gcc-13.2.0/gcc-13.2.0.tar.gz 安装 ./configure 报错 提示…

【深圳五兴科技】Java后端面经

本文目录 写在前面试题总览1、java集合2、创建线程的方式3、对spring的理解4、Spring Boot 和传统 Spring 框架的一些区别5、springboot如何解决循环依赖6、对mybatis的理解7、缓存三兄弟8、接口响应慢的处理思路9、http的状态码 写在前面 关于这个专栏&#xff1a; 本专栏记录…

基于51单片机的电子秒表Protues仿真设计

目录 一、设计背景 二、实现功能 三、仿真结果 四、源程序 一、设计背景 随着科技的不断发展&#xff0c;电子设备在我们生活中扮演着愈加重要的角色。这些电子设备不仅使我们的生活更加便利&#xff0c;还帮助我们提高工作效率和精确度。其中&#xff0c;电子秒表是常用的计…

如何配置JDK的环境变量(简单灵活易懂)

前言&#xff1a; 开始学习java的小伙伴们一定都备一件事困扰过&#xff0c;那就是jdk的环境变量的配置&#xff0c;搞不懂为啥要配置环境变量&#xff0c;到底有啥子用&#xff1f;接下来小编带大家配置一下 配置环境变量的作用&#xff1f; Path&#xff1a;当用javac、jav…

redis 缓存击穿问题(互斥锁,逻辑过期)

1、缓存击穿问题 缓存击穿问题:一个被高并发访问并且缓存重建业务较复杂的key突然失效了&#xff0c;无数的请求访问会在瞬间给数据库带来巨大的冲击。 场景:假设线程1在查询缓存之后&#xff0c;本来应该去查询数据库&#xff0c;然后把这个数据重新加…

Java学习笔记002——类的修饰符

在Java语言中&#xff0c;类的访问修饰符决定了其它类能够访问该类的方式。类有如下4种访问修饰符&#xff0c;在创建类时用于类的声明&#xff1a; 1、public: 当一个类被声明为public时&#xff0c;它可以从任何其他类中被访问&#xff0c;无论这些类位于哪个包中。通常&am…

探索设计模式的魅力:深入解析解释器模式-学习、实现与高效使用的全指南

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;并且坚持默默的做事。 探索设计模式的魅力&#xff1a;解析解释器模式学习、实现与高效使用全指南 文章目录 一、案…

2024大厂Java面试最火问题,1200页文档笔记

前言 ⽂章有点⻓&#xff0c;请耐⼼看完&#xff0c;绝对有收获&#xff01;不想听我BB直接进⼊⾯试分享&#xff1a; 准备过程蚂蚁⾦服⾯试分享拼多多⾯试分享字节跳动⾯试分享最后总结个人所得&#xff08;供大家参考学习&#xff09; 当时我⾃⼰也准备出去看看机会&#…

2024 年广西职业院校技能大赛高职组《云计算应用》赛项赛题第 3 套

#需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; 某企业根据自身业务需求&…

工业网关、物联网网关与PLC网关是什么?

网关是什么&#xff1f; 网关是一种用于连接不同网络的网络设备&#xff0c;其作用是实现网络之间的通信和数据交换。它负责将一个网络的数据转发到另一个网络&#xff0c;并且可以进行路由、转换和过滤等处理。通常用于连接局域网和广域网之间&#xff0c;可以是硬件设备或者软…

Jenkins如何做到parameter页面里2个参数的联动

在Jenkins中&#xff0c;参数化构建是一种非常有用的功能&#xff0c;它可以让用户在构建过程中输入参数&#xff0c;从而实现更灵活的构建流程。有时候&#xff0c;我们希望两个参数之间能够实现联动&#xff0c;即一个参数的取值会影响另一个参数的取值。要实现这样的功能&am…