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

文章目录

    • 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高级语言讲义2018计专(仅高级语言部分)

1.编写完整程序解决中国古代数学家张丘健在他的《算经》中提出的”百钱百鸡问题“&#xff1a;鸡翁一&#xff0c;值钱五&#xff1b;鸡母一&#xff0c;值钱三&#xff1b;鸡雏三&#xff0c;值钱一&#xff1b;百钱买百鸡&#xff0c;翁&#xff0c;母&#xff0c;雏各几何 …

x6.js 流程图绘制笔记,常用函数

官方参考网站如下&#xff1a;https://antv-x6.gitee.io/zh/docs/tutorial/about 安装x6 输入以下命令 npm install antv/x6 --save 引用插件代码如下&#xff1a; import { Graph } from antv/x6; 创建绘制区域 this.guiX6 new Graph({container: document.querySelect…

个人社区 项目测试

目 录 一.背景及介绍二.功能详情三.手动测试1.编写测试用例2.测试 一.背景及介绍 该项目采用了前后端分离技术&#xff0c;把我们的数据保存到数据库中&#xff0c;操作对象是用户和个人文章编辑保存&#xff0c;前端的页面实现了登录&#xff0c;列表&#xff0c;编辑&#x…

基于单片机的蓝牙无线密码锁设计

目 录 摘 要 Ⅰ Abstract Ⅱ 引 言 1 1 系统总体设计 3 1.1 系统设计要求 3 1.2 系统设计思路 3 2 系统硬件设计 5 2.1 设计原理 5 2.2 主控模块 5 2.3 芯片模块 8 2.4 矩阵键盘模块 9 2.5 液晶显示模块 10 2.6 继电器驱动模块 12 2.7 蜂鸣器模块 13 2.8 蓝牙模块 14 3 系统软…

鸿蒙4.0-DevEco Studio界面工程

DevEco Studio界面工程 DevEco Studio 下载与第一个工程新建的第一个工程界面回到Project工程结构来看 DevEco Studio 下载与第一个工程 DevEco Studio 下载地址&#xff1a; https://developer.harmonyos.com/cn/develop/deveco-studio#download 学习课堂以及文档地址&#x…

Docker 快速入门实操教程(完结)

Docker 快速入门实操教程&#xff08;完结&#xff09; Docker&#xff0c;启动&#xff01; 如果安装好Docker不知道怎么使用&#xff0c;不理解各个名词的概念&#xff0c;不太了解各个功能的用途&#xff0c;这篇文章应该会对你有帮助。 前置条件&#xff1a;已经安装Doc…

Vue.js+SpringBoot开发天然气工程运维系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统角色分类2.2 核心功能2.2.1 流程 12.2.2 流程 22.3 各角色功能2.3.1 系统管理员功能2.3.2 用户服务部功能2.3.3 分公司&#xff08;施工单位&#xff09;功能2.3.3.1 技术员角色功能2.3.3.2 材料员角色功能 2.3.4 安…

nRF52832——GPIO端口的应用

nRF52832——GPIO端口的应用 nRF52832 GPIO 端口资源描述nRF52832 GPIO 寄存器介绍GPIO 端口状态的设置GPIO 输出设置 nRF52832 GPIO 输出应用点亮第一个 LED 灯硬件部分Keil 工程搭建 蜂鸣器驱动硬件设计程序编写测试验证 nRF52832 GPIO 输入应用GPIO 输入扫描流程机械按键输入…

Vue3兄弟组件传值(同级别组件传值Vue3)

简述&#xff1a; Vue3兄弟组件传值&#xff0c;我们可以使用"Mitt"插件来实现。通过使用事件总线的方式&#xff0c;我们可以将数据从一个组件传递给另一个组件&#xff0c;实现兄弟组件之间的通信。 或者利用 Vue 3 自身的provide 和 inject 响应式 API 来实现兄弟…

STM32FreeRTOS消息队列(STM32Cube高效开发)

文章目录 一、队列&#xff08;一&#xff09;简介&#xff08;二&#xff09;FreeRTOS队列特点1、入队阻塞&#xff1a;队列满了&#xff0c;此时无法继续写入数据2、出队阻塞&#xff1a;队列为空&#xff0c;此时无法读出数据3、入队阻塞解除&#xff0c;有多个任务等待时&a…

实战:基于特征词的语音唤醒

本章前面介绍了纯理论知识&#xff0c;目的是阐述语音识别的方法。接着搭建了开发环境&#xff0c;让读者可以动手编写代码。下面以识别特定词为例&#xff0c;使用深度学习方法和Python语言实现一个实战项目——基于特征词的语音唤醒。 说明&#xff1a;本例的目的是演示一个…

当Sora风靡,AI风潮吹醒金融科技

以下文章来源&#xff1a;凤凰网 前有OpenAI发布了Sora&#xff0c; 后有苹果放弃了秘密进行了十年的造车项目&#xff0c;转身拥抱AI&#xff0c; 再有国内市场上此起彼伏的AI呐喊声&#xff0c; 一场以AI为主导的新热浪&#xff0c;正在来袭。 当AI的风潮开始兴盛&#x…

JavaScript 原型链继承:掌握面向对象的基础

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

springboot + jpa + 达梦数据库兼容 Mysql的GenerationType.IDENTITY主键生成策略

导入达梦数据库对hibernate的方言包 <dependency><groupId>com.dameng</groupId><artifactId>DmDialect-for-hibernate5.6</artifactId><version>8.1.2.192</version></dependency>配置文件中添加方言配置和主键生成策略配置…

(译) 理解 Prometheus 的范围向量 (Range Vector)

Prometheus 中 Range Vector 的概念是有一点不直观的&#xff0c;除非你彻底阅读并理解了官方提供的文档。谁会这样做呢&#xff0c;去读官方文档&#xff1f;大多的人应该会花些错误的时间去做了一些错误的事情&#xff0c;然后随机去寻找一篇像本文一样的文章去理解这个概念&…

2024年Java者未来的出路在哪里,java多线程面试

重要 大环境对于我们能力要求越来越高&#xff0c;医学专家又说今年冬天新冠肺炎将“席卷重来”。 如果疫情再次爆发&#xff0c;势必将再次影响企业的正常运作&#xff0c;一波裁员浪潮你又能否抗住&#xff1f; 不管如何&#xff0c;明年金三银四又是一波跳槽时机&#xf…

AbaqusCST仿真软件功能对比简介

一、功能对比 支持维度CST&#xff1a;用于设计、分析和优化电磁部件及系统。适用于整个 EM 范围内各类应用领域的电磁场解算。Abaqus&#xff1a;ABAQUS 是一套功能强大的工程模拟的有限元软件&#xff0c;其解决问题的范围从相对简单的线性分析到复杂的非线性问题。 ABAQUS 包…

基于springboot+vue的精简博客系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

flutter弹窗动画,2024年上半年最接地气的Android面经

正文 腾讯研发人数将近 2 万人&#xff0c;T4 级别的人数大概也不超过 500 人&#xff0c;这还是在近两年 T3 到 T4 级别人数增多的情况下。 该资料一共有五大章节&#xff0c;452页&#xff0c;是这位腾讯T4大佬耗时半个月熬夜整理出来的。 目录 第一章 深入解析 Binder. …

Java面试题【必知必会】Mybatis常见面试题(2024)

近期一直在准备面试&#xff0c;所以为了巩固知识&#xff0c;也为了梳理&#xff0c;整理了一些java的基础面试题&#xff01;同时也希望各位英雄和女侠能够补充&#xff01;不胜荣幸&#xff01;&#xff01;&#xff01; 名称地址Java面试题【必知必会】基础&#xff08;202…