第108讲:Mycat实践指南:枚举分片下的水平分表详解

文章目录

    • 1.枚举分片的概念
    • 2.水平分表枚举分片案例
      • 2.1.准备测试的表结构
      • 2.2.配置Mycat实现枚举分片的水平分表
        • 2.2.1.配置Schema配置文件
        • 2.2.2.配置Rule分片规则配置文件
        • 2.2.3.配置Server配置文件
        • 2.2.4.重启Mycat
      • 2.3.写入数据观察水平分表效果

1.枚举分片的概念

枚举分片是根据表中的某个字段,配置可能出现的枚举值,被选中进行枚举分片的字段,该字段的值必须是可以当做分类的字段值,如果该字段的值在表中是不重复的,那么绝对不能作为枚举分片的字段,比如字段值是类型、状态、省份等等可以作为类别使用的字段,这种字段就适合作为枚举分片依据的字段。

枚举分片举例:

表中有个字段是专门存储省份的,我们要按照省份对表中的数据进行拆分,此时就需要使用到Mycat的枚举分片进行水平分表,省份全中国也才32个,我们就可以这样做:bj=0 sh=1,意思就是说如果省份字段的值为bj,那么就划分到第一个分片节点上,如果字段值为sh,就划分到第二个分片节点上。

2.水平分表枚举分片案例

需求:有一张用户信息表,该表的数据量庞大,在表中有字段记录了用户所在的省份,我们希望按照身份对这张表进行拆分,例如北京的用户写入到分片1节点的双主双从集群,上海的用户写入到分片2节点的双主双从集群。

下面我们通过枚举分片来实现这个需求。

2.1.准备测试的表结构

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

如果我们先配置了Mycat分片,就可以直接通过Mycat进行创建,无需登录到各个分片节点的集群里创建表了,会自动在分片节点中创建,但是目前我们还没有配置Mycat,所以我们直接登录到各个分片节点创建表。

这次我们直接在Mycat中创建这些表。

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

#在分片1节点中创建表结构
[root@mysql-1 ~]# mysql -uroot -p123456 -P3306 -h 192.168.20.11 -e "use db_2; create table table_mjfp (id int,name varchar(10),province varchar(10));"#在分片2节点中创建表结构
[root@mysql-1 ~]# mysql -uroot -p123456 -P3307 -h 192.168.20.11 -e "use db_2; create table table_mjfp (id int,name varchar(10),province varchar(10));"

image-20220714165957282

2.2.配置Mycat实现枚举分片的水平分表

2.2.1.配置Schema配置文件
[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"><!--枚举分片--><table name="table_mjfp" dataNode="dn1,dn2" rule="sharding-by-intfile-mjfp"/></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.2.2.配置Rule分片规则配置文件

在Rule分片规则配置文件中,默认情况下一种类型分片只有一组分片规则,如果一个库中有多张表都需要枚举分片,势必要声明多个规则,不同的表引用不同的规则,接下来我们自定义一个分片规则。

[root@mysql-1 ~]# vim /data/mycat/conf/rule.xml <!--定义分片规则--><tableRule name="sharding-by-intfile-mjfp"><rule><!--进行枚举分片的字段--><columns>province</columns><!--进行枚举分片的函数-->><algorithm>hash-int-mjfp</algorithm></rule></tableRule><!--枚举分片所对应的函数名称和调用类  这个函数名称要和tableRule中的algorithm字段对应上--><function name="hash-int-mjfp"class="io.mycat.route.function.PartitionByFileMap"><!--默认分片节点 当枚举字段的值不满足我们声明(值对应的关联分片节点时) 就将该条数据写入到默认的分片节点中 如果没有分片节点 当写入数据的枚举值字段值不满足分片对应关系时 数据将无法写入--><property name="defaultNode">0</property><!--枚举字段值的类型 0为Integer 1为String  如果我们的枚举字段值的类型是字符串需要声明type为1 如果字段值为数字则声明type为0 否则写入数据时会报错--><property name="type">1</property>        <!--将可能出现的枚举字段值与分片节点ID进行绑定 并且这些参数传入到函数中 实现枚举分片--><property name="mapFile">partition-hash-int.txt</property></function>

枚举分片使用时,需要先定义一个配置文件,在配置文件中声明枚举字段的值对应的分片节点ID,需要实现规划好枚举字段值的所有可能出现的值,避免有漏掉的字段值,没有在配置文件中定义,导致无法写入数据,当然如果在枚举函数中配置了defaultNode参数,可以避免此问题,当这条数据中的枚举字段值没有在配置文件中指定对应的节点ID,这条数据就被写入到默认的分片节点中。

[root@mysql-1 conf]# vim partition-hash-int.txt
bj=0
sh=1

含义:当枚举字段的值为bj时,该数据写入到分片ID为0的的分片节点,当值为sh时,写入到分片ID为1的分片节点。

2.2.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.2.4.重启Mycat
[root@mysql-1 ~]# mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

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

1)写入人员位于北京的数据

[root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
mysql> use db_2;
mysql> insert into table_mjfp (id,name,province) values (1,'xm','bj');
mysql> insert into table_mjfp (id,name,province) values (2,'hah','bj');
mysql> insert into table_mjfp (id,name,province) values (3,'xixi','bj');

人员的地址为北京(province=bj),枚举字段值为bj,此时会被My成他划分到分片1的节点中存储这些数据。

image-20220715112635776

2)写入人员位于上海的数据

[root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
mysql> use db_2;
mysql> insert into table_mjfp (id,name,province) values (4,'aaa','sh');
mysql> insert into table_mjfp (id,name,province) values (5,'eee','sh');

人员的地址为北京(province=sh),枚举字段值为sh,此时会被Mycat划分到分片2的节点中存储这些数据。

image-20220715112750462

3)写入人员位于天津的数据

[root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
mysql> use db_2;
mysql> insert into table_mjfp (id,name,province) values (6,'qqqq','tj');

前面写入的几条数据的枚举字段值都在枚举函数的配置文件中声明了,本次我们写入的(province=tj)tj并没有在配置文件中声明,由于我们配置了当枚举字段值都不满足配置文件中定义的,就写入到默认的分片1节点中,此时这条数据将被写入到分片1节点中。

image-20220715113017009

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 负载测试工具库之locust使用详解

概要 在当今的互联网时代,负载测试是确保应用程序和网站性能稳定的关键步骤之一。Python Locust是一个强大的开源负载测试工具,它可以模拟大量用户并测量应用程序的性能。本文将提供有关Python Locust的全面指南,包括安装和配置、基本概念、性能测试、任务编写、报告生成以…

龙年新征程!凌恩生物2月客户文章累计IF>300

2024年2月&#xff0c;凌恩生物助力客户发表文章47篇&#xff08;6篇预发表&#xff09;&#xff0c;累计影响因子317.3分&#xff0c;其中包括Advanced Materials、Microbiome、Journal of Hazardous Materials、Small、Molecular Psychiatry、Science of the Total Environme…

MySQL 学习笔记(基础篇 Day3)

「写在前面」 本文为黑马程序员 MySQL 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. MySQL 学习笔记&#xff08;基础篇 Day1&#xff09; 2. MySQL 学习笔记&#xff08…

Elasticsearch 的开源分析可视化工具--Kibana 安装 使用

1、简介 Kibana 是一款 Elasticsearch 的开源分析可视化工具&#xff0c;能够与存储在 Elasticsearch 中的数据进行交互&#xff0c;在开发中能够监控Elasticsearch中的数据&#xff0c;并且能够执行命令操作Elasticsearch中的数据。 2、Kibana 的下载与安装 2.1、Kibana 下载…

NIN网络中的网络

是什么 intro LeNet→AlexNet→VGG→NiN→GoogLeNet→ResNetLeNet→AlexNet→VGG 卷积层模块充分抽取空间特征全连接层输出分类结果AlexNet & VGG 改进在于把两个模块加宽 、加深&#xff08;加宽指增加通道数&#xff0c;那加深呢&#xff1f;&#xff08;层数增加叭 Ni…

【linux】02 :Linux基础命令

1.掌握linux系统的目录结构 linux只有一个顶级目录&#xff0c;称之为&#xff1a;根目录。 windows系统有多个顶级目录&#xff0c;即各个盘符。 2.linux路径的描述方式 /在Linux中的表示&#xff1a;出现在开头表示根目录&#xff0c;出现在后面表示层级关系。 3.什么是命…

【linux进程信号】信号的产生

【Linux进程信号】信号的产生 目录 【Linux进程信号】信号的产生信号概念生活中的信号技术应用角度的信号注意信号概念用kill -l命令可以察看系统定义的信号列表信号处理常见方式概览 产生信号通过终端按键产生信号调用系统函数向进程发信号由软件条件产生信号由硬件异常产生信…

DEYO: DETR with YOLO for End-to-End Object Detection论文翻译

DEYO&#xff1a;DETR与YOLO用于端到端目标检测 摘要 DETR的训练范式在很大程度上取决于在ImageNet数据集上预训练其骨干。然而&#xff0c;由图像分类任务和一对一匹配策略提供的有限监督信号导致DETR的预训练不充分的颈部。此外&#xff0c;在训练的早期阶段匹配的不稳定性会…

python螺旋数字矩阵

python螺旋数字矩阵 给出数字个数n (0<n ≤999)和行数m (0<m ≤ 999)。从左上角的1开始&#xff0c;按照顺时针螺旋向内写方式&#xff0c;输出1-n&#xff0c;依次写出2,3.….&#xff0c;最终形成一个m行的矩阵。 1.每行数字的个数一样多 2.列的数量尽可能少 3.填充数字…

大数据 - Spark系列《十二》- 名词术语理解

Spark系列文章&#xff1a; 大数据 - Spark系列《一》- 从Hadoop到Spark&#xff1a;大数据计算引擎的演进-CSDN博客 大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置-CSDN博客 大数据 - Spark系列《三》- 加载各种数据源创建RDD-CSDN博客 大数据 - Spark系列《…

Elasticsearch 通过索引阻塞实现数据保护深入解析

Elasticsearch 是一种强大的搜索和分析引擎&#xff0c;被广泛用于各种应用中&#xff0c;以其强大的全文搜索能力而著称。 不过&#xff0c;在日常管理 Elasticsearch 时&#xff0c;我们经常需要对索引进行保护&#xff0c;以防止数据被意外修改或删除&#xff0c;特别是在进…

python coding with ChatGPT 打卡第22天| 二叉搜索树的操作:插入、删除、修剪、转换

相关推荐 python coding with ChatGPT 打卡第12天| 二叉树&#xff1a;理论基础 python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历 python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历 python coding with ChatGPT 打卡第15天| 二叉树&#xff1a;翻转…